From win-pv-devel-bounces@lists.xenproject.org Thu Oct 01 15:19:37 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 01 Oct 2015 15:19: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 1Zhfdw-0000iQ-4A; Thu, 01 Oct 2015 15:19:36 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=70958bba8=Paul.Durrant@citrix.com>)
	id 1Zhfdu-0000iB-UM
	for win-pv-devel@lists.xenproject.org; Thu, 01 Oct 2015 15:19:35 +0000
Received: from [193.109.254.147] by server-12.bemta-14.messagelabs.com id
	FC/B0-18744-60F4D065; Thu, 01 Oct 2015 15:19:34 +0000
X-Env-Sender: prvs=70958bba8=Paul.Durrant@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1443712773!28237459!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 19523 invoked from network); 1 Oct 2015 15:19:33 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Oct 2015 15:19:33 -0000
X-IronPort-AV: E=Sophos;i="5.17,618,1437436800"; 
   d="scan'208";a="4278094"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: new xenvif tag
Thread-Index: AdD8XGgZDXDUSj9/Sx2CNod09HQKug==
Date: Thu, 1 Oct 2015 15:19:33 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F5E36D6@AMSPEX01CL01.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] new xenvif tag
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,

After testing the backports of a couple of bugfixes into the staging-8.1 branch, I've now tagged the tip of that branch as 8.1.0-rc3.

  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 Thu Oct 01 15:19:37 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 01 Oct 2015 15:19: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 1Zhfdw-0000iQ-4A; Thu, 01 Oct 2015 15:19:36 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=70958bba8=Paul.Durrant@citrix.com>)
	id 1Zhfdu-0000iB-UM
	for win-pv-devel@lists.xenproject.org; Thu, 01 Oct 2015 15:19:35 +0000
Received: from [193.109.254.147] by server-12.bemta-14.messagelabs.com id
	FC/B0-18744-60F4D065; Thu, 01 Oct 2015 15:19:34 +0000
X-Env-Sender: prvs=70958bba8=Paul.Durrant@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1443712773!28237459!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 19523 invoked from network); 1 Oct 2015 15:19:33 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Oct 2015 15:19:33 -0000
X-IronPort-AV: E=Sophos;i="5.17,618,1437436800"; 
   d="scan'208";a="4278094"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: new xenvif tag
Thread-Index: AdD8XGgZDXDUSj9/Sx2CNod09HQKug==
Date: Thu, 1 Oct 2015 15:19:33 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F5E36D6@AMSPEX01CL01.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] new xenvif tag
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,

After testing the backports of a couple of bugfixes into the staging-8.1 branch, I've now tagged the tip of that branch as 8.1.0-rc3.

  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 Oct 07 04:47:55 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 07 Oct 2015 04:47: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 1Zjgds-0007S8-QP; Wed, 07 Oct 2015 04:47:52 +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 1Zjgdr-0007S3-EO
	for win-pv-devel@lists.xenproject.org; Wed, 07 Oct 2015 04:47:51 +0000
Received: from [85.158.137.68] by server-1.bemta-3.messagelabs.com id
	CA/92-01421-6F3A4165; Wed, 07 Oct 2015 04:47:50 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1444193269!18963077!1
X-Originating-IP: [66.111.4.28]
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 2335 invoked from network); 7 Oct 2015 04:47:50 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-3.tower-31.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Oct 2015 04:47:50 -0000
Received: from compute5.internal (compute5.nyi.internal [10.202.2.45])
	by mailout.nyi.internal (Postfix) with ESMTP id 2452F20871
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:47:49 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute5.internal (MEProxy); Wed, 07 Oct 2015 00:47:49 -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=JhPC5Je13aMyZt2dE7S82h52lHw=; b=TEaW6Z
	3ckc0B39DuLagSANk0h805EpZXiJOUryvsx5h6Tm5wlURZ9rWGyTURRlnkB5NXA6
	SbzEOQjj0FilzVAcHh0S4pS8AB+9QZL1bIsYKtvb684kTdEAHG81cak7+3UTG3QY
	QM7fz8YGqBvTgQDWdoZY9FvOcZ/to6jm7arRU=
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=JhPC5Je13aMyZt2dE7S82h52lHw=; b=KXdeI
	4mv3U+Q1t5o/vhZtl/JXVQkZQw3A7bXzTsXzUuWZzxdO42FfsTyRPLMgT91Tc+Du
	A9DSvqbtYn7G3F5Cy13MUxijUp/Q/R0nJxfrub/sfBheJmhmDfrOB0SziSRIPLuR
	0JZCWfnNKKVZPUUqjQcU/eDn2kRAYqLrDQfUEs=
X-Sasl-enc: G/GT0ihP7Kanpgj0d1YIqBimiOBik2BjPTq/2398adDl 1444193268
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id A16F9680159
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:47:48 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <5614A3F7.10809@invisiblethingslab.com>
Date: Wed, 7 Oct 2015 06:47:51 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Content-Length: 1844
Subject: [win-pv-devel] [PATCH 0/5] Add new IOCTLs to XENIFACE
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

VGhpcyBwYXRjaCBzZXJpZXMgaW1wbGVtZW50cyBuZXcgSU9DVExzIG5lZWRlZCBmb3IgbGlidmNo
YW4uIFVzZXIgbW9kZQpjb2RlIHdpbGwgY29tZSBuZXh0LiBTb21lIG5vdGVzOgoKLSBBbGwgbmV3
IElPQ1RMcyBoYXZlIHRoZWlyIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBmb3JtYXQgZGVmaW5lZCBh
cwpzdHJ1Y3RzLiBJIGtlcHQgdGhlbSBzZXBhcmF0ZSBmb3IgYWxsIElPQ1RMcyBldmVuIGlmIHRo
ZSBjb250ZW50cyBpcyB0aGUKc2FtZS4gTm90IHN1cmUgaWYgdGhhdCdzIG5lZWRlZCBidXQgSSBm
ZWVsIGl0J3MgYSBnb29kIGlkZWEgLS0gaWYgb25lCklPQ1RMIGNoYW5nZXMgaXRzIGRhdGEgZm9y
bWF0LCBvdGhlcnMgd29uJ3QgYmUgYWZmZWN0ZWQuCgotIEdyYW50L21hcCBJT0NUTHMgYXJlIHBl
bmRlZCBmb3JldmVyLCBhIHNlcGFyYXRlIElPQ1RMIGlzIHVzZWQgdG8gZ2V0CnRoZWlyIGFjdHVh
bCByZXN1bHQuIFVubWFwcGluZyBtZW1vcnkgZnJvbSB1c2VyIG1vZGUgbmVlZHMgdG8gYmUgZG9u
ZQpiZWxvdyBESVNQQVRDSF9MRVZFTCBhbmQgaW4gY29udGV4dCBvZiB0aGUgc2FtZSBwcm9jZXNz
LCBidXQgY2FuY2VsCnJvdXRpbmVzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBlaXRoZXIuIFRl
c3RzIHNob3dlZCB0aGF0IHRoZXkgd2VyZQphbHdheXMgY2FsbGVkIGF0IEFQQ19MRVZFTCBhbmQg
aW4gdGhlIGNvcnJlY3QgY29udGV4dCwgYnV0IHRvIGJlIHNhZmUgSQpxdWV1ZSBhIHdvcmsgaXRl
bSB0byBleGVjdXRlIGF0IFBBU1NJVkUgYW5kIHVzZSBLZVN0YWNrQXR0YWNoUHJvY2VzcyB0bwpj
aGFuZ2UgdGhlIGFkZHJlc3Mgc3BhY2UuCgotIElzIHRoZXJlIGEgcGFydGljdWxhciByZWFzb24g
Zm9yIGhlYWRlciBmaWxlcyBub3QgYmVpbmcgaW5jbHVkZWQgaW4gVlMKcHJvamVjdHM/IFRoYXQg
d291bGQgaGVscCB3aXRoIG5hdmlnYXRpbmcgdGhlIGNvZGUuCgotIEkgb25seSB1cGRhdGVkIHRo
ZSBWUzIwMTMgcHJvamVjdCwgZG9uJ3QgaGF2ZSBWUzIwMTIgYXQgaGFuZCBidXQgaXQncwpwcm9i
YWJseSBlYXN5IHRvIGRvIGJ5IGhhbmQuCgotIEZlZWwgZnJlZSB0byBjaGFuZ2UgbmFtZXMvZm9y
bWF0dGluZyBpZi93aGVyZSBuZWVkZWQgOikKCi0tIApSYWZhxYIgV29qZHnFgmEKUXViZXMgVG9v
bHMgZm9yIFdpbmRvd3MgZGV2ZWxvcGVyCmh0dHBzOi8vd3d3LnF1YmVzLW9zLm9yZy8KCl9fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCndpbi1wdi1kZXZlbCBt
YWlsaW5nIGxpc3QKd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHA6Ly9saXN0
cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmluL21haWxtYW4vbGlzdGluZm8vd2luLXB2LWRldmVs

From win-pv-devel-bounces@lists.xenproject.org Wed Oct 07 04:47:55 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 07 Oct 2015 04:47: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 1Zjgds-0007S8-QP; Wed, 07 Oct 2015 04:47:52 +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 1Zjgdr-0007S3-EO
	for win-pv-devel@lists.xenproject.org; Wed, 07 Oct 2015 04:47:51 +0000
Received: from [85.158.137.68] by server-1.bemta-3.messagelabs.com id
	CA/92-01421-6F3A4165; Wed, 07 Oct 2015 04:47:50 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1444193269!18963077!1
X-Originating-IP: [66.111.4.28]
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 2335 invoked from network); 7 Oct 2015 04:47:50 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-3.tower-31.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Oct 2015 04:47:50 -0000
Received: from compute5.internal (compute5.nyi.internal [10.202.2.45])
	by mailout.nyi.internal (Postfix) with ESMTP id 2452F20871
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:47:49 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute5.internal (MEProxy); Wed, 07 Oct 2015 00:47:49 -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=JhPC5Je13aMyZt2dE7S82h52lHw=; b=TEaW6Z
	3ckc0B39DuLagSANk0h805EpZXiJOUryvsx5h6Tm5wlURZ9rWGyTURRlnkB5NXA6
	SbzEOQjj0FilzVAcHh0S4pS8AB+9QZL1bIsYKtvb684kTdEAHG81cak7+3UTG3QY
	QM7fz8YGqBvTgQDWdoZY9FvOcZ/to6jm7arRU=
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=JhPC5Je13aMyZt2dE7S82h52lHw=; b=KXdeI
	4mv3U+Q1t5o/vhZtl/JXVQkZQw3A7bXzTsXzUuWZzxdO42FfsTyRPLMgT91Tc+Du
	A9DSvqbtYn7G3F5Cy13MUxijUp/Q/R0nJxfrub/sfBheJmhmDfrOB0SziSRIPLuR
	0JZCWfnNKKVZPUUqjQcU/eDn2kRAYqLrDQfUEs=
X-Sasl-enc: G/GT0ihP7Kanpgj0d1YIqBimiOBik2BjPTq/2398adDl 1444193268
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id A16F9680159
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:47:48 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <5614A3F7.10809@invisiblethingslab.com>
Date: Wed, 7 Oct 2015 06:47:51 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Content-Length: 1844
Subject: [win-pv-devel] [PATCH 0/5] Add new IOCTLs to XENIFACE
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

VGhpcyBwYXRjaCBzZXJpZXMgaW1wbGVtZW50cyBuZXcgSU9DVExzIG5lZWRlZCBmb3IgbGlidmNo
YW4uIFVzZXIgbW9kZQpjb2RlIHdpbGwgY29tZSBuZXh0LiBTb21lIG5vdGVzOgoKLSBBbGwgbmV3
IElPQ1RMcyBoYXZlIHRoZWlyIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBmb3JtYXQgZGVmaW5lZCBh
cwpzdHJ1Y3RzLiBJIGtlcHQgdGhlbSBzZXBhcmF0ZSBmb3IgYWxsIElPQ1RMcyBldmVuIGlmIHRo
ZSBjb250ZW50cyBpcyB0aGUKc2FtZS4gTm90IHN1cmUgaWYgdGhhdCdzIG5lZWRlZCBidXQgSSBm
ZWVsIGl0J3MgYSBnb29kIGlkZWEgLS0gaWYgb25lCklPQ1RMIGNoYW5nZXMgaXRzIGRhdGEgZm9y
bWF0LCBvdGhlcnMgd29uJ3QgYmUgYWZmZWN0ZWQuCgotIEdyYW50L21hcCBJT0NUTHMgYXJlIHBl
bmRlZCBmb3JldmVyLCBhIHNlcGFyYXRlIElPQ1RMIGlzIHVzZWQgdG8gZ2V0CnRoZWlyIGFjdHVh
bCByZXN1bHQuIFVubWFwcGluZyBtZW1vcnkgZnJvbSB1c2VyIG1vZGUgbmVlZHMgdG8gYmUgZG9u
ZQpiZWxvdyBESVNQQVRDSF9MRVZFTCBhbmQgaW4gY29udGV4dCBvZiB0aGUgc2FtZSBwcm9jZXNz
LCBidXQgY2FuY2VsCnJvdXRpbmVzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBlaXRoZXIuIFRl
c3RzIHNob3dlZCB0aGF0IHRoZXkgd2VyZQphbHdheXMgY2FsbGVkIGF0IEFQQ19MRVZFTCBhbmQg
aW4gdGhlIGNvcnJlY3QgY29udGV4dCwgYnV0IHRvIGJlIHNhZmUgSQpxdWV1ZSBhIHdvcmsgaXRl
bSB0byBleGVjdXRlIGF0IFBBU1NJVkUgYW5kIHVzZSBLZVN0YWNrQXR0YWNoUHJvY2VzcyB0bwpj
aGFuZ2UgdGhlIGFkZHJlc3Mgc3BhY2UuCgotIElzIHRoZXJlIGEgcGFydGljdWxhciByZWFzb24g
Zm9yIGhlYWRlciBmaWxlcyBub3QgYmVpbmcgaW5jbHVkZWQgaW4gVlMKcHJvamVjdHM/IFRoYXQg
d291bGQgaGVscCB3aXRoIG5hdmlnYXRpbmcgdGhlIGNvZGUuCgotIEkgb25seSB1cGRhdGVkIHRo
ZSBWUzIwMTMgcHJvamVjdCwgZG9uJ3QgaGF2ZSBWUzIwMTIgYXQgaGFuZCBidXQgaXQncwpwcm9i
YWJseSBlYXN5IHRvIGRvIGJ5IGhhbmQuCgotIEZlZWwgZnJlZSB0byBjaGFuZ2UgbmFtZXMvZm9y
bWF0dGluZyBpZi93aGVyZSBuZWVkZWQgOikKCi0tIApSYWZhxYIgV29qZHnFgmEKUXViZXMgVG9v
bHMgZm9yIFdpbmRvd3MgZGV2ZWxvcGVyCmh0dHBzOi8vd3d3LnF1YmVzLW9zLm9yZy8KCl9fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCndpbi1wdi1kZXZlbCBt
YWlsaW5nIGxpc3QKd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHA6Ly9saXN0
cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmluL21haWxtYW4vbGlzdGluZm8vd2luLXB2LWRldmVs

From win-pv-devel-bounces@lists.xenproject.org Wed Oct 07 04:48:12 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 07 Oct 2015 04:48: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 1ZjgeB-0007Sn-Sm; Wed, 07 Oct 2015 04:48:11 +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 1Zjge9-0007Sg-Mr
	for win-pv-devel@lists.xenproject.org; Wed, 07 Oct 2015 04:48:09 +0000
Received: from [193.109.254.147] by server-7.bemta-14.messagelabs.com id
	50/75-28221-904A4165; Wed, 07 Oct 2015 04:48:09 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1444193286!56389479!1
X-Originating-IP: [66.111.4.28]
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 16484 invoked from network); 7 Oct 2015 04:48:06 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-12.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Oct 2015 04:48:06 -0000
Received: from compute5.internal (compute5.nyi.internal [10.202.2.45])
	by mailout.nyi.internal (Postfix) with ESMTP id 323F5203B1
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:48:06 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute5.internal (MEProxy); Wed, 07 Oct 2015 00:48:06 -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=mrxtJhbBa4tBIUcejuB1RIJ8rLE=; b=mRMBst
	/NC2jVszZAOG/XEbFhhV1ETUA0i4VVOKrK5BX+JsLWqgyl4ghJX/+7UNyArwUnF4
	fvadM9a1ngGUX/oLv9Vi6kIubsKHR6kQ9POS26EjNY30gPvvwr3qak3+AgUOLWM0
	jcXpYTvgvfqqNiY/DtTD84MdmyeYvZ7sHvL24=
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=mrxtJhbBa4tBIUcejuB1RIJ8rLE=; b=cBREa
	1aw8P/WOZiB/eikGZnLUMjElGOBZxWbr4/zFk13Va2COHUgQP8EpTS1rZV3vm8lc
	8J7O++MSP8nS+q9mB9ha3OFq5q8hPOuTt7ZhVWlGyT+7756XyrE/n3LUiLS6fRh8
	00SSVlnAdmQWeoFXZYtXdFR5NFot+r6CM3T95M=
X-Sasl-enc: SL8omQorABLiXHJIedORuYJKcxvzMaqhk4kYN4eYQGSh 1444193285
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 4783668023B
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:48:05 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <5614A408.6030102@invisiblethingslab.com>
Date: Wed, 7 Oct 2015 06:48:08 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 1/5] Update XENBUS interface headers
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

Also add headers needed for next patches in the series.

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 include/cache_interface.h  | 233 ++++++++++++++++++++++++++++++++
 include/evtchn_interface.h | 325 +++++++++++++++++++++++++++++++++++++++++++++
 include/gnttab_interface.h | 249 ++++++++++++++++++++++++++++++++++
 include/store_interface.h  |  68 +++++++++-
 4 files changed, 871 insertions(+), 4 deletions(-)
 create mode 100644 include/cache_interface.h
 create mode 100644 include/evtchn_interface.h
 create mode 100644 include/gnttab_interface.h

diff --git a/include/cache_interface.h b/include/cache_interface.h
new file mode 100644
index 0000000..dae3ac6
--- /dev/null
+++ b/include/cache_interface.h
@@ -0,0 +1,233 @@
+/* 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 cache_interface.h
+    \brief XENBUS CACHE Interface
+
+    This interface provides access to XENBUS's object cache
+    implementation.
+*/
+
+#ifndef _XENBUS_CACHE_INTERFACE_H
+#define _XENBUS_CACHE_INTERFACE_H
+
+#ifndef _WINDLL
+
+/*! \typedef XENBUS_CACHE
+    \brief Cache handle
+*/
+typedef struct _XENBUS_CACHE    XENBUS_CACHE, *PXENBUS_CACHE;
+
+/*! \typedef XENBUS_CACHE_ACQUIRE
+    \brief Acquire a reference to the CACHE interface
+
+    \param Interface The interface header
+*/  
+typedef NTSTATUS
+(*XENBUS_CACHE_ACQUIRE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_CACHE_RELEASE
+    \brief Release a reference to the CACHE interface
+
+    \param Interface The interface header
+*/  
+typedef VOID
+(*XENBUS_CACHE_RELEASE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_CACHE_CTOR
+    \brief Object creator callback
+
+    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
+    \param Object Newly allocated object
+
+    This callback is invoked just after a new object is allocated and may
+    be used to initialize any object data prior to its insertion into the
+    cache.
+*/
+typedef NTSTATUS
+(*XENBUS_CACHE_CTOR)(
+    IN  PVOID   Argument,
+    IN  PVOID   Object
+    );
+
+/*! \typedef XENBUS_CACHE_DTOR
+    \brief Object destructor callback
+
+    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
+    \param Object Object about to be freed
+
+    This callback is invoked just after an object is removed from the
+    cache and before it is freed and may be used to tear down any object data.
+*/
+typedef VOID
+(*XENBUS_CACHE_DTOR)(
+    IN  PVOID   Argument,
+    IN  PVOID   Object
+    );
+
+/*! \typedef XENBUS_CACHE_ACQUIRE_LOCK
+    \brief Cache lock callback
+
+    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
+
+    This callback is invoked if the cache implementation requires mutual
+    exclusion.
+*/
+typedef VOID
+(*XENBUS_CACHE_ACQUIRE_LOCK)(
+    IN  PVOID   Argument
+    );
+
+/*! \typedef XENBUS_CACHE_RELEASE_LOCK
+    \brief Cache unlock callback
+
+    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
+
+    This callback is invoked to release the mutual exclusion lock acquired
+    by a previous invocation of \a XENBUS_CACHE_ACQUIRE_LOCK.
+*/
+typedef VOID
+(*XENBUS_CACHE_RELEASE_LOCK)(
+    IN  PVOID   Argument
+    );
+
+/*! \typedef XENBUS_CACHE_CREATE
+    \brief Create a cache of objects of the given \a Size
+
+    \param Interface The interface header
+    \param Name A name for the cache which will be used in debug output
+    \param Size The size of each object in bytes
+    \param Reservation The target minimum population of the cache
+    \param Ctor A callback which is invoked when a new object created
+    \param Dtor A callback which is invoked when an object is destroyed
+    \param AcquireLock A callback invoked to acquire a spinlock
+    \param ReleaseLock A callback invoked to release the spinlock
+    \param Argument An optional context argument passed to the callbacks
+    \param Cache A pointer to a cache handle to be initialized
+
+    If a non-zero \a Reservation is specified then this method will fail
+    unless that number of objects can be immediately created.
+*/  
+typedef NTSTATUS
+(*XENBUS_CACHE_CREATE)(
+    IN  PINTERFACE                  Interface,
+    IN  const CHAR                  *Name,
+    IN  ULONG                       Size,
+    IN  ULONG                       Reservation,
+    IN  XENBUS_CACHE_CTOR           Ctor,
+    IN  XENBUS_CACHE_DTOR           Dtor,
+    IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
+    IN  XENBUS_CACHE_RELEASE_LOCK   ReleaseLock,
+    IN  PVOID                       Argument OPTIONAL,
+    OUT PXENBUS_CACHE               *Cache
+    );
+
+/*! \typedef XENBUS_CACHE_GET
+    \brief Get an object from a \a Cache
+
+    \param Interface The interface header
+    \param Cache The cache handle
+    \param Locked If mutually exclusive access to the cache is already
+    guaranteed then set this to TRUE
+*/
+typedef PVOID
+(*XENBUS_CACHE_GET)(
+    IN  PINTERFACE      Interface,
+    IN  PXENBUS_CACHE   Cache,
+    IN  BOOLEAN         Locked
+    );
+
+/*! \typedef XENBUS_CACHE_PUT
+    \brief Return an object to a \a Cache
+
+    \param Interface The interface header
+    \param Cache The cache handle
+    \param Locked If mutually exclusive access to the cache is already
+    guaranteed then set this to TRUE
+*/
+typedef VOID
+(*XENBUS_CACHE_PUT)(
+    IN  PINTERFACE      Interface,
+    IN  PXENBUS_CACHE   Cache,
+    IN  PVOID           Object,
+    IN  BOOLEAN         Locked
+    );
+
+/*! \typedef XENBUS_CACHE_DESTROY
+    \brief Destroy a \a Cache
+
+    \param Interface The interface header
+    \param Cache The cache handle
+
+    All objects must have been returned to the cache prior to destruction
+*/
+typedef VOID
+(*XENBUS_CACHE_DESTROY)(
+    IN  PINTERFACE      Interface,
+    IN  PXENBUS_CACHE   Cache
+    );
+
+// {A98DFD78-416A-4949-92A5-E084F2F4B44E}
+DEFINE_GUID(GUID_XENBUS_CACHE_INTERFACE, 
+0xa98dfd78, 0x416a, 0x4949, 0x92, 0xa5, 0xe0, 0x84, 0xf2, 0xf4, 0xb4, 0x4e);
+
+/*! \struct _XENBUS_CACHE_INTERFACE_V1
+    \brief CACHE interface version 1
+    \ingroup interfaces
+*/
+struct _XENBUS_CACHE_INTERFACE_V1 {
+    INTERFACE               Interface;
+    XENBUS_CACHE_ACQUIRE    CacheAcquire;
+    XENBUS_CACHE_RELEASE    CacheRelease;
+    XENBUS_CACHE_CREATE     CacheCreate;
+    XENBUS_CACHE_GET        CacheGet;
+    XENBUS_CACHE_PUT        CachePut;
+    XENBUS_CACHE_DESTROY    CacheDestroy;
+};
+
+typedef struct _XENBUS_CACHE_INTERFACE_V1 XENBUS_CACHE_INTERFACE, *PXENBUS_CACHE_INTERFACE;
+
+/*! \def XENBUS_CACHE
+    \brief Macro at assist in method invocation
+*/
+#define XENBUS_CACHE(_Method, _Interface, ...)    \
+    (_Interface)->Cache ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+
+#endif  // _WINDLL
+
+#define XENBUS_CACHE_INTERFACE_VERSION_MIN  1
+#define XENBUS_CACHE_INTERFACE_VERSION_MAX  1
+
+#endif  // _XENBUS_CACHE_INTERFACE_H
diff --git a/include/evtchn_interface.h b/include/evtchn_interface.h
new file mode 100644
index 0000000..c63f063
--- /dev/null
+++ b/include/evtchn_interface.h
@@ -0,0 +1,325 @@
+/* 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 evtchn_interface.h
+    \brief XENBUS EVTCHN Interface
+
+    This interface provides access to hypervisor event channels
+*/
+
+#ifndef _XENBUS_EVTCHN_INTERFACE_H
+#define _XENBUS_EVTCHN_INTERFACE_H
+
+#ifndef _WINDLL
+
+/*! \enum _XENBUS_EVTCHN_TYPE
+    \brief Event channel type to be opened
+*/
+typedef enum _XENBUS_EVTCHN_TYPE {
+    XENBUS_EVTCHN_TYPE_INVALID = 0,
+    XENBUS_EVTCHN_TYPE_FIXED,           /*!< Fixed */
+    XENBUS_EVTCHN_TYPE_UNBOUND,         /*!< Unbound */
+    XENBUS_EVTCHN_TYPE_INTER_DOMAIN,    /*!< Interdomain */
+    XENBUS_EVTCHN_TYPE_VIRQ             /*!< VIRQ */
+} XENBUS_EVTCHN_TYPE, *PXENBUS_EVTCHN_TYPE;
+
+/*! \typedef XENBUS_EVTCHN_CHANNEL
+    \brief Event channel handle
+*/
+typedef struct _XENBUS_EVTCHN_CHANNEL XENBUS_EVTCHN_CHANNEL, *PXENBUS_EVTCHN_CHANNEL;
+
+/*! \typedef XENBUS_EVTCHN_ACQUIRE
+    \brief Acquire a reference to the EVTCHN interface
+
+    \param Interface The interface header
+*/
+typedef NTSTATUS
+(*XENBUS_EVTCHN_ACQUIRE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_EVTCHN_RELEASE
+    \brief Release a reference to the EVTCHN interface
+
+    \param Interface The interface header
+*/
+typedef VOID
+(*XENBUS_EVTCHN_RELEASE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_EVTCHN_OPEN
+    \brief Open an event channel
+
+    \param Interface The interface header
+    \param Type The type of event channel to open
+    \param Function The callback function
+    \param Argument An optional context argument passed to the callback
+    \param ... Additional parameters required by \a Type
+
+    \b Fixed:
+    \param LocalPort The local port number of the (already bound) channel
+    \param Mask Set to TRUE if the channel should be automatically masked before invoking the callback
+
+    \b Unbound:
+    \param RemoteDomain The domid of the remote domain which will bind the channel
+    \param Mask Set to TRUE if the channel should be automatically masked before invoking the callback
+
+    \b Interdomain:
+    \param RemoteDomain The domid of the remote domain which has already bound the channel
+    \param RemotePort The port number bound to the channel in the remote domain
+    \param Mask Set to TRUE if the channel should be automatically masked before invoking the callback
+
+    \b VIRQ:
+    \param Index The index number of the VIRQ
+
+    \return Event channel handle
+*/
+typedef PXENBUS_EVTCHN_CHANNEL
+(*XENBUS_EVTCHN_OPEN)(
+    IN  PINTERFACE          Interface,
+    IN  XENBUS_EVTCHN_TYPE  Type,
+    IN  PKSERVICE_ROUTINE   Function,
+    IN  PVOID               Argument OPTIONAL,
+    ...
+    );
+
+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 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  USHORT                  Group,
+    IN  UCHAR                   Number
+    );
+
+typedef BOOLEAN
+(*XENBUS_EVTCHN_UNMASK_V1)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
+    IN  BOOLEAN                 InCallback
+    );
+
+/*! \typedef XENBUS_EVTCHN_UNMASK
+    \brief Unmask an event channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+    \param InCallback Set to TRUE if this method is invoked in context of the channel callback
+*/
+typedef VOID
+(*XENBUS_EVTCHN_UNMASK)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
+    IN  BOOLEAN                 InCallback
+    );
+
+/*! \typedef XENBUS_EVTCHN_SEND
+    \brief Send an event to the remote end of the channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+*/
+typedef VOID
+(*XENBUS_EVTCHN_SEND)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel
+    );
+
+/*! \typedef XENBUS_EVTCHN_TRIGGER
+    \brief Send an event to the local end of the channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+*/
+typedef VOID
+(*XENBUS_EVTCHN_TRIGGER)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel
+    );
+
+/*! \typedef XENBUS_EVTCHN_WAIT
+    \brief Wait for an event to the local end of the channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+    \param Timeout An optional timeout value (similar to KeWaitForSingleObject(), but non-zero values are allowed at DISPATCH_LEVEL).
+*/
+typedef NTSTATUS
+(*XENBUS_EVTCHN_WAIT)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
+    IN  PLARGE_INTEGER          Timeout OPTIONAL
+    );
+
+/*! \typedef XENBUS_EVTCHN_GET_PORT
+    \brief Get the local port number bound to the channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+    \return The port number
+*/
+typedef ULONG
+(*XENBUS_EVTCHN_GET_PORT)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel
+    );
+
+/*! \typedef XENBUS_EVTCHN_CLOSE
+    \brief Close an event channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+*/
+typedef VOID
+(*XENBUS_EVTCHN_CLOSE)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel
+    );
+
+// {BE2440AC-1098-4150-AF4D-452FADCEF923}
+DEFINE_GUID(GUID_XENBUS_EVTCHN_INTERFACE,
+0xbe2440ac, 0x1098, 0x4150, 0xaf, 0x4d, 0x45, 0x2f, 0xad, 0xce, 0xf9, 0x23);
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V1
+    \brief EVTCHN interface version 1
+    \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V1 {
+    INTERFACE               Interface;
+    XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
+    XENBUS_EVTCHN_RELEASE   EvtchnRelease;
+    XENBUS_EVTCHN_OPEN      EvtchnOpen;
+    XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
+    XENBUS_EVTCHN_SEND      EvtchnSend;
+    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
+    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
+    XENBUS_EVTCHN_CLOSE     EvtchnClose;
+};
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V2
+    \brief EVTCHN interface version 2
+    \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V2 {
+    INTERFACE               Interface;
+    XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
+    XENBUS_EVTCHN_RELEASE   EvtchnRelease;
+    XENBUS_EVTCHN_OPEN      EvtchnOpen;
+    XENBUS_EVTCHN_BIND_V2   EvtchnBindVersion2;
+    XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
+    XENBUS_EVTCHN_SEND      EvtchnSend;
+    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
+    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
+    XENBUS_EVTCHN_CLOSE     EvtchnClose;
+};
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V3
+    \brief EVTCHN interface version 3
+    \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V3 {
+    INTERFACE               Interface;
+    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;
+    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
+    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
+    XENBUS_EVTCHN_CLOSE     EvtchnClose;
+};
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V5
+    \brief EVTCHN interface version 5
+    \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V5 {
+    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;
+    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
+    XENBUS_EVTCHN_WAIT      EvtchnWait;
+    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
+    XENBUS_EVTCHN_CLOSE     EvtchnClose;
+};
+
+typedef struct _XENBUS_EVTCHN_INTERFACE_V5 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
+
+/*! \def XENBUS_EVTCHN
+    \brief Macro at assist in method invocation
+*/
+#define XENBUS_EVTCHN(_Method, _Interface, ...)    \
+    (_Interface)->Evtchn ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+
+#endif  // _WINDLL
+
+#define XENBUS_EVTCHN_INTERFACE_VERSION_MIN 1
+#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 5
+
+#endif  // _XENBUS_EVTCHN_INTERFACE_H
+
diff --git a/include/gnttab_interface.h b/include/gnttab_interface.h
new file mode 100644
index 0000000..b0f4adf
--- /dev/null
+++ b/include/gnttab_interface.h
@@ -0,0 +1,249 @@
+/* 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 gnttab_interface.h
+    \brief XENBUS GNTTAB Interface
+
+    This interface provides access to the hypervisor grant table
+*/
+
+#ifndef _XENBUS_GNTTAB_INTERFACE_H
+#define _XENBUS_GNTTAB_INTERFACE_H
+
+#include <cache_interface.h>
+
+#ifndef _WINDLL
+
+/*! \typedef XENBUS_GNTTAB_ENTRY
+    \brief Grant table entry handle
+*/
+typedef struct _XENBUS_GNTTAB_ENTRY XENBUS_GNTTAB_ENTRY, *PXENBUS_GNTTAB_ENTRY;
+
+/*! \typedef XENBUS_GNTTAB_CACHE
+    \brief Grant table cache handle
+*/
+typedef struct _XENBUS_GNTTAB_CACHE XENBUS_GNTTAB_CACHE, *PXENBUS_GNTTAB_CACHE;
+
+/*! \typedef XENBUS_GNTTAB_ACQUIRE
+    \brief Acquire a reference to the GNTTAB interface
+
+    \param Interface The interface header
+*/  
+typedef NTSTATUS
+(*XENBUS_GNTTAB_ACQUIRE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_GNTTAB_RELEASE
+    \brief Release a reference to the GNTTAB interface
+
+    \param Interface The interface header
+*/  
+typedef VOID
+(*XENBUS_GNTTAB_RELEASE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_GNTTAB_CREATE_CACHE
+    \brief Create a cache of grant table entries
+
+    \param Interface The interface header
+    \param Name A name for the cache which will be used in debug output
+    \param Reservation The target minimum population of the cache
+    \param AcquireLock A callback invoked to acquire a spinlock
+    \param ReleaseLock A callback invoked to release the spinlock
+    \param Argument An optional context argument passed to the callbacks
+    \param Cache A pointer to a grant table cache handle to be initialized
+*/  
+typedef NTSTATUS
+(*XENBUS_GNTTAB_CREATE_CACHE)(
+    IN  PINTERFACE                  Interface,
+    IN  const CHAR                  *Name,
+    IN  ULONG                       Reservation,
+    IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
+    IN  XENBUS_CACHE_RELEASE_LOCK   ReleaseLock,
+    IN  PVOID                       Argument OPTIONAL,
+    OUT PXENBUS_GNTTAB_CACHE        *Cache
+    );
+
+/*! \typedef XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS
+    \brief Get a table entry from the \a Cache permitting access to a given \a Pfn
+
+    \param Interface The interface header
+    \param Cache The grant table cache handle
+    \param Locked If mutually exclusive access to the cache is already
+    guaranteed then set this to TRUE
+    \param Domain The domid of the domain being granted access
+    \param Pfn The frame number of the page that we are granting access to
+    \param ReadOnly Set to TRUE if the foreign domain is only being granted
+    read access
+    \param Entry A pointer to a grant table entry handle to be initialized
+*/
+typedef NTSTATUS
+(*XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS)(
+    IN  PINTERFACE                  Interface,
+    IN  PXENBUS_GNTTAB_CACHE        Cache,
+    IN  BOOLEAN                     Locked,
+    IN  USHORT                      Domain,
+    IN  PFN_NUMBER                  Pfn,
+    IN  BOOLEAN                     ReadOnly,
+    OUT PXENBUS_GNTTAB_ENTRY        *Entry
+    );
+
+/*! \typedef XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS
+    \brief Revoke foreign access and return the \a Entry to the \a Cache
+
+    \param Interface The interface header
+    \param Cache The grant table cache handle
+    \param Locked If mutually exclusive access to the cache is already
+    guaranteed then set this to TRUE
+    \param Entry The grant table entry handle
+*/
+typedef NTSTATUS
+(*XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS)(
+    IN  PINTERFACE                  Interface,
+    IN  PXENBUS_GNTTAB_CACHE        Cache,
+    IN  BOOLEAN                     Locked,
+    IN  PXENBUS_GNTTAB_ENTRY        Entry
+    );
+
+/*! \typedef XENBUS_GNTTAB_GET_REFERENCE
+    \brief Get the reference number of the entry
+
+    \param Interface The interface header
+    \param Entry The grant table entry handle
+    \return The reference number
+*/  
+typedef ULONG
+(*XENBUS_GNTTAB_GET_REFERENCE)(
+    IN  PINTERFACE                  Interface,
+    IN  PXENBUS_GNTTAB_ENTRY        Entry
+    );
+
+/*! \typedef XENBUS_GNTTAB_DESTROY_CACHE
+    \brief Destroy a cache of grant table entries
+
+    \param Interface The interface header
+    \param Cache The grant table cache handle
+
+    All grant table entries must have been revoked prior to destruction
+    of the cache 
+*/  
+typedef VOID
+(*XENBUS_GNTTAB_DESTROY_CACHE)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_GNTTAB_CACHE    Cache
+    );
+
+/*! \typedef XENBUS_GNTTAB_MAP_FOREIGN_PAGES
+    \brief Map foreign memory pages into the system address space
+
+    \param Interface The interface header
+    \param Domain The domid of the foreign domain that granted the pages
+    \param NumberPages Number of pages to map
+    \param References Array of grant reference numbers shared by the foreign domain
+    \param ReadOnly If TRUE, pages are mapped with read-only access
+    \param Address The physical address that the foreign pages are mapped under
+*/
+
+typedef NTSTATUS
+(*XENBUS_GNTTAB_MAP_FOREIGN_PAGES)(
+    IN  PINTERFACE              Interface,
+    IN  USHORT                  Domain,
+    IN  ULONG                   NumberPages,
+    IN  PULONG                  References,
+    IN  BOOLEAN                 ReadOnly,
+    OUT PHYSICAL_ADDRESS        *Address
+    );
+
+/*! \typedef XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES
+    \brief Unmap foreign memory pages from the system address space
+
+    \param Interface The interface header
+    \param Address The physical address that the foreign pages are mapped under
+*/
+typedef NTSTATUS
+(*XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES)(
+    IN  PINTERFACE              Interface,
+    IN  PHYSICAL_ADDRESS        Address
+    );
+
+// {763679C5-E5C2-4A6D-8B88-6BB02EC42D8E}
+DEFINE_GUID(GUID_XENBUS_GNTTAB_INTERFACE, 
+0x763679c5, 0xe5c2, 0x4a6d, 0x8b, 0x88, 0x6b, 0xb0, 0x2e, 0xc4, 0x2d, 0x8e);
+
+/*! \struct _XENBUS_GNTTAB_INTERFACE_V1
+    \brief GNTTAB interface version 1
+    \ingroup interfaces
+*/
+struct _XENBUS_GNTTAB_INTERFACE_V1 {
+    INTERFACE                           Interface;
+    XENBUS_GNTTAB_ACQUIRE               GnttabAcquire;
+    XENBUS_GNTTAB_RELEASE               GnttabRelease;
+    XENBUS_GNTTAB_CREATE_CACHE          GnttabCreateCache;
+    XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS GnttabPermitForeignAccess;
+    XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS GnttabRevokeForeignAccess;
+    XENBUS_GNTTAB_GET_REFERENCE         GnttabGetReference;
+    XENBUS_GNTTAB_DESTROY_CACHE         GnttabDestroyCache;
+};
+
+/*! \struct _XENBUS_GNTTAB_INTERFACE_V2
+    \brief GNTTAB interface version 2
+    \ingroup interfaces
+*/
+struct _XENBUS_GNTTAB_INTERFACE_V2 {
+    INTERFACE                           Interface;
+    XENBUS_GNTTAB_ACQUIRE               GnttabAcquire;
+    XENBUS_GNTTAB_RELEASE               GnttabRelease;
+    XENBUS_GNTTAB_CREATE_CACHE          GnttabCreateCache;
+    XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS GnttabPermitForeignAccess;
+    XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS GnttabRevokeForeignAccess;
+    XENBUS_GNTTAB_GET_REFERENCE         GnttabGetReference;
+    XENBUS_GNTTAB_DESTROY_CACHE         GnttabDestroyCache;
+    XENBUS_GNTTAB_MAP_FOREIGN_PAGES     GnttabMapForeignPages;
+    XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES   GnttabUnmapForeignPages;
+};
+
+typedef struct _XENBUS_GNTTAB_INTERFACE_V2 XENBUS_GNTTAB_INTERFACE, *PXENBUS_GNTTAB_INTERFACE;
+
+/*! \def XENBUS_GNTTAB
+    \brief Macro at assist in method invocation
+*/
+#define XENBUS_GNTTAB(_Method, _Interface, ...)    \
+    (_Interface)->Gnttab ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+
+#endif  // _WINDLL
+
+#define XENBUS_GNTTAB_INTERFACE_VERSION_MIN 1
+#define XENBUS_GNTTAB_INTERFACE_VERSION_MAX 2
+
+#endif  // _XENBUS_GNTTAB_INTERFACE_H
+
diff --git a/include/store_interface.h b/include/store_interface.h
index 5bcbba3..52f1a1d 100644
--- a/include/store_interface.h
+++ b/include/store_interface.h
@@ -50,6 +50,23 @@ typedef struct _XENBUS_STORE_TRANSACTION    XENBUS_STORE_TRANSACTION, *PXENBUS_S
 */
 typedef struct _XENBUS_STORE_WATCH          XENBUS_STORE_WATCH, *PXENBUS_STORE_WATCH;
 
+/*! \typedef XENBUS_STORE_PERMISSION_MASK
+    \brief Bitmask of XenStore key permissions
+*/
+typedef enum _XENBUS_STORE_PERMISSION_MASK {
+    XENBUS_STORE_PERM_NONE = 0,
+    XENBUS_STORE_PERM_READ = 1,
+    XENBUS_STORE_PERM_WRITE = 2,
+} XENBUS_STORE_PERMISSION_MASK;
+
+/*! \typedef XENBUS_STORE_PERMISSION
+    \brief XenStore key permissions entry for a single domain
+*/
+typedef struct _XENBUS_STORE_PERMISSION {
+    USHORT                          Domain;
+    XENBUS_STORE_PERMISSION_MASK    Mask;
+} XENBUS_STORE_PERMISSION, *PXENBUS_STORE_PERMISSION;
+
 /*! \typedef XENBUS_STORE_ACQUIRE
     \brief Acquire a reference to the STORE interface
 
@@ -247,10 +264,36 @@ typedef VOID
     IN  PINTERFACE  Interface
     );
 
+/*! \typedef XENBUS_STORE_PERMISSIONS_SET
+    \brief Set permissions for a XenStore key
+
+    \param Interface The interface header
+    \param Transaction The transaction handle (NULL if this is not
+    part of a transaction)
+    \param Prefix An optional prefix for the \a Node
+    \param Node The concatenation of the \a Prefix and this value specifies
+    the XenStore key to set permissions of
+    \param Permissions An array of permissions to set
+    \param NumberPermissions Number of elements in the \a Permissions array
+*/
+typedef NTSTATUS
+(*XENBUS_STORE_PERMISSIONS_SET)(
+    IN  PINTERFACE                  Interface,
+    IN  PXENBUS_STORE_TRANSACTION   Transaction OPTIONAL,
+    IN  PCHAR                       Prefix OPTIONAL,
+    IN  PCHAR                       Node,
+    IN  PXENBUS_STORE_PERMISSION    Permissions,
+    IN  ULONG                       NumberPermissions
+    );
+
 // {86824C3B-D34E-4753-B281-2F1E3AD214D7}
 DEFINE_GUID(GUID_XENBUS_STORE_INTERFACE, 
 0x86824c3b, 0xd34e, 0x4753, 0xb2, 0x81, 0x2f, 0x1e, 0x3a, 0xd2, 0x14, 0xd7);
 
+/*! \struct _XENBUS_STORE_INTERFACE_V1
+    \brief STORE interface version 1
+    \ingroup interfaces
+*/
 struct _XENBUS_STORE_INTERFACE_V1 {
     INTERFACE                       Interface;
     XENBUS_STORE_ACQUIRE            StoreAcquire;
@@ -267,11 +310,28 @@ struct _XENBUS_STORE_INTERFACE_V1 {
     XENBUS_STORE_POLL               StorePoll;
 };
 
-/*! \struct _XENBUS_STORE_INTERFACE_V1
-    \brief STORE interface version 1
+/*! \struct _XENBUS_STORE_INTERFACE_V2
+    \brief STORE interface version 2
     \ingroup interfaces
 */
-typedef struct _XENBUS_STORE_INTERFACE_V1 XENBUS_STORE_INTERFACE, *PXENBUS_STORE_INTERFACE;
+struct _XENBUS_STORE_INTERFACE_V2 {
+    INTERFACE                       Interface;
+    XENBUS_STORE_ACQUIRE            StoreAcquire;
+    XENBUS_STORE_RELEASE            StoreRelease;
+    XENBUS_STORE_FREE               StoreFree;
+    XENBUS_STORE_READ               StoreRead;
+    XENBUS_STORE_PRINTF             StorePrintf;
+    XENBUS_STORE_PERMISSIONS_SET    StorePermissionsSet;
+    XENBUS_STORE_REMOVE             StoreRemove;
+    XENBUS_STORE_DIRECTORY          StoreDirectory;
+    XENBUS_STORE_TRANSACTION_START  StoreTransactionStart;
+    XENBUS_STORE_TRANSACTION_END    StoreTransactionEnd;
+    XENBUS_STORE_WATCH_ADD          StoreWatchAdd;
+    XENBUS_STORE_WATCH_REMOVE       StoreWatchRemove;
+    XENBUS_STORE_POLL               StorePoll;
+};
+
+typedef struct _XENBUS_STORE_INTERFACE_V2 XENBUS_STORE_INTERFACE, *PXENBUS_STORE_INTERFACE;
 
 /*! \def XENBUS_STORE
     \brief Macro at assist in method invocation
@@ -282,7 +342,7 @@ typedef struct _XENBUS_STORE_INTERFACE_V1 XENBUS_STORE_INTERFACE, *PXENBUS_STORE
 #endif  // _WINDLL
 
 #define XENBUS_STORE_INTERFACE_VERSION_MIN  1
-#define XENBUS_STORE_INTERFACE_VERSION_MAX  1
+#define XENBUS_STORE_INTERFACE_VERSION_MAX  2
 
 #endif  // _XENBUS_STORE_INTERFACE_H
 
-- 
1.8.1.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 Wed Oct 07 04:48:12 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 07 Oct 2015 04:48: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 1ZjgeB-0007Sn-Sm; Wed, 07 Oct 2015 04:48:11 +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 1Zjge9-0007Sg-Mr
	for win-pv-devel@lists.xenproject.org; Wed, 07 Oct 2015 04:48:09 +0000
Received: from [193.109.254.147] by server-7.bemta-14.messagelabs.com id
	50/75-28221-904A4165; Wed, 07 Oct 2015 04:48:09 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1444193286!56389479!1
X-Originating-IP: [66.111.4.28]
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 16484 invoked from network); 7 Oct 2015 04:48:06 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-12.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Oct 2015 04:48:06 -0000
Received: from compute5.internal (compute5.nyi.internal [10.202.2.45])
	by mailout.nyi.internal (Postfix) with ESMTP id 323F5203B1
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:48:06 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute5.internal (MEProxy); Wed, 07 Oct 2015 00:48:06 -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=mrxtJhbBa4tBIUcejuB1RIJ8rLE=; b=mRMBst
	/NC2jVszZAOG/XEbFhhV1ETUA0i4VVOKrK5BX+JsLWqgyl4ghJX/+7UNyArwUnF4
	fvadM9a1ngGUX/oLv9Vi6kIubsKHR6kQ9POS26EjNY30gPvvwr3qak3+AgUOLWM0
	jcXpYTvgvfqqNiY/DtTD84MdmyeYvZ7sHvL24=
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=mrxtJhbBa4tBIUcejuB1RIJ8rLE=; b=cBREa
	1aw8P/WOZiB/eikGZnLUMjElGOBZxWbr4/zFk13Va2COHUgQP8EpTS1rZV3vm8lc
	8J7O++MSP8nS+q9mB9ha3OFq5q8hPOuTt7ZhVWlGyT+7756XyrE/n3LUiLS6fRh8
	00SSVlnAdmQWeoFXZYtXdFR5NFot+r6CM3T95M=
X-Sasl-enc: SL8omQorABLiXHJIedORuYJKcxvzMaqhk4kYN4eYQGSh 1444193285
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 4783668023B
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:48:05 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <5614A408.6030102@invisiblethingslab.com>
Date: Wed, 7 Oct 2015 06:48:08 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 1/5] Update XENBUS interface headers
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

Also add headers needed for next patches in the series.

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 include/cache_interface.h  | 233 ++++++++++++++++++++++++++++++++
 include/evtchn_interface.h | 325 +++++++++++++++++++++++++++++++++++++++++++++
 include/gnttab_interface.h | 249 ++++++++++++++++++++++++++++++++++
 include/store_interface.h  |  68 +++++++++-
 4 files changed, 871 insertions(+), 4 deletions(-)
 create mode 100644 include/cache_interface.h
 create mode 100644 include/evtchn_interface.h
 create mode 100644 include/gnttab_interface.h

diff --git a/include/cache_interface.h b/include/cache_interface.h
new file mode 100644
index 0000000..dae3ac6
--- /dev/null
+++ b/include/cache_interface.h
@@ -0,0 +1,233 @@
+/* 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 cache_interface.h
+    \brief XENBUS CACHE Interface
+
+    This interface provides access to XENBUS's object cache
+    implementation.
+*/
+
+#ifndef _XENBUS_CACHE_INTERFACE_H
+#define _XENBUS_CACHE_INTERFACE_H
+
+#ifndef _WINDLL
+
+/*! \typedef XENBUS_CACHE
+    \brief Cache handle
+*/
+typedef struct _XENBUS_CACHE    XENBUS_CACHE, *PXENBUS_CACHE;
+
+/*! \typedef XENBUS_CACHE_ACQUIRE
+    \brief Acquire a reference to the CACHE interface
+
+    \param Interface The interface header
+*/  
+typedef NTSTATUS
+(*XENBUS_CACHE_ACQUIRE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_CACHE_RELEASE
+    \brief Release a reference to the CACHE interface
+
+    \param Interface The interface header
+*/  
+typedef VOID
+(*XENBUS_CACHE_RELEASE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_CACHE_CTOR
+    \brief Object creator callback
+
+    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
+    \param Object Newly allocated object
+
+    This callback is invoked just after a new object is allocated and may
+    be used to initialize any object data prior to its insertion into the
+    cache.
+*/
+typedef NTSTATUS
+(*XENBUS_CACHE_CTOR)(
+    IN  PVOID   Argument,
+    IN  PVOID   Object
+    );
+
+/*! \typedef XENBUS_CACHE_DTOR
+    \brief Object destructor callback
+
+    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
+    \param Object Object about to be freed
+
+    This callback is invoked just after an object is removed from the
+    cache and before it is freed and may be used to tear down any object data.
+*/
+typedef VOID
+(*XENBUS_CACHE_DTOR)(
+    IN  PVOID   Argument,
+    IN  PVOID   Object
+    );
+
+/*! \typedef XENBUS_CACHE_ACQUIRE_LOCK
+    \brief Cache lock callback
+
+    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
+
+    This callback is invoked if the cache implementation requires mutual
+    exclusion.
+*/
+typedef VOID
+(*XENBUS_CACHE_ACQUIRE_LOCK)(
+    IN  PVOID   Argument
+    );
+
+/*! \typedef XENBUS_CACHE_RELEASE_LOCK
+    \brief Cache unlock callback
+
+    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
+
+    This callback is invoked to release the mutual exclusion lock acquired
+    by a previous invocation of \a XENBUS_CACHE_ACQUIRE_LOCK.
+*/
+typedef VOID
+(*XENBUS_CACHE_RELEASE_LOCK)(
+    IN  PVOID   Argument
+    );
+
+/*! \typedef XENBUS_CACHE_CREATE
+    \brief Create a cache of objects of the given \a Size
+
+    \param Interface The interface header
+    \param Name A name for the cache which will be used in debug output
+    \param Size The size of each object in bytes
+    \param Reservation The target minimum population of the cache
+    \param Ctor A callback which is invoked when a new object created
+    \param Dtor A callback which is invoked when an object is destroyed
+    \param AcquireLock A callback invoked to acquire a spinlock
+    \param ReleaseLock A callback invoked to release the spinlock
+    \param Argument An optional context argument passed to the callbacks
+    \param Cache A pointer to a cache handle to be initialized
+
+    If a non-zero \a Reservation is specified then this method will fail
+    unless that number of objects can be immediately created.
+*/  
+typedef NTSTATUS
+(*XENBUS_CACHE_CREATE)(
+    IN  PINTERFACE                  Interface,
+    IN  const CHAR                  *Name,
+    IN  ULONG                       Size,
+    IN  ULONG                       Reservation,
+    IN  XENBUS_CACHE_CTOR           Ctor,
+    IN  XENBUS_CACHE_DTOR           Dtor,
+    IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
+    IN  XENBUS_CACHE_RELEASE_LOCK   ReleaseLock,
+    IN  PVOID                       Argument OPTIONAL,
+    OUT PXENBUS_CACHE               *Cache
+    );
+
+/*! \typedef XENBUS_CACHE_GET
+    \brief Get an object from a \a Cache
+
+    \param Interface The interface header
+    \param Cache The cache handle
+    \param Locked If mutually exclusive access to the cache is already
+    guaranteed then set this to TRUE
+*/
+typedef PVOID
+(*XENBUS_CACHE_GET)(
+    IN  PINTERFACE      Interface,
+    IN  PXENBUS_CACHE   Cache,
+    IN  BOOLEAN         Locked
+    );
+
+/*! \typedef XENBUS_CACHE_PUT
+    \brief Return an object to a \a Cache
+
+    \param Interface The interface header
+    \param Cache The cache handle
+    \param Locked If mutually exclusive access to the cache is already
+    guaranteed then set this to TRUE
+*/
+typedef VOID
+(*XENBUS_CACHE_PUT)(
+    IN  PINTERFACE      Interface,
+    IN  PXENBUS_CACHE   Cache,
+    IN  PVOID           Object,
+    IN  BOOLEAN         Locked
+    );
+
+/*! \typedef XENBUS_CACHE_DESTROY
+    \brief Destroy a \a Cache
+
+    \param Interface The interface header
+    \param Cache The cache handle
+
+    All objects must have been returned to the cache prior to destruction
+*/
+typedef VOID
+(*XENBUS_CACHE_DESTROY)(
+    IN  PINTERFACE      Interface,
+    IN  PXENBUS_CACHE   Cache
+    );
+
+// {A98DFD78-416A-4949-92A5-E084F2F4B44E}
+DEFINE_GUID(GUID_XENBUS_CACHE_INTERFACE, 
+0xa98dfd78, 0x416a, 0x4949, 0x92, 0xa5, 0xe0, 0x84, 0xf2, 0xf4, 0xb4, 0x4e);
+
+/*! \struct _XENBUS_CACHE_INTERFACE_V1
+    \brief CACHE interface version 1
+    \ingroup interfaces
+*/
+struct _XENBUS_CACHE_INTERFACE_V1 {
+    INTERFACE               Interface;
+    XENBUS_CACHE_ACQUIRE    CacheAcquire;
+    XENBUS_CACHE_RELEASE    CacheRelease;
+    XENBUS_CACHE_CREATE     CacheCreate;
+    XENBUS_CACHE_GET        CacheGet;
+    XENBUS_CACHE_PUT        CachePut;
+    XENBUS_CACHE_DESTROY    CacheDestroy;
+};
+
+typedef struct _XENBUS_CACHE_INTERFACE_V1 XENBUS_CACHE_INTERFACE, *PXENBUS_CACHE_INTERFACE;
+
+/*! \def XENBUS_CACHE
+    \brief Macro at assist in method invocation
+*/
+#define XENBUS_CACHE(_Method, _Interface, ...)    \
+    (_Interface)->Cache ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+
+#endif  // _WINDLL
+
+#define XENBUS_CACHE_INTERFACE_VERSION_MIN  1
+#define XENBUS_CACHE_INTERFACE_VERSION_MAX  1
+
+#endif  // _XENBUS_CACHE_INTERFACE_H
diff --git a/include/evtchn_interface.h b/include/evtchn_interface.h
new file mode 100644
index 0000000..c63f063
--- /dev/null
+++ b/include/evtchn_interface.h
@@ -0,0 +1,325 @@
+/* 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 evtchn_interface.h
+    \brief XENBUS EVTCHN Interface
+
+    This interface provides access to hypervisor event channels
+*/
+
+#ifndef _XENBUS_EVTCHN_INTERFACE_H
+#define _XENBUS_EVTCHN_INTERFACE_H
+
+#ifndef _WINDLL
+
+/*! \enum _XENBUS_EVTCHN_TYPE
+    \brief Event channel type to be opened
+*/
+typedef enum _XENBUS_EVTCHN_TYPE {
+    XENBUS_EVTCHN_TYPE_INVALID = 0,
+    XENBUS_EVTCHN_TYPE_FIXED,           /*!< Fixed */
+    XENBUS_EVTCHN_TYPE_UNBOUND,         /*!< Unbound */
+    XENBUS_EVTCHN_TYPE_INTER_DOMAIN,    /*!< Interdomain */
+    XENBUS_EVTCHN_TYPE_VIRQ             /*!< VIRQ */
+} XENBUS_EVTCHN_TYPE, *PXENBUS_EVTCHN_TYPE;
+
+/*! \typedef XENBUS_EVTCHN_CHANNEL
+    \brief Event channel handle
+*/
+typedef struct _XENBUS_EVTCHN_CHANNEL XENBUS_EVTCHN_CHANNEL, *PXENBUS_EVTCHN_CHANNEL;
+
+/*! \typedef XENBUS_EVTCHN_ACQUIRE
+    \brief Acquire a reference to the EVTCHN interface
+
+    \param Interface The interface header
+*/
+typedef NTSTATUS
+(*XENBUS_EVTCHN_ACQUIRE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_EVTCHN_RELEASE
+    \brief Release a reference to the EVTCHN interface
+
+    \param Interface The interface header
+*/
+typedef VOID
+(*XENBUS_EVTCHN_RELEASE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_EVTCHN_OPEN
+    \brief Open an event channel
+
+    \param Interface The interface header
+    \param Type The type of event channel to open
+    \param Function The callback function
+    \param Argument An optional context argument passed to the callback
+    \param ... Additional parameters required by \a Type
+
+    \b Fixed:
+    \param LocalPort The local port number of the (already bound) channel
+    \param Mask Set to TRUE if the channel should be automatically masked before invoking the callback
+
+    \b Unbound:
+    \param RemoteDomain The domid of the remote domain which will bind the channel
+    \param Mask Set to TRUE if the channel should be automatically masked before invoking the callback
+
+    \b Interdomain:
+    \param RemoteDomain The domid of the remote domain which has already bound the channel
+    \param RemotePort The port number bound to the channel in the remote domain
+    \param Mask Set to TRUE if the channel should be automatically masked before invoking the callback
+
+    \b VIRQ:
+    \param Index The index number of the VIRQ
+
+    \return Event channel handle
+*/
+typedef PXENBUS_EVTCHN_CHANNEL
+(*XENBUS_EVTCHN_OPEN)(
+    IN  PINTERFACE          Interface,
+    IN  XENBUS_EVTCHN_TYPE  Type,
+    IN  PKSERVICE_ROUTINE   Function,
+    IN  PVOID               Argument OPTIONAL,
+    ...
+    );
+
+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 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  USHORT                  Group,
+    IN  UCHAR                   Number
+    );
+
+typedef BOOLEAN
+(*XENBUS_EVTCHN_UNMASK_V1)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
+    IN  BOOLEAN                 InCallback
+    );
+
+/*! \typedef XENBUS_EVTCHN_UNMASK
+    \brief Unmask an event channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+    \param InCallback Set to TRUE if this method is invoked in context of the channel callback
+*/
+typedef VOID
+(*XENBUS_EVTCHN_UNMASK)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
+    IN  BOOLEAN                 InCallback
+    );
+
+/*! \typedef XENBUS_EVTCHN_SEND
+    \brief Send an event to the remote end of the channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+*/
+typedef VOID
+(*XENBUS_EVTCHN_SEND)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel
+    );
+
+/*! \typedef XENBUS_EVTCHN_TRIGGER
+    \brief Send an event to the local end of the channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+*/
+typedef VOID
+(*XENBUS_EVTCHN_TRIGGER)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel
+    );
+
+/*! \typedef XENBUS_EVTCHN_WAIT
+    \brief Wait for an event to the local end of the channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+    \param Timeout An optional timeout value (similar to KeWaitForSingleObject(), but non-zero values are allowed at DISPATCH_LEVEL).
+*/
+typedef NTSTATUS
+(*XENBUS_EVTCHN_WAIT)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
+    IN  PLARGE_INTEGER          Timeout OPTIONAL
+    );
+
+/*! \typedef XENBUS_EVTCHN_GET_PORT
+    \brief Get the local port number bound to the channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+    \return The port number
+*/
+typedef ULONG
+(*XENBUS_EVTCHN_GET_PORT)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel
+    );
+
+/*! \typedef XENBUS_EVTCHN_CLOSE
+    \brief Close an event channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+*/
+typedef VOID
+(*XENBUS_EVTCHN_CLOSE)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel
+    );
+
+// {BE2440AC-1098-4150-AF4D-452FADCEF923}
+DEFINE_GUID(GUID_XENBUS_EVTCHN_INTERFACE,
+0xbe2440ac, 0x1098, 0x4150, 0xaf, 0x4d, 0x45, 0x2f, 0xad, 0xce, 0xf9, 0x23);
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V1
+    \brief EVTCHN interface version 1
+    \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V1 {
+    INTERFACE               Interface;
+    XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
+    XENBUS_EVTCHN_RELEASE   EvtchnRelease;
+    XENBUS_EVTCHN_OPEN      EvtchnOpen;
+    XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
+    XENBUS_EVTCHN_SEND      EvtchnSend;
+    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
+    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
+    XENBUS_EVTCHN_CLOSE     EvtchnClose;
+};
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V2
+    \brief EVTCHN interface version 2
+    \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V2 {
+    INTERFACE               Interface;
+    XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
+    XENBUS_EVTCHN_RELEASE   EvtchnRelease;
+    XENBUS_EVTCHN_OPEN      EvtchnOpen;
+    XENBUS_EVTCHN_BIND_V2   EvtchnBindVersion2;
+    XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
+    XENBUS_EVTCHN_SEND      EvtchnSend;
+    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
+    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
+    XENBUS_EVTCHN_CLOSE     EvtchnClose;
+};
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V3
+    \brief EVTCHN interface version 3
+    \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V3 {
+    INTERFACE               Interface;
+    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;
+    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
+    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
+    XENBUS_EVTCHN_CLOSE     EvtchnClose;
+};
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V5
+    \brief EVTCHN interface version 5
+    \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V5 {
+    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;
+    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
+    XENBUS_EVTCHN_WAIT      EvtchnWait;
+    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
+    XENBUS_EVTCHN_CLOSE     EvtchnClose;
+};
+
+typedef struct _XENBUS_EVTCHN_INTERFACE_V5 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
+
+/*! \def XENBUS_EVTCHN
+    \brief Macro at assist in method invocation
+*/
+#define XENBUS_EVTCHN(_Method, _Interface, ...)    \
+    (_Interface)->Evtchn ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+
+#endif  // _WINDLL
+
+#define XENBUS_EVTCHN_INTERFACE_VERSION_MIN 1
+#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 5
+
+#endif  // _XENBUS_EVTCHN_INTERFACE_H
+
diff --git a/include/gnttab_interface.h b/include/gnttab_interface.h
new file mode 100644
index 0000000..b0f4adf
--- /dev/null
+++ b/include/gnttab_interface.h
@@ -0,0 +1,249 @@
+/* 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 gnttab_interface.h
+    \brief XENBUS GNTTAB Interface
+
+    This interface provides access to the hypervisor grant table
+*/
+
+#ifndef _XENBUS_GNTTAB_INTERFACE_H
+#define _XENBUS_GNTTAB_INTERFACE_H
+
+#include <cache_interface.h>
+
+#ifndef _WINDLL
+
+/*! \typedef XENBUS_GNTTAB_ENTRY
+    \brief Grant table entry handle
+*/
+typedef struct _XENBUS_GNTTAB_ENTRY XENBUS_GNTTAB_ENTRY, *PXENBUS_GNTTAB_ENTRY;
+
+/*! \typedef XENBUS_GNTTAB_CACHE
+    \brief Grant table cache handle
+*/
+typedef struct _XENBUS_GNTTAB_CACHE XENBUS_GNTTAB_CACHE, *PXENBUS_GNTTAB_CACHE;
+
+/*! \typedef XENBUS_GNTTAB_ACQUIRE
+    \brief Acquire a reference to the GNTTAB interface
+
+    \param Interface The interface header
+*/  
+typedef NTSTATUS
+(*XENBUS_GNTTAB_ACQUIRE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_GNTTAB_RELEASE
+    \brief Release a reference to the GNTTAB interface
+
+    \param Interface The interface header
+*/  
+typedef VOID
+(*XENBUS_GNTTAB_RELEASE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_GNTTAB_CREATE_CACHE
+    \brief Create a cache of grant table entries
+
+    \param Interface The interface header
+    \param Name A name for the cache which will be used in debug output
+    \param Reservation The target minimum population of the cache
+    \param AcquireLock A callback invoked to acquire a spinlock
+    \param ReleaseLock A callback invoked to release the spinlock
+    \param Argument An optional context argument passed to the callbacks
+    \param Cache A pointer to a grant table cache handle to be initialized
+*/  
+typedef NTSTATUS
+(*XENBUS_GNTTAB_CREATE_CACHE)(
+    IN  PINTERFACE                  Interface,
+    IN  const CHAR                  *Name,
+    IN  ULONG                       Reservation,
+    IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
+    IN  XENBUS_CACHE_RELEASE_LOCK   ReleaseLock,
+    IN  PVOID                       Argument OPTIONAL,
+    OUT PXENBUS_GNTTAB_CACHE        *Cache
+    );
+
+/*! \typedef XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS
+    \brief Get a table entry from the \a Cache permitting access to a given \a Pfn
+
+    \param Interface The interface header
+    \param Cache The grant table cache handle
+    \param Locked If mutually exclusive access to the cache is already
+    guaranteed then set this to TRUE
+    \param Domain The domid of the domain being granted access
+    \param Pfn The frame number of the page that we are granting access to
+    \param ReadOnly Set to TRUE if the foreign domain is only being granted
+    read access
+    \param Entry A pointer to a grant table entry handle to be initialized
+*/
+typedef NTSTATUS
+(*XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS)(
+    IN  PINTERFACE                  Interface,
+    IN  PXENBUS_GNTTAB_CACHE        Cache,
+    IN  BOOLEAN                     Locked,
+    IN  USHORT                      Domain,
+    IN  PFN_NUMBER                  Pfn,
+    IN  BOOLEAN                     ReadOnly,
+    OUT PXENBUS_GNTTAB_ENTRY        *Entry
+    );
+
+/*! \typedef XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS
+    \brief Revoke foreign access and return the \a Entry to the \a Cache
+
+    \param Interface The interface header
+    \param Cache The grant table cache handle
+    \param Locked If mutually exclusive access to the cache is already
+    guaranteed then set this to TRUE
+    \param Entry The grant table entry handle
+*/
+typedef NTSTATUS
+(*XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS)(
+    IN  PINTERFACE                  Interface,
+    IN  PXENBUS_GNTTAB_CACHE        Cache,
+    IN  BOOLEAN                     Locked,
+    IN  PXENBUS_GNTTAB_ENTRY        Entry
+    );
+
+/*! \typedef XENBUS_GNTTAB_GET_REFERENCE
+    \brief Get the reference number of the entry
+
+    \param Interface The interface header
+    \param Entry The grant table entry handle
+    \return The reference number
+*/  
+typedef ULONG
+(*XENBUS_GNTTAB_GET_REFERENCE)(
+    IN  PINTERFACE                  Interface,
+    IN  PXENBUS_GNTTAB_ENTRY        Entry
+    );
+
+/*! \typedef XENBUS_GNTTAB_DESTROY_CACHE
+    \brief Destroy a cache of grant table entries
+
+    \param Interface The interface header
+    \param Cache The grant table cache handle
+
+    All grant table entries must have been revoked prior to destruction
+    of the cache 
+*/  
+typedef VOID
+(*XENBUS_GNTTAB_DESTROY_CACHE)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_GNTTAB_CACHE    Cache
+    );
+
+/*! \typedef XENBUS_GNTTAB_MAP_FOREIGN_PAGES
+    \brief Map foreign memory pages into the system address space
+
+    \param Interface The interface header
+    \param Domain The domid of the foreign domain that granted the pages
+    \param NumberPages Number of pages to map
+    \param References Array of grant reference numbers shared by the foreign domain
+    \param ReadOnly If TRUE, pages are mapped with read-only access
+    \param Address The physical address that the foreign pages are mapped under
+*/
+
+typedef NTSTATUS
+(*XENBUS_GNTTAB_MAP_FOREIGN_PAGES)(
+    IN  PINTERFACE              Interface,
+    IN  USHORT                  Domain,
+    IN  ULONG                   NumberPages,
+    IN  PULONG                  References,
+    IN  BOOLEAN                 ReadOnly,
+    OUT PHYSICAL_ADDRESS        *Address
+    );
+
+/*! \typedef XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES
+    \brief Unmap foreign memory pages from the system address space
+
+    \param Interface The interface header
+    \param Address The physical address that the foreign pages are mapped under
+*/
+typedef NTSTATUS
+(*XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES)(
+    IN  PINTERFACE              Interface,
+    IN  PHYSICAL_ADDRESS        Address
+    );
+
+// {763679C5-E5C2-4A6D-8B88-6BB02EC42D8E}
+DEFINE_GUID(GUID_XENBUS_GNTTAB_INTERFACE, 
+0x763679c5, 0xe5c2, 0x4a6d, 0x8b, 0x88, 0x6b, 0xb0, 0x2e, 0xc4, 0x2d, 0x8e);
+
+/*! \struct _XENBUS_GNTTAB_INTERFACE_V1
+    \brief GNTTAB interface version 1
+    \ingroup interfaces
+*/
+struct _XENBUS_GNTTAB_INTERFACE_V1 {
+    INTERFACE                           Interface;
+    XENBUS_GNTTAB_ACQUIRE               GnttabAcquire;
+    XENBUS_GNTTAB_RELEASE               GnttabRelease;
+    XENBUS_GNTTAB_CREATE_CACHE          GnttabCreateCache;
+    XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS GnttabPermitForeignAccess;
+    XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS GnttabRevokeForeignAccess;
+    XENBUS_GNTTAB_GET_REFERENCE         GnttabGetReference;
+    XENBUS_GNTTAB_DESTROY_CACHE         GnttabDestroyCache;
+};
+
+/*! \struct _XENBUS_GNTTAB_INTERFACE_V2
+    \brief GNTTAB interface version 2
+    \ingroup interfaces
+*/
+struct _XENBUS_GNTTAB_INTERFACE_V2 {
+    INTERFACE                           Interface;
+    XENBUS_GNTTAB_ACQUIRE               GnttabAcquire;
+    XENBUS_GNTTAB_RELEASE               GnttabRelease;
+    XENBUS_GNTTAB_CREATE_CACHE          GnttabCreateCache;
+    XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS GnttabPermitForeignAccess;
+    XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS GnttabRevokeForeignAccess;
+    XENBUS_GNTTAB_GET_REFERENCE         GnttabGetReference;
+    XENBUS_GNTTAB_DESTROY_CACHE         GnttabDestroyCache;
+    XENBUS_GNTTAB_MAP_FOREIGN_PAGES     GnttabMapForeignPages;
+    XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES   GnttabUnmapForeignPages;
+};
+
+typedef struct _XENBUS_GNTTAB_INTERFACE_V2 XENBUS_GNTTAB_INTERFACE, *PXENBUS_GNTTAB_INTERFACE;
+
+/*! \def XENBUS_GNTTAB
+    \brief Macro at assist in method invocation
+*/
+#define XENBUS_GNTTAB(_Method, _Interface, ...)    \
+    (_Interface)->Gnttab ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+
+#endif  // _WINDLL
+
+#define XENBUS_GNTTAB_INTERFACE_VERSION_MIN 1
+#define XENBUS_GNTTAB_INTERFACE_VERSION_MAX 2
+
+#endif  // _XENBUS_GNTTAB_INTERFACE_H
+
diff --git a/include/store_interface.h b/include/store_interface.h
index 5bcbba3..52f1a1d 100644
--- a/include/store_interface.h
+++ b/include/store_interface.h
@@ -50,6 +50,23 @@ typedef struct _XENBUS_STORE_TRANSACTION    XENBUS_STORE_TRANSACTION, *PXENBUS_S
 */
 typedef struct _XENBUS_STORE_WATCH          XENBUS_STORE_WATCH, *PXENBUS_STORE_WATCH;
 
+/*! \typedef XENBUS_STORE_PERMISSION_MASK
+    \brief Bitmask of XenStore key permissions
+*/
+typedef enum _XENBUS_STORE_PERMISSION_MASK {
+    XENBUS_STORE_PERM_NONE = 0,
+    XENBUS_STORE_PERM_READ = 1,
+    XENBUS_STORE_PERM_WRITE = 2,
+} XENBUS_STORE_PERMISSION_MASK;
+
+/*! \typedef XENBUS_STORE_PERMISSION
+    \brief XenStore key permissions entry for a single domain
+*/
+typedef struct _XENBUS_STORE_PERMISSION {
+    USHORT                          Domain;
+    XENBUS_STORE_PERMISSION_MASK    Mask;
+} XENBUS_STORE_PERMISSION, *PXENBUS_STORE_PERMISSION;
+
 /*! \typedef XENBUS_STORE_ACQUIRE
     \brief Acquire a reference to the STORE interface
 
@@ -247,10 +264,36 @@ typedef VOID
     IN  PINTERFACE  Interface
     );
 
+/*! \typedef XENBUS_STORE_PERMISSIONS_SET
+    \brief Set permissions for a XenStore key
+
+    \param Interface The interface header
+    \param Transaction The transaction handle (NULL if this is not
+    part of a transaction)
+    \param Prefix An optional prefix for the \a Node
+    \param Node The concatenation of the \a Prefix and this value specifies
+    the XenStore key to set permissions of
+    \param Permissions An array of permissions to set
+    \param NumberPermissions Number of elements in the \a Permissions array
+*/
+typedef NTSTATUS
+(*XENBUS_STORE_PERMISSIONS_SET)(
+    IN  PINTERFACE                  Interface,
+    IN  PXENBUS_STORE_TRANSACTION   Transaction OPTIONAL,
+    IN  PCHAR                       Prefix OPTIONAL,
+    IN  PCHAR                       Node,
+    IN  PXENBUS_STORE_PERMISSION    Permissions,
+    IN  ULONG                       NumberPermissions
+    );
+
 // {86824C3B-D34E-4753-B281-2F1E3AD214D7}
 DEFINE_GUID(GUID_XENBUS_STORE_INTERFACE, 
 0x86824c3b, 0xd34e, 0x4753, 0xb2, 0x81, 0x2f, 0x1e, 0x3a, 0xd2, 0x14, 0xd7);
 
+/*! \struct _XENBUS_STORE_INTERFACE_V1
+    \brief STORE interface version 1
+    \ingroup interfaces
+*/
 struct _XENBUS_STORE_INTERFACE_V1 {
     INTERFACE                       Interface;
     XENBUS_STORE_ACQUIRE            StoreAcquire;
@@ -267,11 +310,28 @@ struct _XENBUS_STORE_INTERFACE_V1 {
     XENBUS_STORE_POLL               StorePoll;
 };
 
-/*! \struct _XENBUS_STORE_INTERFACE_V1
-    \brief STORE interface version 1
+/*! \struct _XENBUS_STORE_INTERFACE_V2
+    \brief STORE interface version 2
     \ingroup interfaces
 */
-typedef struct _XENBUS_STORE_INTERFACE_V1 XENBUS_STORE_INTERFACE, *PXENBUS_STORE_INTERFACE;
+struct _XENBUS_STORE_INTERFACE_V2 {
+    INTERFACE                       Interface;
+    XENBUS_STORE_ACQUIRE            StoreAcquire;
+    XENBUS_STORE_RELEASE            StoreRelease;
+    XENBUS_STORE_FREE               StoreFree;
+    XENBUS_STORE_READ               StoreRead;
+    XENBUS_STORE_PRINTF             StorePrintf;
+    XENBUS_STORE_PERMISSIONS_SET    StorePermissionsSet;
+    XENBUS_STORE_REMOVE             StoreRemove;
+    XENBUS_STORE_DIRECTORY          StoreDirectory;
+    XENBUS_STORE_TRANSACTION_START  StoreTransactionStart;
+    XENBUS_STORE_TRANSACTION_END    StoreTransactionEnd;
+    XENBUS_STORE_WATCH_ADD          StoreWatchAdd;
+    XENBUS_STORE_WATCH_REMOVE       StoreWatchRemove;
+    XENBUS_STORE_POLL               StorePoll;
+};
+
+typedef struct _XENBUS_STORE_INTERFACE_V2 XENBUS_STORE_INTERFACE, *PXENBUS_STORE_INTERFACE;
 
 /*! \def XENBUS_STORE
     \brief Macro at assist in method invocation
@@ -282,7 +342,7 @@ typedef struct _XENBUS_STORE_INTERFACE_V1 XENBUS_STORE_INTERFACE, *PXENBUS_STORE
 #endif  // _WINDLL
 
 #define XENBUS_STORE_INTERFACE_VERSION_MIN  1
-#define XENBUS_STORE_INTERFACE_VERSION_MAX  1
+#define XENBUS_STORE_INTERFACE_VERSION_MAX  2
 
 #endif  // _XENBUS_STORE_INTERFACE_H
 
-- 
1.8.1.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 Wed Oct 07 04:48:29 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 07 Oct 2015 04:48:29 +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 1ZjgeT-0007TY-04; Wed, 07 Oct 2015 04:48:29 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1ZjgeR-0007TT-26
	for win-pv-devel@lists.xenproject.org; Wed, 07 Oct 2015 04:48:27 +0000
Received: from [85.158.139.211] by server-17.bemta-5.messagelabs.com id
	DE/73-18107-A14A4165; Wed, 07 Oct 2015 04:48:26 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-8.tower-206.messagelabs.com!1444193305!40416506!1
X-Originating-IP: [66.111.4.28]
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 21157 invoked from network); 7 Oct 2015 04:48:25 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-8.tower-206.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Oct 2015 04:48:25 -0000
Received: from compute3.internal (compute3.nyi.internal [10.202.2.43])
	by mailout.nyi.internal (Postfix) with ESMTP id E05E4202D7
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:48:24 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute3.internal (MEProxy); Wed, 07 Oct 2015 00:48:24 -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=/OfPcLLVmLZwF2oSxSpVMcXKgCo=; b=XDc5AX
	JEuDnZPBotnOu61PZzu3xkq0yMmCVj/Yh1tvy5ckGJKZWxX5bo9RFE591mvmANSb
	ayzr4vJ/97h+PJljHz5TXO+sDy3m6bkZ4gIXJ4UXYOENKCjo5+vLmlKIu8FM9/LB
	2yLZmrX0CWS5C9xEazg7eJsYNgvnfWoWT3cN0=
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=/OfPcLLVmLZwF2oSxSpVMcXKgCo=; b=I4JpR
	Sez1F1NmuKmfk3lkju7+BGXbNNxMwzm6fTz5OuZBxMCMbQVbLyH3r7aHEqvThFzc
	cbLaPApjw44aLqiVWv5krAWz/ZW1T538NC/3wA/m7wMJmZV1Zjz7/LlUvbkyVnJG
	5eJT20WXmn6zX8j+SOhvDajrpU2AUZZC+KSpPU=
X-Sasl-enc: wr6RWObW7ZXFYBPXnre9Ed8i6L1+FfIsglJM2rnhuUB2 1444193304
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 6805F680159
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:48:24 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <5614A41B.5090408@invisiblethingslab.com>
Date: Wed, 7 Oct 2015 06:48:27 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 2/5] Include ntifs.h instead of ntddk.h
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

Gnttab code uses KeStackAttachProcess which is only declared in ntifs.h
(conflicts with ntddk.h).

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 src/xeniface/driver.c | 3 +--
 src/xeniface/driver.h | 2 +-
 src/xeniface/fdo.c    | 2 +-
 src/xeniface/fdo.h    | 2 +-
 src/xeniface/wmi.c    | 3 +--
 src/xeniface/wmi.h    | 2 +-
 6 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/src/xeniface/driver.c b/src/xeniface/driver.c
index 281ebdf..1c84467 100644
--- a/src/xeniface/driver.c
+++ b/src/xeniface/driver.c
@@ -29,8 +29,7 @@
  * SUCH DAMAGE.
  */
 
-#include <ntddk.h>
-//#include <util.h>
+#include <ntifs.h>
 #include <version.h>
 
 #include "fdo.h"
diff --git a/src/xeniface/driver.h b/src/xeniface/driver.h
index 93ac645..00f2d8f 100644
--- a/src/xeniface/driver.h
+++ b/src/xeniface/driver.h
@@ -44,7 +44,7 @@
 #pragma warning(disable:4100 4057)
 
 #include <wmilib.h>
-#include <ntddk.h>
+#include <ntifs.h>
 extern PDRIVER_OBJECT   DriverObject;
 
 
diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index 321bfb3..51bda24 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -30,7 +30,7 @@
  */
 
 
-#include <ntddk.h>
+#include <ntifs.h>
 #include <wdmguid.h>
 #include <ntstrsafe.h>
 #include <stdlib.h>
diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
index 32f6bb1..4416064 100644
--- a/src/xeniface/fdo.h
+++ b/src/xeniface/fdo.h
@@ -32,7 +32,7 @@
 #ifndef _XENIFACE_FDO_H
 #define _XENIFACE_FDO_H
 
-#include <ntddk.h>
+#include <ntifs.h>
 #include <store_interface.h>
 #include <suspend_interface.h>
 #include <shared_info_interface.h>
diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
index 4285ada..1bdb834 100644
--- a/src/xeniface/wmi.c
+++ b/src/xeniface/wmi.c
@@ -30,12 +30,11 @@
  */
 
 
-#include <ntddk.h>
+#include <ntifs.h>
 #include <initguid.h>
 #include <wmistr.h>
 #include <wmilib.h>
 #include <stdio.h>
-#include <ntddk.h>
 #include <guiddef.h>
 #define NTSTRSAFE_LIB
 #include<ntstrsafe.h>
diff --git a/src/xeniface/wmi.h b/src/xeniface/wmi.h
index 7fb67ca..ed77af7 100644
--- a/src/xeniface/wmi.h
+++ b/src/xeniface/wmi.h
@@ -33,7 +33,7 @@
 #ifndef _XEVTCHN_WMI_H
 #define _XEVTCHN_WMI_H
 
-#include <ntddk.h>
+#include <ntifs.h>
 #include "driver.h"
 #include "wmi_generated.h"
 
-- 
1.8.1.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 Wed Oct 07 04:48:29 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 07 Oct 2015 04:48:29 +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 1ZjgeT-0007TY-04; Wed, 07 Oct 2015 04:48:29 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1ZjgeR-0007TT-26
	for win-pv-devel@lists.xenproject.org; Wed, 07 Oct 2015 04:48:27 +0000
Received: from [85.158.139.211] by server-17.bemta-5.messagelabs.com id
	DE/73-18107-A14A4165; Wed, 07 Oct 2015 04:48:26 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-8.tower-206.messagelabs.com!1444193305!40416506!1
X-Originating-IP: [66.111.4.28]
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 21157 invoked from network); 7 Oct 2015 04:48:25 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-8.tower-206.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Oct 2015 04:48:25 -0000
Received: from compute3.internal (compute3.nyi.internal [10.202.2.43])
	by mailout.nyi.internal (Postfix) with ESMTP id E05E4202D7
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:48:24 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute3.internal (MEProxy); Wed, 07 Oct 2015 00:48:24 -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=/OfPcLLVmLZwF2oSxSpVMcXKgCo=; b=XDc5AX
	JEuDnZPBotnOu61PZzu3xkq0yMmCVj/Yh1tvy5ckGJKZWxX5bo9RFE591mvmANSb
	ayzr4vJ/97h+PJljHz5TXO+sDy3m6bkZ4gIXJ4UXYOENKCjo5+vLmlKIu8FM9/LB
	2yLZmrX0CWS5C9xEazg7eJsYNgvnfWoWT3cN0=
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=/OfPcLLVmLZwF2oSxSpVMcXKgCo=; b=I4JpR
	Sez1F1NmuKmfk3lkju7+BGXbNNxMwzm6fTz5OuZBxMCMbQVbLyH3r7aHEqvThFzc
	cbLaPApjw44aLqiVWv5krAWz/ZW1T538NC/3wA/m7wMJmZV1Zjz7/LlUvbkyVnJG
	5eJT20WXmn6zX8j+SOhvDajrpU2AUZZC+KSpPU=
X-Sasl-enc: wr6RWObW7ZXFYBPXnre9Ed8i6L1+FfIsglJM2rnhuUB2 1444193304
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 6805F680159
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:48:24 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <5614A41B.5090408@invisiblethingslab.com>
Date: Wed, 7 Oct 2015 06:48:27 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 2/5] Include ntifs.h instead of ntddk.h
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

Gnttab code uses KeStackAttachProcess which is only declared in ntifs.h
(conflicts with ntddk.h).

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 src/xeniface/driver.c | 3 +--
 src/xeniface/driver.h | 2 +-
 src/xeniface/fdo.c    | 2 +-
 src/xeniface/fdo.h    | 2 +-
 src/xeniface/wmi.c    | 3 +--
 src/xeniface/wmi.h    | 2 +-
 6 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/src/xeniface/driver.c b/src/xeniface/driver.c
index 281ebdf..1c84467 100644
--- a/src/xeniface/driver.c
+++ b/src/xeniface/driver.c
@@ -29,8 +29,7 @@
  * SUCH DAMAGE.
  */
 
-#include <ntddk.h>
-//#include <util.h>
+#include <ntifs.h>
 #include <version.h>
 
 #include "fdo.h"
diff --git a/src/xeniface/driver.h b/src/xeniface/driver.h
index 93ac645..00f2d8f 100644
--- a/src/xeniface/driver.h
+++ b/src/xeniface/driver.h
@@ -44,7 +44,7 @@
 #pragma warning(disable:4100 4057)
 
 #include <wmilib.h>
-#include <ntddk.h>
+#include <ntifs.h>
 extern PDRIVER_OBJECT   DriverObject;
 
 
diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index 321bfb3..51bda24 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -30,7 +30,7 @@
  */
 
 
-#include <ntddk.h>
+#include <ntifs.h>
 #include <wdmguid.h>
 #include <ntstrsafe.h>
 #include <stdlib.h>
diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
index 32f6bb1..4416064 100644
--- a/src/xeniface/fdo.h
+++ b/src/xeniface/fdo.h
@@ -32,7 +32,7 @@
 #ifndef _XENIFACE_FDO_H
 #define _XENIFACE_FDO_H
 
-#include <ntddk.h>
+#include <ntifs.h>
 #include <store_interface.h>
 #include <suspend_interface.h>
 #include <shared_info_interface.h>
diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
index 4285ada..1bdb834 100644
--- a/src/xeniface/wmi.c
+++ b/src/xeniface/wmi.c
@@ -30,12 +30,11 @@
  */
 
 
-#include <ntddk.h>
+#include <ntifs.h>
 #include <initguid.h>
 #include <wmistr.h>
 #include <wmilib.h>
 #include <stdio.h>
-#include <ntddk.h>
 #include <guiddef.h>
 #define NTSTRSAFE_LIB
 #include<ntstrsafe.h>
diff --git a/src/xeniface/wmi.h b/src/xeniface/wmi.h
index 7fb67ca..ed77af7 100644
--- a/src/xeniface/wmi.h
+++ b/src/xeniface/wmi.h
@@ -33,7 +33,7 @@
 #ifndef _XEVTCHN_WMI_H
 #define _XEVTCHN_WMI_H
 
-#include <ntddk.h>
+#include <ntifs.h>
 #include "driver.h"
 #include "wmi_generated.h"
 
-- 
1.8.1.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 Wed Oct 07 04:48:42 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 07 Oct 2015 04:48: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 1Zjgeg-0007UE-1l; Wed, 07 Oct 2015 04:48:42 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1Zjged-0007U9-R5
	for win-pv-devel@lists.xenproject.org; Wed, 07 Oct 2015 04:48:40 +0000
Received: from [85.158.139.211] by server-7.bemta-5.messagelabs.com id
	EC/7C-13905-724A4165; Wed, 07 Oct 2015 04:48:39 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-13.tower-206.messagelabs.com!1444193317!40416080!1
X-Originating-IP: [66.111.4.28]
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 4610 invoked from network); 7 Oct 2015 04:48:38 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-13.tower-206.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 7 Oct 2015 04:48:38 -0000
Received: from compute4.internal (compute4.nyi.internal [10.202.2.44])
	by mailout.nyi.internal (Postfix) with ESMTP id 3CA9A20676
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:48:37 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute4.internal (MEProxy); Wed, 07 Oct 2015 00:48:37 -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=Sp24/+zMr3QGJfZz/pOtTPmtFR4=; b=oUZZcY
	I6ml0VOmqdNmV40S6YkxjX1ut+105pGdjKp6dHFouASMuNYpScARRS+kKsmhOH4a
	bN6N617OlD9zQ3UXMyKctltXwMDllnsK6wAFiLaKqFtyTjqCQl8f8VMSMMZQ4rEJ
	zKm/igbPWyw9edSRJhsGDlqouykT/OjCbEuj8=
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=Sp24/+zMr3QGJfZz/pOtTPmtFR4=; b=ZLs32
	RAjs//t67AkdQt8slh1ABHGLVO3dupePMWmpTq/CoUuRjXyJCXGuYxNI0MyJfTfT
	k68/sLXdlMA3OTl7q7lIeNOrwCln2rsfoALG2plE4k9bM/uY0K8M4sY8HZYNK4X/
	iG8KFnknuHtLx7MrRizQHofGmcbMKx3npUfVwU=
X-Sasl-enc: omW4mr5pxZ2QWeus+kch7fNyj3uwNy8vmUvxu8r06D5A 1444193316
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 6B9976800C5
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:48:36 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <5614A427.4090002@invisiblethingslab.com>
Date: Wed, 7 Oct 2015 06:48:39 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 3/5] Define new IOCTLs for user-mode clients
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

IOCTL input is defined as XENIFACE_*_IN structs.
IOCTL output is defined as XENIFACE_*_OUT structs.

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 include/xeniface_ioctls.h | 190 ++++++++++++++++++++++++++++++++++++++++++++++
 src/xeniface/driver.h     |   2 +-
 src/xeniface/ioctls.h     |   2 +
 3 files changed, 193 insertions(+), 1 deletion(-)

diff --git a/include/xeniface_ioctls.h b/include/xeniface_ioctls.h
index 1367f67..c6d9893 100644
--- a/include/xeniface_ioctls.h
+++ b/include/xeniface_ioctls.h
@@ -35,14 +35,204 @@
 DEFINE_GUID(GUID_INTERFACE_XENIFACE, \
     0xb2cfb085, 0xaa5e, 0x47e1, 0x8b, 0xf7, 0x97, 0x93, 0xf3, 0x15, 0x45, 0x65);
 
+/************************************************************************/
+/* store ioctls                                                         */
+/************************************************************************/
+// Define only for user mode clients.
+#ifndef XENIFACE_KERNEL_MODE
+
+typedef enum _XENBUS_STORE_PERMISSION_MASK {
+    XENBUS_STORE_PERM_NONE = 0,
+    XENBUS_STORE_PERM_READ = 1,
+    XENBUS_STORE_PERM_WRITE = 2,
+} XENBUS_STORE_PERMISSION_MASK;
+
+typedef struct _XENBUS_STORE_PERMISSION {
+    USHORT Domain;
+    XENBUS_STORE_PERMISSION_MASK Mask;
+} XENBUS_STORE_PERMISSION, *PXENBUS_STORE_PERMISSION;
+
+#endif
+
+#define XENIFACE_STORE_ALLOWED_PERMISSIONS  (XENBUS_STORE_PERM_NONE | XENBUS_STORE_PERM_READ | XENBUS_STORE_PERM_WRITE)
+
+// TODO: document input/output format of these IOCTLs?
 #define IOCTL_XENIFACE_STORE_READ \
     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
 #define IOCTL_XENIFACE_STORE_WRITE \
     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
 #define IOCTL_XENIFACE_STORE_DIRECTORY \
     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
 #define IOCTL_XENIFACE_STORE_REMOVE \
     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
+#define IOCTL_XENIFACE_STORE_SET_PERMISSIONS \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#pragma warning(push)
+#pragma warning(disable:4200) // nonstandard extension used : zero-sized array in struct/union
+typedef struct _XENIFACE_STORE_SET_PERMISSIONS_IN {
+    PCHAR Path;
+    ULONG PathLength; // number of bytes, including the null terminator
+    ULONG NumberPermissions;
+    XENBUS_STORE_PERMISSION Permissions[0];
+} XENIFACE_STORE_SET_PERMISSIONS_IN, *PXENIFACE_STORE_SET_PERMISSIONS_IN;
+#pragma warning(pop)
+
+#define IOCTL_XENIFACE_STORE_ADD_WATCH \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x805, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_STORE_ADD_WATCH_IN {
+    PCHAR Path;
+    ULONG PathLength; // number of bytes, including the null terminator
+    HANDLE Event;
+} XENIFACE_STORE_ADD_WATCH_IN, *PXENIFACE_STORE_ADD_WATCH_IN;
+
+typedef struct _XENIFACE_STORE_ADD_WATCH_OUT {
+    PVOID Context;
+} XENIFACE_STORE_ADD_WATCH_OUT, *PXENIFACE_STORE_ADD_WATCH_OUT;
+
+#define IOCTL_XENIFACE_STORE_REMOVE_WATCH \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x806, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_STORE_REMOVE_WATCH_IN {
+    PVOID Context;
+} XENIFACE_STORE_REMOVE_WATCH_IN, *PXENIFACE_STORE_REMOVE_WATCH_IN;
+
+/************************************************************************/
+/* evtchn ioctls                                                        */
+/************************************************************************/
+#define IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x810, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN {
+    USHORT RemoteDomain;
+    ULONG RemotePort;
+    BOOLEAN Mask;
+    HANDLE Event;
+} XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN, *PXENIFACE_EVTCHN_BIND_INTERDOMAIN_IN;
+
+typedef struct _XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT {
+    ULONG LocalPort;
+} XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT, *PXENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT;
+
+#define IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x811, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_EVTCHN_BIND_UNBOUND_IN {
+    USHORT RemoteDomain;
+    BOOLEAN Mask;
+    HANDLE Event;
+} XENIFACE_EVTCHN_BIND_UNBOUND_IN, *PXENIFACE_EVTCHN_BIND_UNBOUND_IN;
+
+typedef struct _XENIFACE_EVTCHN_BIND_UNBOUND_OUT {
+    ULONG LocalPort;
+} XENIFACE_EVTCHN_BIND_UNBOUND_OUT, *PXENIFACE_EVTCHN_BIND_UNBOUND_OUT;
+
+#define IOCTL_XENIFACE_EVTCHN_CLOSE \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x812, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_EVTCHN_CLOSE_IN {
+    ULONG LocalPort;
+} XENIFACE_EVTCHN_CLOSE_IN, *PXENIFACE_EVTCHN_CLOSE_IN;
+
+#define IOCTL_XENIFACE_EVTCHN_NOTIFY \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x813, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_EVTCHN_NOTIFY_IN {
+    ULONG LocalPort;
+} XENIFACE_EVTCHN_NOTIFY_IN, *PXENIFACE_EVTCHN_NOTIFY_IN;
+
+#define IOCTL_XENIFACE_EVTCHN_UNMASK \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x814, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_EVTCHN_UNMASK_IN {
+    ULONG LocalPort;
+} XENIFACE_EVTCHN_UNMASK_IN, *PXENIFACE_EVTCHN_UNMASK_IN;
+
+/************************************************************************/
+/* gntmem ioctls                                                        */
+/************************************************************************/
+// This IOCTL is pended forever, use IOCTL_XENIFACE_GNTTAB_GET_GRANT_RESULT
+// to get the result. This IOCTL must be asynchronous.
+#define IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x820, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef enum _XENIFACE_GNTTAB_PAGE_FLAGS {
+    XENIFACE_GNTTAB_READONLY          = 1 << 0,
+    XENIFACE_GNTTAB_USE_NOTIFY_OFFSET = 1 << 1,
+    XENIFACE_GNTTAB_USE_NOTIFY_PORT   = 1 << 2,
+} XENIFACE_GNTTAB_PAGE_FLAGS;
+
+typedef struct _XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN {
+    ULONG RequestId; // should be unique for each request
+    USHORT RemoteDomain;
+    ULONG NumberPages;
+    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
+    ULONG NotifyOffset;
+    ULONG NotifyPort;
+} XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN, *PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN;
+
+#define IOCTL_XENIFACE_GNTTAB_GET_GRANT_RESULT \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x821, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_GNTTAB_GET_GRANT_RESULT_IN {
+    ULONG RequestId;
+} XENIFACE_GNTTAB_GET_GRANT_RESULT_IN, *PXENIFACE_GNTTAB_GET_GRANT_RESULT_IN;
+
+#pragma warning(push)
+#pragma warning(disable:4200) // nonstandard extension used : zero-sized array in struct/union
+typedef struct _XENIFACE_GNTTAB_GET_GRANT_RESULT_OUT {
+    PVOID Address;
+    ULONG References[0];
+} XENIFACE_GNTTAB_GET_GRANT_RESULT_OUT, *PXENIFACE_GNTTAB_GET_GRANT_RESULT_OUT;
+#pragma warning(pop)
+
+#define IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x822, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN {
+    ULONG RequestId;
+} XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN, *PXENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN;
+
+// This IOCTL is pended forever, use IOCTL_XENIFACE_GNTTAB_GET_MAP_RESULT
+// to get the result. This IOCTL must be asynchronous.
+#define IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x823, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#pragma warning(push)
+#pragma warning(disable:4200) // nonstandard extension used : zero-sized array in struct/union
+typedef struct _XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN {
+    ULONG RequestId; // should be unique for each request
+    USHORT RemoteDomain;
+    ULONG NumberPages;
+    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
+    ULONG NotifyOffset;
+    ULONG NotifyPort;
+    ULONG References[0];
+} XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN, *PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN;
+#pragma warning(pop)
+
+#define IOCTL_XENIFACE_GNTTAB_GET_MAP_RESULT \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x824, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_GNTTAB_GET_MAP_RESULT_IN {
+    ULONG RequestId;
+} XENIFACE_GNTTAB_GET_MAP_RESULT_IN, *PXENIFACE_GNTTAB_GET_MAP_RESULT_IN;
+
+typedef struct _XENIFACE_GNTTAB_GET_MAP_RESULT_OUT {
+    PVOID Address;
+} XENIFACE_GNTTAB_GET_MAP_RESULT_OUT, *PXENIFACE_GNTTAB_GET_MAP_RESULT_OUT;
+
+#define IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x825, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN {
+    ULONG RequestId;
+} XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN, *PXENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN;
+
 #endif // _XENIFACE_IOCTLS_H_
 
diff --git a/src/xeniface/driver.h b/src/xeniface/driver.h
index 00f2d8f..313f297 100644
--- a/src/xeniface/driver.h
+++ b/src/xeniface/driver.h
@@ -32,7 +32,7 @@
 #ifndef _XENIFACE_DRIVER_H
 #define _XENIFACE_DRIVER_H
 
-
+#define XENIFACE_KERNEL_MODE
 
 #include "fdo.h"
 #include "types.h"
diff --git a/src/xeniface/ioctls.h b/src/xeniface/ioctls.h
index 63de9eb..7ee7801 100644
--- a/src/xeniface/ioctls.h
+++ b/src/xeniface/ioctls.h
@@ -32,6 +32,8 @@
 #ifndef _IOCTLS_H_
 #define _IOCTLS_H_
 
+#define XENIFACE_KERNEL_MODE
+
 NTSTATUS
 XenIFaceIoctl(
     __in  PXENIFACE_FDO         Fdo,
-- 
1.8.1.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 Wed Oct 07 04:48:42 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 07 Oct 2015 04:48: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 1Zjgeg-0007UE-1l; Wed, 07 Oct 2015 04:48:42 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1Zjged-0007U9-R5
	for win-pv-devel@lists.xenproject.org; Wed, 07 Oct 2015 04:48:40 +0000
Received: from [85.158.139.211] by server-7.bemta-5.messagelabs.com id
	EC/7C-13905-724A4165; Wed, 07 Oct 2015 04:48:39 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-13.tower-206.messagelabs.com!1444193317!40416080!1
X-Originating-IP: [66.111.4.28]
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 4610 invoked from network); 7 Oct 2015 04:48:38 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-13.tower-206.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 7 Oct 2015 04:48:38 -0000
Received: from compute4.internal (compute4.nyi.internal [10.202.2.44])
	by mailout.nyi.internal (Postfix) with ESMTP id 3CA9A20676
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:48:37 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute4.internal (MEProxy); Wed, 07 Oct 2015 00:48:37 -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=Sp24/+zMr3QGJfZz/pOtTPmtFR4=; b=oUZZcY
	I6ml0VOmqdNmV40S6YkxjX1ut+105pGdjKp6dHFouASMuNYpScARRS+kKsmhOH4a
	bN6N617OlD9zQ3UXMyKctltXwMDllnsK6wAFiLaKqFtyTjqCQl8f8VMSMMZQ4rEJ
	zKm/igbPWyw9edSRJhsGDlqouykT/OjCbEuj8=
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=Sp24/+zMr3QGJfZz/pOtTPmtFR4=; b=ZLs32
	RAjs//t67AkdQt8slh1ABHGLVO3dupePMWmpTq/CoUuRjXyJCXGuYxNI0MyJfTfT
	k68/sLXdlMA3OTl7q7lIeNOrwCln2rsfoALG2plE4k9bM/uY0K8M4sY8HZYNK4X/
	iG8KFnknuHtLx7MrRizQHofGmcbMKx3npUfVwU=
X-Sasl-enc: omW4mr5pxZ2QWeus+kch7fNyj3uwNy8vmUvxu8r06D5A 1444193316
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 6B9976800C5
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:48:36 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <5614A427.4090002@invisiblethingslab.com>
Date: Wed, 7 Oct 2015 06:48:39 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 3/5] Define new IOCTLs for user-mode clients
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

IOCTL input is defined as XENIFACE_*_IN structs.
IOCTL output is defined as XENIFACE_*_OUT structs.

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 include/xeniface_ioctls.h | 190 ++++++++++++++++++++++++++++++++++++++++++++++
 src/xeniface/driver.h     |   2 +-
 src/xeniface/ioctls.h     |   2 +
 3 files changed, 193 insertions(+), 1 deletion(-)

diff --git a/include/xeniface_ioctls.h b/include/xeniface_ioctls.h
index 1367f67..c6d9893 100644
--- a/include/xeniface_ioctls.h
+++ b/include/xeniface_ioctls.h
@@ -35,14 +35,204 @@
 DEFINE_GUID(GUID_INTERFACE_XENIFACE, \
     0xb2cfb085, 0xaa5e, 0x47e1, 0x8b, 0xf7, 0x97, 0x93, 0xf3, 0x15, 0x45, 0x65);
 
+/************************************************************************/
+/* store ioctls                                                         */
+/************************************************************************/
+// Define only for user mode clients.
+#ifndef XENIFACE_KERNEL_MODE
+
+typedef enum _XENBUS_STORE_PERMISSION_MASK {
+    XENBUS_STORE_PERM_NONE = 0,
+    XENBUS_STORE_PERM_READ = 1,
+    XENBUS_STORE_PERM_WRITE = 2,
+} XENBUS_STORE_PERMISSION_MASK;
+
+typedef struct _XENBUS_STORE_PERMISSION {
+    USHORT Domain;
+    XENBUS_STORE_PERMISSION_MASK Mask;
+} XENBUS_STORE_PERMISSION, *PXENBUS_STORE_PERMISSION;
+
+#endif
+
+#define XENIFACE_STORE_ALLOWED_PERMISSIONS  (XENBUS_STORE_PERM_NONE | XENBUS_STORE_PERM_READ | XENBUS_STORE_PERM_WRITE)
+
+// TODO: document input/output format of these IOCTLs?
 #define IOCTL_XENIFACE_STORE_READ \
     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
 #define IOCTL_XENIFACE_STORE_WRITE \
     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
 #define IOCTL_XENIFACE_STORE_DIRECTORY \
     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
 #define IOCTL_XENIFACE_STORE_REMOVE \
     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
+#define IOCTL_XENIFACE_STORE_SET_PERMISSIONS \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#pragma warning(push)
+#pragma warning(disable:4200) // nonstandard extension used : zero-sized array in struct/union
+typedef struct _XENIFACE_STORE_SET_PERMISSIONS_IN {
+    PCHAR Path;
+    ULONG PathLength; // number of bytes, including the null terminator
+    ULONG NumberPermissions;
+    XENBUS_STORE_PERMISSION Permissions[0];
+} XENIFACE_STORE_SET_PERMISSIONS_IN, *PXENIFACE_STORE_SET_PERMISSIONS_IN;
+#pragma warning(pop)
+
+#define IOCTL_XENIFACE_STORE_ADD_WATCH \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x805, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_STORE_ADD_WATCH_IN {
+    PCHAR Path;
+    ULONG PathLength; // number of bytes, including the null terminator
+    HANDLE Event;
+} XENIFACE_STORE_ADD_WATCH_IN, *PXENIFACE_STORE_ADD_WATCH_IN;
+
+typedef struct _XENIFACE_STORE_ADD_WATCH_OUT {
+    PVOID Context;
+} XENIFACE_STORE_ADD_WATCH_OUT, *PXENIFACE_STORE_ADD_WATCH_OUT;
+
+#define IOCTL_XENIFACE_STORE_REMOVE_WATCH \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x806, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_STORE_REMOVE_WATCH_IN {
+    PVOID Context;
+} XENIFACE_STORE_REMOVE_WATCH_IN, *PXENIFACE_STORE_REMOVE_WATCH_IN;
+
+/************************************************************************/
+/* evtchn ioctls                                                        */
+/************************************************************************/
+#define IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x810, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN {
+    USHORT RemoteDomain;
+    ULONG RemotePort;
+    BOOLEAN Mask;
+    HANDLE Event;
+} XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN, *PXENIFACE_EVTCHN_BIND_INTERDOMAIN_IN;
+
+typedef struct _XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT {
+    ULONG LocalPort;
+} XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT, *PXENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT;
+
+#define IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x811, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_EVTCHN_BIND_UNBOUND_IN {
+    USHORT RemoteDomain;
+    BOOLEAN Mask;
+    HANDLE Event;
+} XENIFACE_EVTCHN_BIND_UNBOUND_IN, *PXENIFACE_EVTCHN_BIND_UNBOUND_IN;
+
+typedef struct _XENIFACE_EVTCHN_BIND_UNBOUND_OUT {
+    ULONG LocalPort;
+} XENIFACE_EVTCHN_BIND_UNBOUND_OUT, *PXENIFACE_EVTCHN_BIND_UNBOUND_OUT;
+
+#define IOCTL_XENIFACE_EVTCHN_CLOSE \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x812, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_EVTCHN_CLOSE_IN {
+    ULONG LocalPort;
+} XENIFACE_EVTCHN_CLOSE_IN, *PXENIFACE_EVTCHN_CLOSE_IN;
+
+#define IOCTL_XENIFACE_EVTCHN_NOTIFY \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x813, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_EVTCHN_NOTIFY_IN {
+    ULONG LocalPort;
+} XENIFACE_EVTCHN_NOTIFY_IN, *PXENIFACE_EVTCHN_NOTIFY_IN;
+
+#define IOCTL_XENIFACE_EVTCHN_UNMASK \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x814, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_EVTCHN_UNMASK_IN {
+    ULONG LocalPort;
+} XENIFACE_EVTCHN_UNMASK_IN, *PXENIFACE_EVTCHN_UNMASK_IN;
+
+/************************************************************************/
+/* gntmem ioctls                                                        */
+/************************************************************************/
+// This IOCTL is pended forever, use IOCTL_XENIFACE_GNTTAB_GET_GRANT_RESULT
+// to get the result. This IOCTL must be asynchronous.
+#define IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x820, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef enum _XENIFACE_GNTTAB_PAGE_FLAGS {
+    XENIFACE_GNTTAB_READONLY          = 1 << 0,
+    XENIFACE_GNTTAB_USE_NOTIFY_OFFSET = 1 << 1,
+    XENIFACE_GNTTAB_USE_NOTIFY_PORT   = 1 << 2,
+} XENIFACE_GNTTAB_PAGE_FLAGS;
+
+typedef struct _XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN {
+    ULONG RequestId; // should be unique for each request
+    USHORT RemoteDomain;
+    ULONG NumberPages;
+    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
+    ULONG NotifyOffset;
+    ULONG NotifyPort;
+} XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN, *PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN;
+
+#define IOCTL_XENIFACE_GNTTAB_GET_GRANT_RESULT \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x821, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_GNTTAB_GET_GRANT_RESULT_IN {
+    ULONG RequestId;
+} XENIFACE_GNTTAB_GET_GRANT_RESULT_IN, *PXENIFACE_GNTTAB_GET_GRANT_RESULT_IN;
+
+#pragma warning(push)
+#pragma warning(disable:4200) // nonstandard extension used : zero-sized array in struct/union
+typedef struct _XENIFACE_GNTTAB_GET_GRANT_RESULT_OUT {
+    PVOID Address;
+    ULONG References[0];
+} XENIFACE_GNTTAB_GET_GRANT_RESULT_OUT, *PXENIFACE_GNTTAB_GET_GRANT_RESULT_OUT;
+#pragma warning(pop)
+
+#define IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x822, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN {
+    ULONG RequestId;
+} XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN, *PXENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN;
+
+// This IOCTL is pended forever, use IOCTL_XENIFACE_GNTTAB_GET_MAP_RESULT
+// to get the result. This IOCTL must be asynchronous.
+#define IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x823, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#pragma warning(push)
+#pragma warning(disable:4200) // nonstandard extension used : zero-sized array in struct/union
+typedef struct _XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN {
+    ULONG RequestId; // should be unique for each request
+    USHORT RemoteDomain;
+    ULONG NumberPages;
+    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
+    ULONG NotifyOffset;
+    ULONG NotifyPort;
+    ULONG References[0];
+} XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN, *PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN;
+#pragma warning(pop)
+
+#define IOCTL_XENIFACE_GNTTAB_GET_MAP_RESULT \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x824, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_GNTTAB_GET_MAP_RESULT_IN {
+    ULONG RequestId;
+} XENIFACE_GNTTAB_GET_MAP_RESULT_IN, *PXENIFACE_GNTTAB_GET_MAP_RESULT_IN;
+
+typedef struct _XENIFACE_GNTTAB_GET_MAP_RESULT_OUT {
+    PVOID Address;
+} XENIFACE_GNTTAB_GET_MAP_RESULT_OUT, *PXENIFACE_GNTTAB_GET_MAP_RESULT_OUT;
+
+#define IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x825, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN {
+    ULONG RequestId;
+} XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN, *PXENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN;
+
 #endif // _XENIFACE_IOCTLS_H_
 
diff --git a/src/xeniface/driver.h b/src/xeniface/driver.h
index 00f2d8f..313f297 100644
--- a/src/xeniface/driver.h
+++ b/src/xeniface/driver.h
@@ -32,7 +32,7 @@
 #ifndef _XENIFACE_DRIVER_H
 #define _XENIFACE_DRIVER_H
 
-
+#define XENIFACE_KERNEL_MODE
 
 #include "fdo.h"
 #include "types.h"
diff --git a/src/xeniface/ioctls.h b/src/xeniface/ioctls.h
index 63de9eb..7ee7801 100644
--- a/src/xeniface/ioctls.h
+++ b/src/xeniface/ioctls.h
@@ -32,6 +32,8 @@
 #ifndef _IOCTLS_H_
 #define _IOCTLS_H_
 
+#define XENIFACE_KERNEL_MODE
+
 NTSTATUS
 XenIFaceIoctl(
     __in  PXENIFACE_FDO         Fdo,
-- 
1.8.1.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 Wed Oct 07 04:48:55 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 07 Oct 2015 04:48: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 1Zjget-0007Uu-3k; Wed, 07 Oct 2015 04:48:55 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1Zjger-0007Up-Fg
	for win-pv-devel@lists.xenproject.org; Wed, 07 Oct 2015 04:48:53 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	93/58-22142-434A4165; Wed, 07 Oct 2015 04:48:52 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-15.tower-206.messagelabs.com!1444193327!24707014!1
X-Originating-IP: [66.111.4.28]
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 6040 invoked from network); 7 Oct 2015 04:48:48 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-15.tower-206.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 7 Oct 2015 04:48:48 -0000
Received: from compute2.internal (compute2.nyi.internal [10.202.2.42])
	by mailout.nyi.internal (Postfix) with ESMTP id B9CE020911
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:48:47 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute2.internal (MEProxy); Wed, 07 Oct 2015 00:48:47 -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=hX66RzyORSkxPz99QkSEF5aG2g0=; b=AXDPbh
	5RyuANs9ZUREyjTiNBKdcIcYtRCsEwHHPPCXpY2Xpd3/yCDeRmZTzfvTl3n+gTSE
	Nqc6enSMGVtN+W50kvYtq/gF2JFiDklOrN1+C7NakNmpHB55HiI9Yx9DuWe9JVkf
	Rvbtw0KkSjTLAFHsn4z/vIRoXqWSmQmu5okNs=
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=hX66RzyORSkxPz99QkSEF5aG2g0=; b=NqGW9
	D1psJDBAVt8VkSopTBBqtq6mkasn9tynG3ssVMSr/Lj4KWjpGiCdAIJI9lPokKdq
	gM9dXypGKLmYCkKrayZ64mjXQahSsq9XWOxTdjNo7ReINx61uKgzv84+Sbz8K9ts
	rT3khptzRdxsV1mQfUWuCO1d7JNKF/J8B1R9+Y=
X-Sasl-enc: 61GTAcWVpTvgMuewB948d+XFC9oYP1OXTuVYyOyzCtHW 1444193326
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 4771D680159
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:48:46 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <5614A431.2020704@invisiblethingslab.com>
Date: Wed, 7 Oct 2015 06:48:49 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 4/5] Implement new IOCTL handlers
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

This patch implements new store, evtchn and gnttab IOCTLs.
Handlers are split into separate files for readability.

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 src/xeniface/fdo.c               | 188 ++++++++--
 src/xeniface/fdo.h               |  25 +-
 src/xeniface/ioctl_evtchn.c      | 467 ++++++++++++++++++++++++
 src/xeniface/ioctl_gnttab.c      | 765 +++++++++++++++++++++++++++++++++++++++
 src/xeniface/ioctl_store.c       | 574 +++++++++++++++++++++++++++++
 src/xeniface/ioctls.c            | 360 ++++++------------
 src/xeniface/ioctls.h            | 315 +++++++++++++++-
 src/xeniface/irp_queue.c         | 131 +++++++
 src/xeniface/irp_queue.h         |  50 +++
 vs2013/xeniface/xeniface.vcxproj |   4 +
 10 files changed, 2602 insertions(+), 277 deletions(-)
 create mode 100644 src/xeniface/ioctl_evtchn.c
 create mode 100644 src/xeniface/ioctl_gnttab.c
 create mode 100644 src/xeniface/ioctl_store.c
 create mode 100644 src/xeniface/irp_queue.c
 create mode 100644 src/xeniface/irp_queue.h

diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index 51bda24..338c8da 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -36,7 +36,8 @@
 #include <stdlib.h>
 
 #include <store_interface.h>
-
+#include <evtchn_interface.h>
+#include <gnttab_interface.h>
 #include <suspend_interface.h>
 
 
@@ -52,6 +53,7 @@
 #include "ioctls.h"
 #include "wmi.h"
 #include "xeniface_ioctls.h"
+#include "irp_queue.h"
 
 #define FDO_POOL 'ODF'
 
@@ -664,6 +666,25 @@ __FdoD3ToD0(
     if (!NT_SUCCESS(status))
         goto fail1;
 
+    status = XENBUS_EVTCHN(Acquire, &Fdo->EvtchnInterface);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = XENBUS_GNTTAB(Acquire, &Fdo->GnttabInterface);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    status = XENBUS_GNTTAB(CreateCache,
+                           &Fdo->GnttabInterface,
+                           "xeniface-gnttab",
+                           0,
+                           GnttabAcquireLock,
+                           GnttabReleaseLock,
+                           Fdo,
+                           &Fdo->GnttabCache);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
     __FdoSetDevicePowerState(Fdo, PowerDeviceD0);
 
     PowerState.DeviceState = PowerDeviceD0;
@@ -675,6 +696,18 @@ __FdoD3ToD0(
 
     return STATUS_SUCCESS;
 
+fail4:
+    Error("fail4\n");
+    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
+
+fail3:
+    Error("fail3\n");
+    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
+
+fail2:
+    Error("fail2\n");
+    XENBUS_STORE(Release, &Fdo->StoreInterface);
+
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -700,6 +733,9 @@ __FdoD0ToD3(
 
     __FdoSetDevicePowerState(Fdo, PowerDeviceD3);
 
+    XENBUS_GNTTAB(DestroyCache, &Fdo->GnttabInterface, Fdo->GnttabCache);
+    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
+    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
     XENBUS_STORE(Release, &Fdo->StoreInterface);
 
     Trace("<====\n");
@@ -1991,27 +2027,25 @@ FdoDispatchDefault(
 
 NTSTATUS
 FdoCreateFile (
-    __in PXENIFACE_FDO fdoData,
-    __inout PIRP Irp
+    __in PXENIFACE_FDO  Fdo,
+    __inout PIRP        Irp
     )
 {
-    NTSTATUS     status;
-
+    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
+    NTSTATUS            status;
 
-    XenIfaceDebugPrint(TRACE, "Create \n");
+    XenIfaceDebugPrint(TRACE, "FO %p, Process %p\n", Stack->FileObject, PsGetCurrentProcess());
 
-    if (Deleted == fdoData->Dx->DevicePnpState)
-    {
+    if (Deleted == Fdo->Dx->DevicePnpState) {
         Irp->IoStatus.Status = STATUS_NO_SUCH_DEVICE;
-        IoCompleteRequest (Irp, IO_NO_INCREMENT);
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
         return STATUS_NO_SUCH_DEVICE;
     }
 
-
     status = STATUS_SUCCESS;
     Irp->IoStatus.Information = 0;
     Irp->IoStatus.Status = status;
-    IoCompleteRequest (Irp, IO_NO_INCREMENT);
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
     return status;
 }
@@ -2019,20 +2053,22 @@ FdoCreateFile (
 
 NTSTATUS
 FdoClose (
-    __in PXENIFACE_FDO fdoData,
-    __inout PIRP Irp
+    __in PXENIFACE_FDO  Fdo,
+    __inout PIRP        Irp
     )
 
 {
+    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
+    NTSTATUS            status;
 
-    NTSTATUS     status;
+    XenIfaceDebugPrint(TRACE, "FO %p, Process %p\n", Stack->FileObject, PsGetCurrentProcess());
 
-    XenIfaceDebugPrint(TRACE, "Close \n");
+    XenIfaceCleanup(Fdo, Stack->FileObject);
 
     status = STATUS_SUCCESS;
     Irp->IoStatus.Information = 0;
     Irp->IoStatus.Status = status;
-    IoCompleteRequest (Irp, IO_NO_INCREMENT);
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
     return status;
 }
@@ -2080,9 +2116,9 @@ FdoDispatch(
         status = FdoDispatchPower(Fdo, Irp);
         break;
 
-	case IRP_MJ_DEVICE_CONTROL:
-		status = XenIFaceIoctl(Fdo, Irp);
-		break;
+    case IRP_MJ_DEVICE_CONTROL:
+        status = XenIfaceIoctl(Fdo, Irp);
+        break;
 
 	case IRP_MJ_SYSTEM_CONTROL:
 		status = XenIfaceSystemControl(Fdo, Irp);
@@ -2206,6 +2242,7 @@ FdoCreate(
     WCHAR               Name[MAXNAMELEN * sizeof (WCHAR)];
     ULONG               Size;
     NTSTATUS            status;
+    ULONG               ProcessorCount;
 
 #pragma prefast(suppress:28197) // Possibly leaking memory 'FunctionDeviceObject'
     status = IoCreateDevice(DriverObject,
@@ -2296,6 +2333,24 @@ FdoCreate(
     if (!NT_SUCCESS(status))
         goto fail10;
 
+    status = FDO_QUERY_INTERFACE(Fdo,
+                                 XENBUS,
+                                 EVTCHN,
+                                 (PINTERFACE)&Fdo->EvtchnInterface,
+                                 sizeof(Fdo->EvtchnInterface),
+                                 FALSE);
+    if (!NT_SUCCESS(status))
+        goto fail11;
+
+    status = FDO_QUERY_INTERFACE(Fdo,
+                                 XENBUS,
+                                 GNTTAB,
+                                 (PINTERFACE)&Fdo->GnttabInterface,
+                                 sizeof(Fdo->GnttabInterface),
+                                 FALSE);
+    if (!NT_SUCCESS(status))
+        goto fail12;
+
     InitializeMutex(&Fdo->Mutex);
     InitializeListHead(&Dx->ListEntry);
     Fdo->References = 1;
@@ -2304,9 +2359,46 @@ FdoCreate(
 
 	KeInitializeEvent(&Fdo->registryWriteEvent, NotificationEvent, FALSE);
 
-	status = ThreadCreate(FdoRegistryThreadHandler, Fdo, &Fdo->registryThread);
-	if (!NT_SUCCESS(status))
-		goto fail11;
+    status = ThreadCreate(FdoRegistryThreadHandler, Fdo, &Fdo->registryThread);
+    if (!NT_SUCCESS(status))
+        goto fail13;
+
+    KeInitializeSpinLock(&Fdo->StoreWatchLock);
+    InitializeListHead(&Fdo->StoreWatchList);
+
+    KeInitializeSpinLock(&Fdo->EvtchnLock);
+    InitializeListHead(&Fdo->EvtchnList);
+
+    KeInitializeSpinLock(&Fdo->IrpQueueLock);
+    InitializeListHead(&Fdo->IrpList);
+
+    KeInitializeSpinLock(&Fdo->GnttabCacheLock);
+
+    status = IoCsqInitializeEx(&Fdo->IrpQueue,
+                               CsqInsertIrpEx,
+                               CsqRemoveIrp,
+                               CsqPeekNextIrp,
+                               CsqAcquireLock,
+                               CsqReleaseLock,
+                               CsqCompleteCanceledIrp);
+    if (!NT_SUCCESS(status))
+        goto fail14;
+
+    ProcessorCount = KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
+    status = STATUS_NO_MEMORY;
+    Fdo->EvtchnDpc = __FdoAllocate(sizeof(KDPC) * ProcessorCount);
+    if (Fdo->EvtchnDpc == NULL)
+        goto fail15;
+
+    for (ULONG i = 0; i < ProcessorCount; i++) {
+        PROCESSOR_NUMBER ProcNumber;
+
+        status = KeGetProcessorNumberFromIndex(i, &ProcNumber);
+        ASSERT(NT_SUCCESS(status));
+        KeInitializeDpc(&Fdo->EvtchnDpc[i], EvtchnNotificationDpc, NULL);
+        status = KeSetTargetProcessorDpcEx(&Fdo->EvtchnDpc[i], &ProcNumber);
+        ASSERT(NT_SUCCESS(status));
+    }
 
     Info("%p (%s)\n",
          FunctionDeviceObject,
@@ -2317,7 +2409,28 @@ FdoCreate(
 
     return STATUS_SUCCESS;
 
-	
+fail15:
+    Error("fail15\n");
+
+fail14:
+    Error("fail14\n");
+
+    ThreadAlert(Fdo->registryThread);
+    ThreadJoin(Fdo->registryThread);
+    Fdo->registryThread = NULL;
+
+fail13:
+    Error("fail13\n");
+
+    RtlZeroMemory(&Fdo->GnttabInterface,
+                  sizeof (XENBUS_GNTTAB_INTERFACE));
+
+fail12:
+    Error("fail12\n");
+
+    RtlZeroMemory(&Fdo->EvtchnInterface,
+                  sizeof(XENBUS_EVTCHN_INTERFACE));
+
 fail11:
 	Error("fail11\n");
 
@@ -2395,6 +2508,7 @@ FdoDestroy(
 {
     PXENIFACE_DX          Dx = Fdo->Dx;
     PDEVICE_OBJECT      FunctionDeviceObject = Dx->DeviceObject;
+    ULONG               ProcessorCount;
 
     ASSERT(IsListEmpty(&Dx->ListEntry));
     ASSERT3U(Fdo->References, ==, 0);
@@ -2408,9 +2522,33 @@ FdoDestroy(
 
     Dx->Fdo = NULL;
 
-    RtlZeroMemory(&Fdo->Mutex, sizeof (XENIFACE_MUTEX));
+    ProcessorCount = KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
+    RtlZeroMemory(Fdo->EvtchnDpc, sizeof(KDPC)*ProcessorCount);
+    __FdoFree(Fdo->EvtchnDpc);
 
-	Fdo->InterfacesAcquired = FALSE;
+    RtlZeroMemory(&Fdo->GnttabCacheLock, sizeof(KSPIN_LOCK));
+    ASSERT(IsListEmpty(&Fdo->IrpList));
+    RtlZeroMemory(&Fdo->IrpList, sizeof(LIST_ENTRY));
+    RtlZeroMemory(&Fdo->IrpQueueLock, sizeof(KSPIN_LOCK));
+    RtlZeroMemory(&Fdo->IrpQueue, sizeof(IO_CSQ));
+
+    ASSERT(IsListEmpty(&Fdo->EvtchnList));
+    RtlZeroMemory(&Fdo->EvtchnList, sizeof(LIST_ENTRY));
+    RtlZeroMemory(&Fdo->EvtchnLock, sizeof(KSPIN_LOCK));
+
+    ASSERT(IsListEmpty(&Fdo->StoreWatchList));
+    RtlZeroMemory(&Fdo->StoreWatchList, sizeof(LIST_ENTRY));
+    RtlZeroMemory(&Fdo->StoreWatchLock, sizeof(KSPIN_LOCK));
+
+    RtlZeroMemory(&Fdo->Mutex, sizeof(XENIFACE_MUTEX));
+
+    Fdo->InterfacesAcquired = FALSE;
+
+    RtlZeroMemory(&Fdo->GnttabInterface,
+                  sizeof(XENBUS_GNTTAB_INTERFACE));
+
+    RtlZeroMemory(&Fdo->EvtchnInterface,
+                  sizeof(XENBUS_EVTCHN_INTERFACE));
 
     RtlZeroMemory(&Fdo->StoreInterface,
                   sizeof (XENBUS_STORE_INTERFACE));
diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
index 4416064..cbe5de3 100644
--- a/src/xeniface/fdo.h
+++ b/src/xeniface/fdo.h
@@ -34,6 +34,8 @@
 
 #include <ntifs.h>
 #include <store_interface.h>
+#include <evtchn_interface.h>
+#include <gnttab_interface.h>
 #include <suspend_interface.h>
 #include <shared_info_interface.h>
 
@@ -73,17 +75,30 @@ typedef struct _XENIFACE_FDO {
 
     FDO_RESOURCE                    Resource[RESOURCE_COUNT];
 
-
     XENBUS_STORE_INTERFACE          StoreInterface;
-
     XENBUS_SUSPEND_INTERFACE        SuspendInterface;
-
-	XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
-
+    XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
+    XENBUS_EVTCHN_INTERFACE         EvtchnInterface;
+    XENBUS_GNTTAB_INTERFACE         GnttabInterface;
     PXENBUS_SUSPEND_CALLBACK        SuspendCallbackLate;
 
 	BOOLEAN						    InterfacesAcquired;
 
+    KSPIN_LOCK                      StoreWatchLock;
+    LIST_ENTRY                      StoreWatchList;
+
+    KSPIN_LOCK                      EvtchnLock;
+    LIST_ENTRY                      EvtchnList;
+    PKDPC                           EvtchnDpc;
+
+    KSPIN_LOCK                      GnttabCacheLock;
+
+    IO_CSQ                          IrpQueue;
+    KSPIN_LOCK                      IrpQueueLock;
+    LIST_ENTRY                      IrpList;
+
+    PXENBUS_GNTTAB_CACHE            GnttabCache;
+
 	#define MAX_SESSIONS    (65536)
 
     int							    WmiReady;
diff --git a/src/xeniface/ioctl_evtchn.c b/src/xeniface/ioctl_evtchn.c
new file mode 100644
index 0000000..d46894f
--- /dev/null
+++ b/src/xeniface/ioctl_evtchn.c
@@ -0,0 +1,467 @@
+/* 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 "driver.h"
+#include "ioctls.h"
+#include "..\..\include\xeniface_ioctls.h"
+#include "log.h"
+
+_Function_class_(KDEFERRED_ROUTINE)
+_IRQL_requires_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+VOID
+EvtchnNotificationDpc(
+    __in      PKDPC Dpc,
+    __in_opt  PVOID _Context,
+    __in_opt  PVOID Argument1,
+    __in_opt  PVOID Argument2
+    )
+{
+    PXENIFACE_EVTCHN_CONTEXT Context = (PXENIFACE_EVTCHN_CONTEXT)Argument1;
+
+    UNREFERENCED_PARAMETER(Dpc);
+    UNREFERENCED_PARAMETER(_Context);
+    UNREFERENCED_PARAMETER(Argument2);
+
+    ASSERT(Context);
+
+#if DBG
+    XenIfaceDebugPrint(INFO, "Channel %p, LocalPort %d, Active %d, Cpu %lu\n",
+                       Context->Channel, Context->LocalPort, Context->Active, KeGetCurrentProcessorNumber());
+#endif
+    if (Context->Active) {
+        KeSetEvent(Context->Event, 0, FALSE);
+
+        XENBUS_EVTCHN(Unmask,
+                      &Context->Fdo->EvtchnInterface,
+                      Context->Channel,
+                      FALSE);
+    }
+}
+
+_Function_class_(KSERVICE_ROUTINE)
+_IRQL_requires_(HIGH_LEVEL)
+_IRQL_requires_same_
+static DECLSPEC_NOINLINE
+BOOLEAN
+EvtchnInterruptHandler(
+    __in      PKINTERRUPT Interrupt,
+    __in_opt  PVOID Argument
+    )
+{
+    PXENIFACE_EVTCHN_CONTEXT Context = (PXENIFACE_EVTCHN_CONTEXT)Argument;
+    PROCESSOR_NUMBER ProcNumber;
+    ULONG ProcIndex;
+
+    UNREFERENCED_PARAMETER(Interrupt);
+    ASSERT(Context);
+
+    KeGetCurrentProcessorNumberEx(&ProcNumber);
+    ProcIndex = KeGetProcessorIndexFromNumber(&ProcNumber);
+    if (Context->Active)
+        KeInsertQueueDpc(&Context->Fdo->EvtchnDpc[ProcIndex], Context, NULL);
+
+    return TRUE;
+}
+
+_IRQL_requires_(PASSIVE_LEVEL) // needed for KeFlushQueuedDpcs
+VOID
+EvtchnFree(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_EVTCHN_CONTEXT Context
+    )
+{
+    ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
+
+    XenIfaceDebugPrint(TRACE, "Context %p, LocalPort %d, FO %p\n",
+                       Context, Context->LocalPort, Context->FileObject);
+
+    InterlockedExchange8(&Context->Active, 0);
+
+    XENBUS_EVTCHN(Close,
+                  &Fdo->EvtchnInterface,
+                  Context->Channel);
+
+    // There may still be a pending event at this time.
+    // Wait for our DPCs to complete.
+    KeFlushQueuedDpcs();
+
+    ObDereferenceObject(Context->Event);
+    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+}
+
+_Requires_exclusive_lock_held_(Fdo->EvtchnLock)
+static
+PXENIFACE_EVTCHN_CONTEXT
+EvtchnFindChannel(
+    __in      PXENIFACE_FDO Fdo,
+    __in      ULONG         LocalPort,
+    __in_opt  PFILE_OBJECT  FileObject
+    )
+{
+    PXENIFACE_EVTCHN_CONTEXT Context, Found = NULL;
+    PLIST_ENTRY Node;
+
+    Node = Fdo->EvtchnList.Flink;
+    while (Node->Flink != Fdo->EvtchnList.Flink) {
+        Context = CONTAINING_RECORD(Node, XENIFACE_EVTCHN_CONTEXT, Entry);
+
+        Node = Node->Flink;
+        if (Context->LocalPort != LocalPort)
+            continue;
+
+        if (FileObject != NULL && Context->FileObject != FileObject)
+            continue;
+
+        Found = Context;
+        break;
+    }
+
+    return Found;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnBindUnbound(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_BIND_UNBOUND_IN In = Buffer;
+    PXENIFACE_EVTCHN_BIND_UNBOUND_OUT Out = Buffer;
+    PXENIFACE_EVTCHN_CONTEXT Context;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_IN) || OutLen != sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_OUT))
+        goto fail1;
+
+    status = STATUS_NO_MEMORY;
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_EVTCHN_CONTEXT), XENIFACE_POOL_TAG);
+    if (Context == NULL)
+        goto fail2;
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
+    Context->FileObject = FileObject;
+
+    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, Mask %d, FO %p\n",
+                       In->RemoteDomain, In->Mask, FileObject);
+
+    status = ObReferenceObjectByHandle(In->Event, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode, &Context->Event, NULL);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    status = STATUS_UNSUCCESSFUL;
+    Context->Channel = XENBUS_EVTCHN(Open,
+                                     &Fdo->EvtchnInterface,
+                                     XENBUS_EVTCHN_TYPE_UNBOUND,
+                                     EvtchnInterruptHandler,
+                                     Context,
+                                     In->RemoteDomain,
+                                     TRUE);
+    if (Context->Channel == NULL)
+        goto fail4;
+
+    Context->LocalPort = XENBUS_EVTCHN(GetPort,
+                                       &Fdo->EvtchnInterface,
+                                       Context->Channel);
+
+    Context->Fdo = Fdo;
+
+    ExInterlockedInsertTailList(&Fdo->EvtchnList, &Context->Entry, &Fdo->EvtchnLock);
+
+    InterlockedExchange8(&Context->Active, 1);
+    Out->LocalPort = Context->LocalPort;
+    *Info = sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_OUT);
+
+    if (!In->Mask) {
+        XENBUS_EVTCHN(Unmask,
+                      &Fdo->EvtchnInterface,
+                      Context->Channel,
+                      FALSE);
+    }
+
+    XenIfaceDebugPrint(TRACE, "< LocalPort %lu, Context %p\n", Context->LocalPort, Context);
+    return STATUS_SUCCESS;
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+    ObDereferenceObject(Context->Event);
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnBindInterdomain(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_BIND_INTERDOMAIN_IN In = Buffer;
+    PXENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT Out = Buffer;
+    PXENIFACE_EVTCHN_CONTEXT Context;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN) || OutLen != sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT))
+        goto fail1;
+
+    status = STATUS_NO_MEMORY;
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_EVTCHN_CONTEXT), XENIFACE_POOL_TAG);
+    if (Context == NULL)
+        goto fail2;
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
+    Context->FileObject = FileObject;
+
+    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, RemotePort %lu, Mask %d, FO %p\n",
+                       In->RemoteDomain, In->RemotePort, In->Mask, FileObject);
+
+    status = ObReferenceObjectByHandle(In->Event, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode, &Context->Event, NULL);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    status = STATUS_UNSUCCESSFUL;
+    Context->Channel = XENBUS_EVTCHN(Open,
+                                     &Fdo->EvtchnInterface,
+                                     XENBUS_EVTCHN_TYPE_INTER_DOMAIN,
+                                     EvtchnInterruptHandler,
+                                     Context,
+                                     In->RemoteDomain,
+                                     In->RemotePort,
+                                     TRUE);
+    if (Context->Channel == NULL)
+        goto fail4;
+
+    Context->LocalPort = XENBUS_EVTCHN(GetPort,
+                                       &Fdo->EvtchnInterface,
+                                       Context->Channel);
+
+    Context->Fdo = Fdo;
+
+    ExInterlockedInsertTailList(&Fdo->EvtchnList, &Context->Entry, &Fdo->EvtchnLock);
+
+    InterlockedExchange8(&Context->Active, 1);
+    Out->LocalPort = Context->LocalPort;
+    *Info = sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT);
+
+    if (!In->Mask) {
+        XENBUS_EVTCHN(Unmask,
+                      &Fdo->EvtchnInterface,
+                      Context->Channel,
+                      FALSE);
+    }
+
+    XenIfaceDebugPrint(TRACE, "< LocalPort %lu, Context %p\n", Context->LocalPort, Context);
+
+    return STATUS_SUCCESS;
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+    ObDereferenceObject(Context->Event);
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnClose(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_CLOSE_IN In = Buffer;
+    PXENIFACE_EVTCHN_CONTEXT Context = NULL;
+    KIRQL Irql;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_EVTCHN_CLOSE_IN) || OutLen != 0)
+        goto fail1;
+
+    XenIfaceDebugPrint(TRACE, "> LocalPort %lu, FO %p\n", In->LocalPort, FileObject);
+
+    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
+    Context = EvtchnFindChannel(Fdo, In->LocalPort, FileObject);
+    if (Context != NULL)
+        RemoveEntryList(&Context->Entry);
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+    if (Context != NULL)
+        EvtchnFree(Fdo, Context);
+
+    status = STATUS_NOT_FOUND;
+    if (Context == NULL)
+        goto fail2;
+
+    return STATUS_SUCCESS;
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+_Requires_lock_not_held_(Fdo->EvtchnLock)
+DECLSPEC_NOINLINE
+NTSTATUS
+EvtchnNotify(
+    __in      PXENIFACE_FDO Fdo,
+    __in      ULONG         LocalPort,
+    __in_opt  PFILE_OBJECT  FileObject
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_CONTEXT Context = NULL;
+    KIRQL Irql;
+
+    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
+
+    Context = EvtchnFindChannel(Fdo, LocalPort, FileObject);
+
+    status = STATUS_NOT_FOUND;
+    if (Context == NULL)
+        goto fail1;
+
+    XENBUS_EVTCHN(Send,
+                  &Fdo->EvtchnInterface,
+                  Context->Channel);
+
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+
+    return STATUS_SUCCESS;
+
+fail1:
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnNotify(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_NOTIFY_IN In = Buffer;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_EVTCHN_NOTIFY_IN) || OutLen != 0)
+        goto fail1;
+#if DBG
+    XenIfaceDebugPrint(INFO, "> LocalPort %d, FO %p\n", In->LocalPort, FileObject);
+#endif
+
+    return EvtchnNotify(Fdo, In->LocalPort, FileObject);
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnUnmask(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_UNMASK_IN In = Buffer;
+    PXENIFACE_EVTCHN_CONTEXT Context = NULL;
+    KIRQL Irql;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_EVTCHN_UNMASK_IN) || OutLen != 0)
+        goto fail1;
+
+    XenIfaceDebugPrint(TRACE, "> LocalPort %d, FO %p\n", In->LocalPort, FileObject);
+
+    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
+
+    Context = EvtchnFindChannel(Fdo, In->LocalPort, FileObject);
+
+    status = STATUS_INVALID_PARAMETER;
+    if (Context == NULL)
+        goto fail2;
+
+    XENBUS_EVTCHN(Unmask,
+                  &Fdo->EvtchnInterface,
+                  Context->Channel,
+                  FALSE);
+
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
diff --git a/src/xeniface/ioctl_gnttab.c b/src/xeniface/ioctl_gnttab.c
new file mode 100644
index 0000000..a279b77
--- /dev/null
+++ b/src/xeniface/ioctl_gnttab.c
@@ -0,0 +1,765 @@
+/* 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 "driver.h"
+#include "ioctls.h"
+#include "..\..\include\xeniface_ioctls.h"
+#include "log.h"
+#include "irp_queue.h"
+
+// Complete a canceled gnttab IRP, cleanup associated grant/map.
+_Function_class_(IO_WORKITEM_ROUTINE)
+VOID
+CompleteGnttabIrp(
+    __in      PDEVICE_OBJECT DeviceObject,
+    __in_opt  PVOID          Context
+    )
+{
+    PXENIFACE_DX Dx = (PXENIFACE_DX)DeviceObject->DeviceExtension;
+    PXENIFACE_FDO Fdo = Dx->Fdo;
+    PIRP Irp = Context;
+    PXENIFACE_CONTEXT_ID Id;
+    PIO_WORKITEM WorkItem;
+    KAPC_STATE ApcState;
+    BOOLEAN ChangeProcess;
+
+    ASSERT(Context != NULL);
+
+    Id = Irp->Tail.Overlay.DriverContext[0];
+    WorkItem = Irp->Tail.Overlay.DriverContext[1];
+    
+    // We are not guaranteed to be in the context of the process that initiated the IRP,
+    // but we need to be there to unmap memory.
+    ChangeProcess = PsGetCurrentProcess() != Id->Process;
+    if (ChangeProcess) {
+        XenIfaceDebugPrint(TRACE, "Changing process from %p to %p\n", PsGetCurrentProcess(), Id->Process);
+        KeStackAttachProcess(Id->Process, &ApcState);
+    }
+
+    XenIfaceDebugPrint(TRACE, "Irp %p, Process %p, Id %lu, Type %d, IRQL %d\n",
+                       Irp, Id->Process, Id->RequestId, Id->Type, KeGetCurrentIrql());
+
+    switch (Id->Type) {
+
+    case XENIFACE_CONTEXT_GRANT:
+        GnttabFreeGrant(Fdo, CONTAINING_RECORD(Id, XENIFACE_GRANT_CONTEXT, Id));
+        break;
+
+    case XENIFACE_CONTEXT_MAP:
+        GnttabFreeMap(Fdo, CONTAINING_RECORD(Id, XENIFACE_MAP_CONTEXT, Id));
+        break;
+
+    default:
+        ASSERT(FALSE);
+    }
+
+    if (ChangeProcess)
+        KeUnstackDetachProcess(&ApcState);
+
+    IoFreeWorkItem(WorkItem);
+
+    Irp->IoStatus.Status = STATUS_CANCELLED;
+    Irp->IoStatus.Information = 0;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+}
+
+_Acquires_exclusive_lock_(((PXENIFACE_FDO)Argument)->GnttabCacheLock)
+_IRQL_requires_(DISPATCH_LEVEL)
+VOID
+GnttabAcquireLock(
+    __in  PVOID Argument
+    )
+{
+    PXENIFACE_FDO Fdo = Argument;
+
+    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+
+    KeAcquireSpinLockAtDpcLevel(&Fdo->GnttabCacheLock);
+}
+
+_Releases_exclusive_lock_(((PXENIFACE_FDO)Argument)->GnttabCacheLock)
+_IRQL_requires_(DISPATCH_LEVEL)
+VOID
+GnttabReleaseLock(
+    __in  PVOID Argument
+    )
+{
+    PXENIFACE_FDO Fdo = Argument;
+
+    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+
+    KeReleaseSpinLockFromDpcLevel(&Fdo->GnttabCacheLock);
+}
+
+_Requires_lock_not_held_(Fdo->IrpQueueLock)
+static
+PIRP
+FindGnttabIrp(
+    __in  PXENIFACE_FDO Fdo,
+    __in  PXENIFACE_CONTEXT_ID Id
+    )
+{
+    KIRQL Irql;
+    PIRP Irp;
+
+    CsqAcquireLock(&Fdo->IrpQueue, &Irql);
+    Irp = CsqPeekNextIrp(&Fdo->IrpQueue, NULL, Id);
+    CsqReleaseLock(&Fdo->IrpQueue, Irql);
+    return Irp;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabPermitForeignAccess(
+    __in     PXENIFACE_FDO  Fdo,
+    __in     PVOID          Buffer,
+    __in     ULONG          InLen,
+    __in     ULONG          OutLen,
+    __inout  PIRP           Irp
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN In = Buffer;
+    PXENIFACE_GRANT_CONTEXT Context;
+    ULONG Page;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN) || OutLen != 0)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if ((In->NumberPages == 0) || (In->NumberPages > 1024 * 1024) ||
+        ((In->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) && (In->NotifyOffset >= In->NumberPages * PAGE_SIZE))
+        )
+        goto fail2;
+
+    status = STATUS_NO_MEMORY;
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_GRANT_CONTEXT), XENIFACE_POOL_TAG);
+    if (Context == NULL)
+        goto fail3;
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
+    Context->Id.Type = XENIFACE_CONTEXT_GRANT;
+    Context->Id.Process = PsGetCurrentProcess();
+    Context->Id.RequestId = In->RequestId;
+    Context->RemoteDomain = In->RemoteDomain;
+    Context->NumberPages = In->NumberPages;
+    Context->Flags = In->Flags;
+    Context->NotifyOffset = In->NotifyOffset;
+    Context->NotifyPort = In->NotifyPort;
+
+    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, NumberPages %lu, Flags 0x%x, Offset 0x%x, Port %d, Process %p, Id %lu\n",
+                       Context->RemoteDomain, Context->NumberPages, Context->Flags, Context->NotifyOffset, Context->NotifyPort,
+                       Context->Id.Process, Context->Id.RequestId);
+
+    // Check if the request ID is unique.
+    // This doesn't protect us from simultaneous requests with the same ID arriving here
+    // but another check for duplicate ID is performed when the context/IRP is queued at the end.
+    // Ideally we would lock the whole section but that's not really an option since we touch user memory.
+    status = STATUS_INVALID_PARAMETER;
+    if (FindGnttabIrp(Fdo, &Context->Id) != NULL)
+        goto fail4;
+
+    status = STATUS_NO_MEMORY;
+    Context->Grants = ExAllocatePoolWithTag(NonPagedPool, Context->NumberPages * sizeof(PXENBUS_GNTTAB_ENTRY), XENIFACE_POOL_TAG);
+    if (Context->Grants == NULL)
+        goto fail5;
+
+    RtlZeroMemory(Context->Grants, Context->NumberPages * sizeof(PXENBUS_GNTTAB_ENTRY));
+
+    // allocate memory to share
+    status = STATUS_NO_MEMORY;
+    Context->KernelVa = ExAllocatePoolWithTag(NonPagedPool, Context->NumberPages * PAGE_SIZE, XENIFACE_POOL_TAG);
+    if (Context->KernelVa == NULL)
+        goto fail6;
+
+    RtlZeroMemory(Context->KernelVa, Context->NumberPages * PAGE_SIZE);
+    Context->Mdl = IoAllocateMdl(Context->KernelVa, Context->NumberPages * PAGE_SIZE, FALSE, FALSE, NULL);
+    if (Context->Mdl == NULL)
+        goto fail7;
+
+    MmBuildMdlForNonPagedPool(Context->Mdl);
+    ASSERT(MmGetMdlByteCount(Context->Mdl) == Context->NumberPages * PAGE_SIZE);
+
+    // perform sharing
+    for (Page = 0; Page < Context->NumberPages; Page++) {
+        status = XENBUS_GNTTAB(PermitForeignAccess,
+                               &Fdo->GnttabInterface,
+                               Fdo->GnttabCache,
+                               FALSE,
+                               Context->RemoteDomain,
+                               MmGetMdlPfnArray(Context->Mdl)[Page],
+                               (Context->Flags & XENIFACE_GNTTAB_READONLY) != 0,
+                               &(Context->Grants[Page]));
+
+// prefast somehow thinks that this call can modify Page...
+#pragma prefast(suppress:6385)
+        XenIfaceDebugPrint(INFO, "Grants[%lu] = %p\n", Page, Context->Grants[Page]);
+        if (!NT_SUCCESS(status))
+            goto fail8;
+    }
+
+    // map into user mode
+#pragma prefast(suppress:6320) // we want to catch all exceptions
+    __try {
+        Context->UserVa = MmMapLockedPagesSpecifyCache(Context->Mdl, UserMode, MmCached, NULL, FALSE, NormalPagePriority);
+    }
+    __except (EXCEPTION_EXECUTE_HANDLER) {
+        status = GetExceptionCode();
+        goto fail9;
+    }
+
+    status = STATUS_UNSUCCESSFUL;
+    if (Context->UserVa == NULL)
+        goto fail10;
+
+    XenIfaceDebugPrint(TRACE, "< Context %p, Irp %p, KernelVa %p, UserVa %p\n", Context, Irp, Context->KernelVa, Context->UserVa);
+    
+    // Insert the IRP/context into the pending queue.
+    // This also checks (again) if the request ID is unique.
+    Irp->Tail.Overlay.DriverContext[0] = &Context->Id;
+    status = IoCsqInsertIrpEx(&Fdo->IrpQueue, Irp, NULL, &Context->Id);
+    if (!NT_SUCCESS(status))
+        goto fail11;
+
+    return STATUS_PENDING;
+
+fail11:
+    XenIfaceDebugPrint(ERROR, "Fail11\n");
+    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
+
+fail10:
+    XenIfaceDebugPrint(ERROR, "Fail10\n");
+
+fail9:
+    XenIfaceDebugPrint(ERROR, "Fail9\n");
+
+fail8:
+    XenIfaceDebugPrint(ERROR, "Fail8: Page = %lu\n", Page);
+
+    while (Page > 0) {
+        ASSERT(NT_SUCCESS(XENBUS_GNTTAB(RevokeForeignAccess,
+                                        &Fdo->GnttabInterface,
+                                        Fdo->GnttabCache,
+                                        FALSE,
+                                        Context->Grants[Page - 1])));
+
+        --Page;
+    }
+    IoFreeMdl(Context->Mdl);
+
+fail7:
+    XenIfaceDebugPrint(ERROR, "Fail7\n");
+    ExFreePoolWithTag(Context->KernelVa, XENIFACE_POOL_TAG);
+
+fail6:
+    XenIfaceDebugPrint(ERROR, "Fail6\n");
+    ExFreePoolWithTag(Context->Grants, XENIFACE_POOL_TAG);
+
+fail5:
+    XenIfaceDebugPrint(ERROR, "Fail5\n");
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabGetGrantResult(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_GNTTAB_GET_GRANT_RESULT_IN In = Buffer;
+    PXENIFACE_GNTTAB_GET_GRANT_RESULT_OUT Out = Buffer;
+    XENIFACE_CONTEXT_ID Id;
+    KIRQL Irql;
+    PIRP Irp;
+    PXENIFACE_CONTEXT_ID ContextId;
+    PXENIFACE_GRANT_CONTEXT Context;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_GNTTAB_GET_GRANT_RESULT_IN))
+        goto fail1;
+
+    Id.Process = PsGetCurrentProcess();
+    Id.RequestId = In->RequestId;
+    Id.Type = XENIFACE_CONTEXT_GRANT;
+
+    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process, Id.RequestId);
+
+    CsqAcquireLock(&Fdo->IrpQueue, &Irql);
+    Irp = CsqPeekNextIrp(&Fdo->IrpQueue, NULL, &Id);
+
+    status = STATUS_NOT_FOUND;
+    if (Irp == NULL)
+        goto fail2;
+
+    ContextId = Irp->Tail.Overlay.DriverContext[0];
+    Context = CONTAINING_RECORD(ContextId, XENIFACE_GRANT_CONTEXT, Id);
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (OutLen != (sizeof(XENIFACE_GNTTAB_GET_GRANT_RESULT_OUT) + sizeof(ULONG) * Context->NumberPages))
+        goto fail3;
+
+    Out->Address = Context->UserVa;
+    XenIfaceDebugPrint(TRACE, "< Address %p, Irp %p\n", Context->UserVa, Irp);
+
+    for (ULONG Page = 0; Page < Context->NumberPages; Page++) {
+        Out->References[Page] = XENBUS_GNTTAB(GetReference,
+                                              &Fdo->GnttabInterface,
+                                              Context->Grants[Page]);
+        XenIfaceDebugPrint(INFO, "Ref[%lu] = %lu\n", Page, Out->References[Page]);
+    }
+
+    CsqReleaseLock(&Fdo->IrpQueue, Irql);
+    *Info = OutLen;
+
+    return STATUS_SUCCESS;
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+    CsqReleaseLock(&Fdo->IrpQueue, Irql);
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+_IRQL_requires_max_(APC_LEVEL)
+VOID
+GnttabFreeGrant(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_GRANT_CONTEXT Context
+)
+{
+    NTSTATUS status;
+    ULONG Page;
+
+    ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
+
+    XenIfaceDebugPrint(TRACE, "Context %p\n", Context);
+
+    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) {
+        ((PCHAR)Context->KernelVa)[Context->NotifyOffset] = 0;
+    }
+
+    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_PORT) {
+        status = EvtchnNotify(Fdo, Context->NotifyPort, NULL);
+
+        if (!NT_SUCCESS(status)) // non-fatal, we must free memory
+            XenIfaceDebugPrint(ERROR, "failed to notify port %lu: 0x%x\n", Context->NotifyPort, status);
+    }
+
+    // unmap from user address space
+    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
+
+    // stop sharing
+    for (Page = 0; Page < Context->NumberPages; Page++) {
+        status = XENBUS_GNTTAB(RevokeForeignAccess,
+                               &Fdo->GnttabInterface,
+                               Fdo->GnttabCache,
+                               FALSE,
+                               Context->Grants[Page]);
+
+        ASSERT(NT_SUCCESS(status)); // failure here is fatal, something must've gone catastrophically wrong
+    }
+
+    IoFreeMdl(Context->Mdl);
+
+    RtlZeroMemory(Context->KernelVa, Context->NumberPages * PAGE_SIZE);
+    ExFreePoolWithTag(Context->KernelVa, XENIFACE_POOL_TAG);
+
+    RtlZeroMemory(Context->Grants, Context->NumberPages * sizeof(PXENBUS_GNTTAB_ENTRY));
+    ExFreePoolWithTag(Context->Grants, XENIFACE_POOL_TAG);
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabRevokeForeignAccess(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN In = Buffer;
+    PXENIFACE_GRANT_CONTEXT Context = NULL;
+    XENIFACE_CONTEXT_ID Id;
+    PIRP PendingIrp;
+    PXENIFACE_CONTEXT_ID ContextId;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN))
+        goto fail1;
+
+    Id.Type = XENIFACE_CONTEXT_GRANT;
+    Id.Process = PsGetCurrentProcess();
+    Id.RequestId = In->RequestId;
+
+    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process, Id.RequestId);
+
+    status = STATUS_NOT_FOUND;
+    PendingIrp = IoCsqRemoveNextIrp(&Fdo->IrpQueue, &Id);
+    if (PendingIrp == NULL)
+        goto fail2;
+
+    ContextId = PendingIrp->Tail.Overlay.DriverContext[0];
+    Context = CONTAINING_RECORD(ContextId, XENIFACE_GRANT_CONTEXT, Id);
+    GnttabFreeGrant(Fdo, Context);
+
+    PendingIrp->IoStatus.Status = STATUS_SUCCESS;
+    PendingIrp->IoStatus.Information = 0;
+    IoCompleteRequest(PendingIrp, IO_NO_INCREMENT);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabMapForeignPages(
+    __in     PXENIFACE_FDO     Fdo,
+    __in     PVOID             Buffer,
+    __in     ULONG             InLen,
+    __in     ULONG             OutLen,
+    __inout  PIRP           Irp
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN In = Buffer;
+    PXENIFACE_MAP_CONTEXT Context;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen < sizeof(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN) || OutLen != 0)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if ((In->NumberPages == 0) || (In->NumberPages > 1024 * 1024) ||
+        ((In->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) && (In->NotifyOffset >= In->NumberPages * PAGE_SIZE))
+        )
+        goto fail2;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN) + sizeof(ULONG) * In->NumberPages)
+        goto fail3;
+
+    status = STATUS_NO_MEMORY;
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_MAP_CONTEXT), XENIFACE_POOL_TAG);
+    if (Context == NULL)
+        goto fail4;
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
+    Context->Id.Type = XENIFACE_CONTEXT_MAP;
+    Context->Id.Process = PsGetCurrentProcess();
+    Context->Id.RequestId = In->RequestId;
+    Context->RemoteDomain = In->RemoteDomain;
+    Context->NumberPages = In->NumberPages;
+    Context->Flags = In->Flags;
+    Context->NotifyOffset = In->NotifyOffset;
+    Context->NotifyPort = In->NotifyPort;
+
+    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, NumberPages %lu, Flags 0x%x, Offset 0x%x, Port %d, Process %p, Id %lu\n",
+                       Context->RemoteDomain, Context->NumberPages, Context->Flags, Context->NotifyOffset, Context->NotifyPort,
+                       Context->Id.Process, Context->Id.RequestId);
+
+    for (ULONG i = 0; i < In->NumberPages; i++)
+        XenIfaceDebugPrint(INFO, "> Ref %d\n", In->References[i]);
+
+    status = STATUS_INVALID_PARAMETER;
+    if (FindGnttabIrp(Fdo, &Context->Id) != NULL)
+        goto fail5;
+
+    status = XENBUS_GNTTAB(MapForeignPages,
+                           &Fdo->GnttabInterface,
+                           Context->RemoteDomain,
+                           Context->NumberPages,
+                           In->References,
+                           Context->Flags & XENIFACE_GNTTAB_READONLY,
+                           &Context->Address);
+
+    if (!NT_SUCCESS(status))
+        goto fail6;
+
+    status = STATUS_NO_MEMORY;
+    Context->KernelVa = MmMapIoSpace(Context->Address, Context->NumberPages * PAGE_SIZE, MmCached);
+    if (Context->KernelVa == NULL)
+        goto fail7;
+
+    status = STATUS_NO_MEMORY;
+    Context->Mdl = IoAllocateMdl(Context->KernelVa, Context->NumberPages * PAGE_SIZE, FALSE, FALSE, NULL);
+    if (Context->Mdl == NULL)
+        goto fail8;
+
+    MmBuildMdlForNonPagedPool(Context->Mdl);
+
+    // map into user mode
+#pragma prefast(suppress: 6320) // we want to catch all exceptions
+    __try {
+        Context->UserVa = MmMapLockedPagesSpecifyCache(Context->Mdl, UserMode, MmCached, NULL, FALSE, NormalPagePriority);
+    }
+    __except (EXCEPTION_EXECUTE_HANDLER) {
+        status = GetExceptionCode();
+        goto fail9;
+    }
+
+    status = STATUS_UNSUCCESSFUL;
+    if (Context->UserVa == NULL)
+        goto fail10;
+
+    XenIfaceDebugPrint(TRACE, "< Context %p, Irp %p, Address %p, KernelVa %p, UserVa %p\n",
+                       Context, Irp, Context->Address, Context->KernelVa, Context->UserVa);
+
+    // Insert the IRP/context into the pending queue.
+    // This also checks (again) if the request ID is unique.
+    Irp->Tail.Overlay.DriverContext[0] = &Context->Id;
+    status = IoCsqInsertIrpEx(&Fdo->IrpQueue, Irp, NULL, &Context->Id);
+    if (!NT_SUCCESS(status))
+        goto fail11;
+
+    return STATUS_PENDING;
+
+fail11:
+    XenIfaceDebugPrint(ERROR, "Fail11\n");
+    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
+
+fail10:
+    XenIfaceDebugPrint(ERROR, "Fail10\n");
+
+fail9:
+    XenIfaceDebugPrint(ERROR, "Fail9\n");
+    IoFreeMdl(Context->Mdl);
+
+fail8:
+    XenIfaceDebugPrint(ERROR, "Fail8\n");
+    MmUnmapIoSpace(Context->KernelVa, Context->NumberPages * PAGE_SIZE);
+
+fail7:
+    XenIfaceDebugPrint(ERROR, "Fail7\n");
+    ASSERT(NT_SUCCESS(XENBUS_GNTTAB(UnmapForeignPages,
+                                    &Fdo->GnttabInterface,
+                                    Context->Address
+                                    )));
+
+fail6:
+    XenIfaceDebugPrint(ERROR, "Fail6\n");
+
+fail5:
+    XenIfaceDebugPrint(ERROR, "Fail5\n");
+    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabGetMapResult(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_GNTTAB_GET_MAP_RESULT_IN In = Buffer;
+    PXENIFACE_GNTTAB_GET_MAP_RESULT_OUT Out = Buffer;
+    XENIFACE_CONTEXT_ID Id;
+    KIRQL Irql;
+    PIRP Irp;
+    PXENIFACE_MAP_CONTEXT Context;
+    PXENIFACE_CONTEXT_ID ContextId;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_GNTTAB_GET_MAP_RESULT_IN) || OutLen != sizeof(XENIFACE_GNTTAB_GET_MAP_RESULT_OUT))
+        goto fail1;
+
+    Id.Type = XENIFACE_CONTEXT_MAP;
+    Id.Process = PsGetCurrentProcess();
+    Id.RequestId = In->RequestId;
+
+    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process, Id.RequestId);
+
+    CsqAcquireLock(&Fdo->IrpQueue, &Irql);
+    Irp = CsqPeekNextIrp(&Fdo->IrpQueue, NULL, &Id);
+
+    status = STATUS_NOT_FOUND;
+    if (Irp == NULL)
+        goto fail2;
+
+    ContextId = Irp->Tail.Overlay.DriverContext[0];
+    Context = CONTAINING_RECORD(ContextId, XENIFACE_MAP_CONTEXT, Id);
+
+    Out->Address = Context->UserVa;
+    XenIfaceDebugPrint(TRACE, "< Address %p, Irp %p\n", Context->UserVa, Irp);
+
+    CsqReleaseLock(&Fdo->IrpQueue, Irql);
+    *Info = OutLen;
+
+    return STATUS_SUCCESS;
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+    CsqReleaseLock(&Fdo->IrpQueue, Irql);
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+_IRQL_requires_max_(APC_LEVEL)
+DECLSPEC_NOINLINE
+VOID
+GnttabFreeMap(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_MAP_CONTEXT Context
+    )
+{
+    NTSTATUS status;
+
+    ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
+
+    XenIfaceDebugPrint(TRACE, "Context %p\n", Context);
+
+    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) {
+        ((PCHAR)Context->KernelVa)[Context->NotifyOffset] = 0;
+    }
+
+    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_PORT) {
+        status = EvtchnNotify(Fdo, Context->NotifyPort, NULL);
+
+        if (!NT_SUCCESS(status)) // non-fatal, we must free memory
+            XenIfaceDebugPrint(ERROR, "failed to notify port %lu: 0x%x\n", Context->NotifyPort, status);
+    }
+
+    // unmap from user address space
+    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
+
+    IoFreeMdl(Context->Mdl);
+
+    // unmap from system space
+    MmUnmapIoSpace(Context->KernelVa, Context->NumberPages * PAGE_SIZE);
+
+    // undo mapping
+    status = XENBUS_GNTTAB(UnmapForeignPages,
+                           &Fdo->GnttabInterface,
+                           Context->Address);
+
+    ASSERT(NT_SUCCESS(status));
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabUnmapForeignPages(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN In = Buffer;
+    PXENIFACE_MAP_CONTEXT Context = NULL;
+    XENIFACE_CONTEXT_ID Id;
+    PIRP PendingIrp;
+    PXENIFACE_CONTEXT_ID ContextId;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN) && OutLen != 0)
+        goto fail1;
+
+    Id.Type = XENIFACE_CONTEXT_MAP;
+    Id.Process = PsGetCurrentProcess();
+    Id.RequestId = In->RequestId;
+
+    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process, Id.RequestId);
+
+    status = STATUS_NOT_FOUND;
+    PendingIrp = IoCsqRemoveNextIrp(&Fdo->IrpQueue, &Id);
+    if (PendingIrp == NULL)
+        goto fail2;
+
+    ContextId = PendingIrp->Tail.Overlay.DriverContext[0];
+    Context = CONTAINING_RECORD(ContextId, XENIFACE_MAP_CONTEXT, Id);
+    GnttabFreeMap(Fdo, Context);
+
+    PendingIrp->IoStatus.Status = STATUS_SUCCESS;
+    PendingIrp->IoStatus.Information = 0;
+    IoCompleteRequest(PendingIrp, IO_NO_INCREMENT);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
diff --git a/src/xeniface/ioctl_store.c b/src/xeniface/ioctl_store.c
new file mode 100644
index 0000000..181c706
--- /dev/null
+++ b/src/xeniface/ioctl_store.c
@@ -0,0 +1,574 @@
+/* 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 "driver.h"
+#include "ioctls.h"
+#include "..\..\include\xeniface_ioctls.h"
+#include "log.h"
+
+#define XENSTORE_ABS_PATH_MAX 3072
+#define XENSTORE_REL_PATH_MAX 2048
+
+static
+NTSTATUS
+__CaptureUserBuffer(
+    __in  PVOID Buffer,
+    __in  ULONG Length,
+    __out PVOID *CapturedBuffer
+    )
+{
+    NTSTATUS Status;
+    PVOID TempBuffer = NULL;
+
+    if (Length == 0) {
+        *CapturedBuffer = NULL;
+        return STATUS_SUCCESS;
+    }
+
+    Status = STATUS_NO_MEMORY;
+    TempBuffer = ExAllocatePoolWithTag(NonPagedPool, Length, XENIFACE_POOL_TAG);
+    if (TempBuffer == NULL)
+        return STATUS_INSUFFICIENT_RESOURCES;
+
+    Status = STATUS_SUCCESS;
+
+#pragma prefast(suppress: 6320) // we want to catch all exceptions
+    try {
+        ProbeForRead(Buffer, Length, 1);
+        RtlCopyMemory(TempBuffer, Buffer, Length);
+    } except(EXCEPTION_EXECUTE_HANDLER) {
+        XenIfaceDebugPrint(ERROR, "Exception while probing/reading buffer at %p, size 0x%lx\n", Buffer, Length);
+        ExFreePoolWithTag(TempBuffer, XENIFACE_POOL_TAG);
+        TempBuffer = NULL;
+        Status = GetExceptionCode();
+    }
+
+    *CapturedBuffer = TempBuffer;
+
+    return Status;
+ }
+
+static
+VOID
+__FreeCapturedBuffer(
+    __in  PVOID CapturedBuffer
+    )
+{
+    if (CapturedBuffer != NULL) {
+        ExFreePoolWithTag(CapturedBuffer, XENIFACE_POOL_TAG);
+    }
+}
+
+static FORCEINLINE
+BOOLEAN
+__IsValidStr(
+    __in  PCHAR             Str,
+    __in  ULONG             Len
+    )
+{
+    for ( ; Len--; ++Str) {
+        if (*Str == '\0')
+            return TRUE;
+        if (!isprint((unsigned char)*Str))
+            break;
+    }
+    return FALSE;
+}
+
+static FORCEINLINE
+ULONG
+__MultiSzLen(
+    __in  PCHAR             Str,
+    __out PULONG            Count
+    )
+{
+    ULONG Length = 0;
+    if (Count)  *Count = 0;
+    do {
+        for ( ; *Str; ++Str, ++Length) ;
+        ++Str; ++Length;
+        if (*Count) ++(*Count);
+    } while (*Str);
+    return Length;
+}
+
+static FORCEINLINE
+VOID
+__DisplayMultiSz(
+    __in PCHAR              Caller,
+    __in PCHAR              Str
+    )
+{
+    PCHAR   Ptr;
+    ULONG   Idx;
+    ULONG   Len;
+
+    for (Ptr = Str, Idx = 0; *Ptr; ++Idx) {
+        Len = (ULONG)strlen(Ptr);
+        XenIfaceDebugPrint(TRACE, "|%s: [%d]=(%d)->\"%s\"\n", Caller, Idx, Len, Ptr);
+        Ptr += (Len + 1);
+    }
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRead(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS    status;
+    PCHAR       Value;
+    ULONG       Length;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen == 0)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (!__IsValidStr(Buffer, InLen))
+        goto fail2;
+
+    status = XENBUS_STORE(Read, &Fdo->StoreInterface, NULL, NULL, Buffer, &Value);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    Length = (ULONG)strlen(Value) + 1;
+
+    status = STATUS_BUFFER_OVERFLOW;
+    if (OutLen == 0) {
+        XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)\n", Buffer, Length);
+        goto done;
+    }
+
+    status = STATUS_INVALID_PARAMETER;
+    if (OutLen < Length)
+        goto fail4;
+
+    XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)->\"%s\"\n", Buffer, Length, Value);
+
+    RtlCopyMemory(Buffer, Value, Length);
+    Buffer[Length - 1] = 0;
+    status = STATUS_SUCCESS;
+
+done:
+    *Info = (ULONG_PTR)Length;
+    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
+    return status;
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")=(%d < %d)\n", Buffer, OutLen, Length);
+    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreWrite(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    )
+{
+    NTSTATUS    status;
+    PCHAR       Value;
+    ULONG       Length;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen == 0 || OutLen != 0)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (!__IsValidStr(Buffer, InLen))
+        goto fail2;
+
+    Length = (ULONG)strlen(Buffer) + 1;
+    Value = Buffer + Length;
+
+    if (!__IsValidStr(Value, InLen - Length))
+        goto fail3;
+
+    status = XENBUS_STORE(Printf, &Fdo->StoreInterface, NULL, NULL, Buffer, Value);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+    XenIfaceDebugPrint(TRACE, "(\"%s\"=\"%s\")\n", Buffer, Value);
+    return status;
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")\n", Value);
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreDirectory(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS    status;
+    PCHAR       Value;
+    ULONG       Length;
+    ULONG       Count;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen == 0)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (!__IsValidStr(Buffer, InLen))
+        goto fail2;
+
+    status = XENBUS_STORE(Directory, &Fdo->StoreInterface, NULL, NULL, Buffer, &Value);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    Length = __MultiSzLen(Value, &Count) + 1;
+
+    status = STATUS_BUFFER_OVERFLOW;
+    if (OutLen == 0) {
+        XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)(%d)\n", Buffer, Length, Count);
+        goto done;
+    }
+
+    status = STATUS_INVALID_PARAMETER;
+    if (OutLen < Length)
+        goto fail4;
+
+    XenIfaceDebugPrint(INFO, "(\"%s\")=(%d)(%d)\n", Buffer, Length, Count);
+#if DBG
+    __DisplayMultiSz(__FUNCTION__, Value);
+#endif
+
+    RtlCopyMemory(Buffer, Value, Length);
+    Buffer[Length - 2] = 0;
+    Buffer[Length - 1] = 0;
+    status = STATUS_SUCCESS;
+
+done:
+    *Info = (ULONG_PTR)Length;
+    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
+    return status;
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")=(%d < %d)\n", Buffer, OutLen, Length);
+    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRemove(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    )
+{
+    NTSTATUS    status;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen == 0 || OutLen != 0)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (!__IsValidStr(Buffer, InLen))
+        goto fail2;
+
+    status = XENBUS_STORE(Remove, &Fdo->StoreInterface, NULL, NULL, Buffer);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    XenIfaceDebugPrint(TRACE, "(\"%s\")\n", Buffer);
+    return status;
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreSetPermissions(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_STORE_SET_PERMISSIONS_IN In = Buffer;
+    ULONG Index;
+    PCHAR Path;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen < sizeof(XENIFACE_STORE_SET_PERMISSIONS_IN) || OutLen != 0)
+        goto fail1;
+
+    if (InLen < sizeof(XENIFACE_STORE_SET_PERMISSIONS_IN) + In->NumberPermissions * sizeof(XENBUS_STORE_PERMISSION))
+        goto fail2;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (In->PathLength == 0 || In->PathLength > XENSTORE_ABS_PATH_MAX)
+        goto fail3;
+
+    status = __CaptureUserBuffer(In->Path, In->PathLength, &Path);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+    Path[In->PathLength - 1] = 0;
+    XenIfaceDebugPrint(TRACE, "> Path '%s', NumberPermissions %lu\n", Path, In->NumberPermissions);
+
+    for (Index = 0; Index < In->NumberPermissions; Index++) {
+        XenIfaceDebugPrint(TRACE, "> %lu: Domain %d, Mask 0x%x\n", Index, In->Permissions[Index].Domain, In->Permissions[Index].Mask);
+        if ((In->Permissions[Index].Mask & ~XENIFACE_STORE_ALLOWED_PERMISSIONS) != 0)
+            goto fail5;
+    }
+
+    status = XENBUS_STORE(PermissionsSet,
+                          &Fdo->StoreInterface,
+                          NULL, // transaction
+                          NULL, // prefix
+                          Path,
+                          In->Permissions,
+                          In->NumberPermissions);
+
+    if (!NT_SUCCESS(status))
+        goto fail6;
+
+    __FreeCapturedBuffer(Path);
+    return status;
+
+fail6:
+    XenIfaceDebugPrint(ERROR, "Fail6\n");
+fail5:
+    XenIfaceDebugPrint(ERROR, "Fail5\n");
+    __FreeCapturedBuffer(Path);
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreAddWatch(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_STORE_ADD_WATCH_IN In = Buffer;
+    PXENIFACE_STORE_ADD_WATCH_OUT Out = Buffer;
+    PCHAR Path;
+    PXENIFACE_STORE_CONTEXT Context;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_STORE_ADD_WATCH_IN) || OutLen != sizeof(XENIFACE_STORE_ADD_WATCH_OUT))
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (In->PathLength == 0 || In->PathLength > XENSTORE_ABS_PATH_MAX)
+        goto fail2;
+
+    status = __CaptureUserBuffer(In->Path, In->PathLength, &Path);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    Path[In->PathLength - 1] = 0;
+
+    status = STATUS_NO_MEMORY;
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_STORE_CONTEXT), XENIFACE_POOL_TAG);
+    if (Context == NULL)
+        goto fail4;
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
+
+    Context->FileObject = FileObject;
+
+    status = ObReferenceObjectByHandle(In->Event, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode, &Context->Event, NULL);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
+    XenIfaceDebugPrint(TRACE, "> Path '%s', Event %p, FO %p\n", Path, In->Event, FileObject);
+
+    status = XENBUS_STORE(WatchAdd,
+                          &Fdo->StoreInterface,
+                          NULL, // prefix
+                          Path,
+                          Context->Event,
+                          &Context->Watch);
+
+    if (!NT_SUCCESS(status))
+        goto fail6;
+
+    __FreeCapturedBuffer(Path);
+
+    ExInterlockedInsertTailList(&Fdo->StoreWatchList, &Context->Entry, &Fdo->StoreWatchLock);
+
+    XenIfaceDebugPrint(TRACE, "< Context %p, Watch %p\n", Context, Context->Watch);
+
+    Out->Context = Context;
+    *Info = sizeof(XENIFACE_STORE_ADD_WATCH_OUT);
+
+    return status;
+
+fail6:
+    XenIfaceDebugPrint(ERROR, "Fail6\n");
+    ObDereferenceObject(Context->Event);
+fail5:
+    XenIfaceDebugPrint(ERROR, "Fail5\n");
+    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+    __FreeCapturedBuffer(Path);
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+_IRQL_requires_max_(DISPATCH_LEVEL)
+VOID
+StoreFreeWatch(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_STORE_CONTEXT Context
+    )
+{
+    NTSTATUS status;
+
+    XenIfaceDebugPrint(TRACE, "Context %p, Watch %p, FO %p\n",
+                       Context, Context->Watch, Context->FileObject);
+
+    status = XENBUS_STORE(WatchRemove,
+                          &Fdo->StoreInterface,
+                          Context->Watch);
+
+    ASSERT(NT_SUCCESS(status)); // this is fatal since we'd leave an active watch without cleaning it up
+
+    ObDereferenceObject(Context->Event);
+    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRemoveWatch(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_STORE_REMOVE_WATCH_IN In = Buffer;
+    PXENIFACE_STORE_CONTEXT Context = NULL;
+    KIRQL Irql;
+    PLIST_ENTRY Node;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_STORE_REMOVE_WATCH_IN) || OutLen != 0)
+        goto fail1;
+
+    XenIfaceDebugPrint(TRACE, "> Context %p, FO %p\n", In->Context, FileObject);
+
+    KeAcquireSpinLock(&Fdo->StoreWatchLock, &Irql);
+    Node = Fdo->StoreWatchList.Flink;
+    while (Node->Flink != Fdo->StoreWatchList.Flink) {
+        Context = CONTAINING_RECORD(Node, XENIFACE_STORE_CONTEXT, Entry);
+
+        Node = Node->Flink;
+        if (Context != In->Context || Context->FileObject != FileObject)
+            continue;
+
+        RemoveEntryList(&Context->Entry);
+        break;
+    }
+    KeReleaseSpinLock(&Fdo->StoreWatchLock, Irql);
+
+    status = STATUS_NOT_FOUND;
+    if (Context == NULL || Context != In->Context)
+        goto fail2;
+
+    StoreFreeWatch(Fdo, Context);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
diff --git a/src/xeniface/ioctls.c b/src/xeniface/ioctls.c
index 3bef9ea..e20b7dc 100644
--- a/src/xeniface/ioctls.c
+++ b/src/xeniface/ioctls.c
@@ -35,287 +35,156 @@
 #include "..\..\include\xeniface_ioctls.h"
 #include "log.h"
 
-static FORCEINLINE BOOLEAN
-__IsValidStr(
-    __in  PCHAR             Str,
-    __in  ULONG             Len
-    )
-{
-    for ( ; Len--; ++Str) {
-        if (*Str == '\0')
-            return TRUE;
-        if (!isprint((unsigned char)*Str))
-            break;
-    }
-    return FALSE;
-}
-static FORCEINLINE ULONG
-__MultiSzLen(
-    __in  PCHAR             Str,
-    __out PULONG            Count
-    )
-{
-    ULONG Length = 0;
-    if (Count)  *Count = 0;
-    do {
-        for ( ; *Str; ++Str, ++Length) ;
-        ++Str; ++Length;
-        if (*Count) ++(*Count);
-    } while (*Str);
-    return Length;
-}
-static FORCEINLINE VOID
-__DisplayMultiSz(
-    __in PCHAR              Caller,
-    __in PCHAR              Str
-    )
-{
-    PCHAR   Ptr;
-    ULONG   Idx;
-    ULONG   Len;
-
-    for (Ptr = Str, Idx = 0; *Ptr; ++Idx) {
-        Len = (ULONG)strlen(Ptr);
-        XenIfaceDebugPrint(INFO, "|%s: [%d]=(%d)->\"%s\"\n", Caller, Idx, Len, Ptr);
-        Ptr += (Len + 1);
-    }
-}
-
-
-static DECLSPEC_NOINLINE NTSTATUS
-IoctlRead(
+// Cleanup store watches and event channels, called on file object close.
+_IRQL_requires_(PASSIVE_LEVEL) // EvtchnFree calls KeFlushQueuedDpcs
+VOID
+XenIfaceCleanup(
     __in  PXENIFACE_FDO         Fdo,
-    __in  PCHAR             Buffer,
-    __in  ULONG             InLen,
-    __in  ULONG             OutLen,
-    __out PULONG_PTR        Info
+    __in  PFILE_OBJECT  FileObject
     )
 {
-    NTSTATUS    status;
-    PCHAR       Value;
-    ULONG       Length;
-
-    status = STATUS_INVALID_BUFFER_SIZE;
-    if (InLen == 0)
-        goto fail1;
-
-    status = STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
-        goto fail2;
-
-    status = XENBUS_STORE(Read, &Fdo->StoreInterface, NULL, NULL, Buffer, &Value);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
-    Length = (ULONG)strlen(Value) + 1;
-
-    status = STATUS_BUFFER_OVERFLOW;
-    if (OutLen == 0) {
-        XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)\n", __FUNCTION__, Buffer, Length);
-        goto done;
+    PLIST_ENTRY Node;
+    PXENIFACE_STORE_CONTEXT StoreContext;
+    PXENIFACE_EVTCHN_CONTEXT EvtchnContext;
+    KIRQL Irql;
+    LIST_ENTRY ToFree;
+
+    XenIfaceDebugPrint(TRACE, "FO %p, IRQL %d, Cpu %lu\n", FileObject, KeGetCurrentIrql(), KeGetCurrentProcessorNumber());
+
+    // store watches
+    KeAcquireSpinLock(&Fdo->StoreWatchLock, &Irql);
+    Node = Fdo->StoreWatchList.Flink;
+    while (Node->Flink != Fdo->StoreWatchList.Flink) {
+        StoreContext = CONTAINING_RECORD(Node, XENIFACE_STORE_CONTEXT, Entry);
+
+        Node = Node->Flink;
+        if (StoreContext->FileObject != FileObject)
+            continue;
+
+        XenIfaceDebugPrint(TRACE, "Store context %p\n", StoreContext);
+        RemoveEntryList(&StoreContext->Entry);
+        StoreFreeWatch(Fdo, StoreContext);
     } 
+    KeReleaseSpinLock(&Fdo->StoreWatchLock, Irql);
     
-    status = STATUS_INVALID_PARAMETER;
-    if (OutLen < Length)
-        goto fail4;
-
-    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)->\"%s\"\n", __FUNCTION__, Buffer, Length, Value);
-
-    RtlCopyMemory(Buffer, Value, Length);
-    Buffer[Length - 1] = 0;
-    status = STATUS_SUCCESS;
+    // event channels
+    InitializeListHead(&ToFree);
+    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
+    Node = Fdo->EvtchnList.Flink;
+    while (Node->Flink != Fdo->EvtchnList.Flink) {
+        EvtchnContext = CONTAINING_RECORD(Node, XENIFACE_EVTCHN_CONTEXT, Entry);
+
+        Node = Node->Flink;
+        if (EvtchnContext->FileObject != FileObject)
+            continue;
+
+        XenIfaceDebugPrint(TRACE, "Evtchn context %p\n", EvtchnContext);
+        RemoveEntryList(&EvtchnContext->Entry);
+        // EvtchnFree requires PASSIVE_LEVEL and we're inside a lock
+        InsertTailList(&ToFree, &EvtchnContext->Entry);
+    }
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
 
-done:
-    *Info = (ULONG_PTR)Length;
-    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
-    return status;
+    Node = ToFree.Flink;
+    while (Node->Flink != ToFree.Flink) {
+        EvtchnContext = CONTAINING_RECORD(Node, XENIFACE_EVTCHN_CONTEXT, Entry);
+        Node = Node->Flink;
 
-fail4:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")=(%d < %d)\n", __FUNCTION__, Buffer, OutLen, Length);
-    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
-fail3:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__, Buffer);
-fail2:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
-fail1:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__, status);
-    return status;
+        RemoveEntryList(&EvtchnContext->Entry);
+        EvtchnFree(Fdo, EvtchnContext);
 }
-
-static DECLSPEC_NOINLINE NTSTATUS
-IoctlWrite(
-    __in  PXENIFACE_FDO         Fdo,
-    __in  PCHAR             Buffer,
-    __in  ULONG             InLen,
-    __in  ULONG             OutLen
-    )
-{
-    NTSTATUS    status;
-    PCHAR       Value;
-    ULONG       Length;
-
-    status = STATUS_INVALID_BUFFER_SIZE;
-    if (InLen == 0 || OutLen != 0)
-        goto fail1;
-
-    status = STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
-        goto fail2;
-
-    Length = (ULONG)strlen(Buffer) + 1;
-    Value = Buffer + Length;
-
-    if (!__IsValidStr(Value, InLen - Length))
-        goto fail3;
-
-    status = XENBUS_STORE(Printf, &Fdo->StoreInterface, NULL, NULL, Buffer, Value);
-    if (!NT_SUCCESS(status))
-        goto fail4;
-
-    XenIfaceDebugPrint(INFO, "|%s: (\"%s\"=\"%s\")\n", __FUNCTION__, Buffer, Value);
-    return status;
-
-fail4:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")\n", __FUNCTION__, Value);
-fail3:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__, Buffer);
-fail2:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
-fail1:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__, status);
-    return status;
 }
 
-static DECLSPEC_NOINLINE NTSTATUS
-IoctlDirectory(
+NTSTATUS
+XenIfaceIoctl(
     __in  PXENIFACE_FDO         Fdo,
-    __in  PCHAR             Buffer,
-    __in  ULONG             InLen,
-    __in  ULONG             OutLen,
-    __out PULONG_PTR        Info
+    __inout  PIRP              Irp
     )
 {
     NTSTATUS    status;
-    PCHAR       Value;
-    ULONG       Length;
-    ULONG       Count;
-
-    status = STATUS_INVALID_BUFFER_SIZE;
-    if (InLen == 0)
-        goto fail1;
-
-    status = STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
-        goto fail2;
-
-    status = XENBUS_STORE(Directory, &Fdo->StoreInterface, NULL, NULL, Buffer, &Value);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
-    Length = __MultiSzLen(Value, &Count) + 1;
+    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
+    PVOID               Buffer = Irp->AssociatedIrp.SystemBuffer;
+    ULONG               InLen = Stack->Parameters.DeviceIoControl.InputBufferLength;
+    ULONG               OutLen = Stack->Parameters.DeviceIoControl.OutputBufferLength;
 
-    status = STATUS_BUFFER_OVERFLOW;
-    if (OutLen == 0) {
-        XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)(%d)\n", __FUNCTION__, Buffer, Length, Count);
+    status = STATUS_DEVICE_NOT_READY;
+    if (Fdo->InterfacesAcquired == FALSE)
         goto done;
-    } 
 
-    status = STATUS_INVALID_PARAMETER;
-    if (OutLen < Length)
-        goto fail4;
+    switch (Stack->Parameters.DeviceIoControl.IoControlCode) {
+        // store
+    case IOCTL_XENIFACE_STORE_READ:
+        status = IoctlStoreRead(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp->IoStatus.Information);
+        break;
 
-    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)(%d)\n", __FUNCTION__, Buffer, Length, Count);
-#if DBG
-    __DisplayMultiSz(__FUNCTION__, Value);
-#endif
+    case IOCTL_XENIFACE_STORE_WRITE:
+        status = IoctlStoreWrite(Fdo, (PCHAR)Buffer, InLen, OutLen);
+        break;
 
-    RtlCopyMemory(Buffer, Value, Length);
-    Buffer[Length - 2] = 0;
-    Buffer[Length - 1] = 0;
-    status = STATUS_SUCCESS;
+    case IOCTL_XENIFACE_STORE_DIRECTORY:
+        status = IoctlStoreDirectory(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp->IoStatus.Information);
+        break;
 
-done:
-    *Info = (ULONG_PTR)Length;
-    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
-    return status;
+    case IOCTL_XENIFACE_STORE_REMOVE:
+        status = IoctlStoreRemove(Fdo, (PCHAR)Buffer, InLen, OutLen);
+        break;
 
-fail4:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")=(%d < %d)\n", __FUNCTION__, Buffer, OutLen, Length);
-    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
-fail3:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__, Buffer);
-fail2:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
-fail1:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__, status);
-    return status;
-}
+    case IOCTL_XENIFACE_STORE_SET_PERMISSIONS:
+        status = IoctlStoreSetPermissions(Fdo, Buffer, InLen, OutLen);
+        break;
 
-static DECLSPEC_NOINLINE NTSTATUS
-IoctlRemove(
-    __in  PXENIFACE_FDO         Fdo,
-    __in  PCHAR             Buffer,
-    __in  ULONG             InLen,
-    __in  ULONG             OutLen
-    )
-{
-    NTSTATUS    status;
+    case IOCTL_XENIFACE_STORE_ADD_WATCH:
+        status = IoctlStoreAddWatch(Fdo, Buffer, InLen, OutLen, Stack->FileObject, &Irp->IoStatus.Information);
+        break;
 
-    status = STATUS_INVALID_BUFFER_SIZE;
-    if (InLen == 0 || OutLen != 0)
-        goto fail1;
+    case IOCTL_XENIFACE_STORE_REMOVE_WATCH:
+        status = IoctlStoreRemoveWatch(Fdo, Buffer, InLen, OutLen, Stack->FileObject);
+        break;
 
-    status = STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
-        goto fail2;
+        // evtchn
+    case IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND:
+        status = IoctlEvtchnBindUnbound(Fdo, Buffer, InLen, OutLen, Stack->FileObject, &Irp->IoStatus.Information);
+        break;
 
-    status = XENBUS_STORE(Remove, &Fdo->StoreInterface, NULL, NULL, Buffer);
-    if (!NT_SUCCESS(status))
-        goto fail3;
+    case IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN:
+        status = IoctlEvtchnBindInterdomain(Fdo, Buffer, InLen, OutLen, Stack->FileObject, &Irp->IoStatus.Information);
+        break;
 
-    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")\n", __FUNCTION__, Buffer);
-    return status;
+    case IOCTL_XENIFACE_EVTCHN_CLOSE:
+        status = IoctlEvtchnClose(Fdo, Buffer, InLen, OutLen, Stack->FileObject);
+        break;
 
-fail3:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__, Buffer);
-fail2:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
-fail1:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__, status);
-    return status;
-}
+    case IOCTL_XENIFACE_EVTCHN_NOTIFY:
+        status = IoctlEvtchnNotify(Fdo, Buffer, InLen, OutLen, Stack->FileObject);
+        break;
 
-NTSTATUS
-XenIFaceIoctl(
-    __in  PXENIFACE_FDO         Fdo,
-    __in  PIRP              Irp
-    )
-{
-    NTSTATUS            status;
-    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
-    PVOID               Buffer = Irp->AssociatedIrp.SystemBuffer;
-    ULONG               InLen = Stack->Parameters.DeviceIoControl.InputBufferLength;
-    ULONG               OutLen = Stack->Parameters.DeviceIoControl.OutputBufferLength;
+    case IOCTL_XENIFACE_EVTCHN_UNMASK:
+        status = IoctlEvtchnUnmask(Fdo, Buffer, InLen, OutLen, Stack->FileObject);
+        break;
 
-    status = STATUS_DEVICE_NOT_READY;
-    if (Fdo->InterfacesAcquired == FALSE)
-        goto done;
+        // gnttab
+    case IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS:
+        status = IoctlGnttabPermitForeignAccess(Fdo, Buffer, InLen, OutLen, Irp);
+        break;
 
-    switch (Stack->Parameters.DeviceIoControl.IoControlCode) {
-    case IOCTL_XENIFACE_STORE_READ:
-        status = IoctlRead(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp->IoStatus.Information);
+    case IOCTL_XENIFACE_GNTTAB_GET_GRANT_RESULT:
+        status = IoctlGnttabGetGrantResult(Fdo, Buffer, InLen, OutLen, &Irp->IoStatus.Information);
         break;
 
-    case IOCTL_XENIFACE_STORE_WRITE:
-        status = IoctlWrite(Fdo, (PCHAR)Buffer, InLen, OutLen);
+    case IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS:
+        status = IoctlGnttabRevokeForeignAccess(Fdo, Buffer, InLen, OutLen);
         break;
 
-    case IOCTL_XENIFACE_STORE_DIRECTORY:
-        status = IoctlDirectory(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp->IoStatus.Information);
+    case IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES:
+        status = IoctlGnttabMapForeignPages(Fdo, Buffer, InLen, OutLen, Irp);
         break;
 
-    case IOCTL_XENIFACE_STORE_REMOVE:
-        status = IoctlRemove(Fdo, (PCHAR)Buffer, InLen, OutLen);
+    case IOCTL_XENIFACE_GNTTAB_GET_MAP_RESULT:
+        status = IoctlGnttabGetMapResult(Fdo, Buffer, InLen, OutLen, &Irp->IoStatus.Information);
+        break;
+
+    case IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES:
+        status = IoctlGnttabUnmapForeignPages(Fdo, Buffer, InLen, OutLen);
         break;
 
     default:
@@ -327,6 +196,7 @@ done:
 
 	Irp->IoStatus.Status = status;
 
+    if (status != STATUS_PENDING)
 	IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
     return status;
diff --git a/src/xeniface/ioctls.h b/src/xeniface/ioctls.h
index 7ee7801..00e11e4 100644
--- a/src/xeniface/ioctls.h
+++ b/src/xeniface/ioctls.h
@@ -33,11 +33,322 @@
 #define _IOCTLS_H_
 
 #define XENIFACE_KERNEL_MODE
+#include "xeniface_ioctls.h"
 
+typedef enum _XENIFACE_CONTEXT_TYPE {
+    XENIFACE_CONTEXT_GRANT = 1,
+    XENIFACE_CONTEXT_MAP
+} XENIFACE_CONTEXT_TYPE;
+
+typedef struct _XENIFACE_CONTEXT_ID {
+    XENIFACE_CONTEXT_TYPE  Type;
+    ULONG                  RequestId;
+    PEPROCESS              Process;
+} XENIFACE_CONTEXT_ID, *PXENIFACE_CONTEXT_ID;
+
+typedef struct _XENIFACE_STORE_CONTEXT {
+    LIST_ENTRY             Entry;
+    PXENBUS_STORE_WATCH    Watch;
+    PKEVENT                Event;
+    PVOID                  FileObject;
+} XENIFACE_STORE_CONTEXT, *PXENIFACE_STORE_CONTEXT;
+
+typedef struct _XENIFACE_EVTCHN_CONTEXT {
+    LIST_ENTRY             Entry;
+    PXENBUS_EVTCHN_CHANNEL Channel;
+    ULONG                  LocalPort;
+    PKEVENT                Event;
+    PXENIFACE_FDO          Fdo;
+    BOOLEAN                Active;
+    PVOID                  FileObject;
+} XENIFACE_EVTCHN_CONTEXT, *PXENIFACE_EVTCHN_CONTEXT;
+
+typedef struct _XENIFACE_GRANT_CONTEXT {
+    XENIFACE_CONTEXT_ID        Id;
+    LIST_ENTRY                 Entry;
+    PXENBUS_GNTTAB_ENTRY       *Grants;
+    USHORT                     RemoteDomain;
+    ULONG                      NumberPages;
+    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
+    ULONG                      NotifyOffset;
+    ULONG                      NotifyPort;
+    PVOID                      KernelVa;
+    PVOID                      UserVa;
+    PMDL                       Mdl;
+} XENIFACE_GRANT_CONTEXT, *PXENIFACE_GRANT_CONTEXT;
+
+typedef struct _XENIFACE_MAP_CONTEXT {
+    XENIFACE_CONTEXT_ID        Id;
+    LIST_ENTRY                 Entry;
+    USHORT                     RemoteDomain;
+    ULONG                      NumberPages;
+    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
+    ULONG                      NotifyOffset;
+    ULONG                      NotifyPort;
+    PHYSICAL_ADDRESS           Address;
+    PVOID                      KernelVa;
+    PVOID                      UserVa;
+    PMDL                       Mdl;
+} XENIFACE_MAP_CONTEXT, *PXENIFACE_MAP_CONTEXT;
+
+NTSTATUS
+XenIfaceIoctl(
+    __in     PXENIFACE_FDO     Fdo,
+    __inout  PIRP              Irp
+    );
+
+_IRQL_requires_(PASSIVE_LEVEL)
+VOID
+XenIfaceCleanup(
+    __in  PXENIFACE_FDO Fdo,
+    __in  PFILE_OBJECT  FileObject
+    );
+
+DECLSPEC_NOINLINE
 NTSTATUS
-XenIFaceIoctl(
+IoctlStoreRead(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreWrite(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreDirectory(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRemove(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreSetPermissions(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreAddWatch(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRemoveWatch(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    );
+
+_IRQL_requires_max_(DISPATCH_LEVEL)
+VOID
+StoreFreeWatch(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_STORE_CONTEXT Context
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnBindUnbound(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnBindInterdomain(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnClose(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnNotify(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnUnmask(
     __in  PXENIFACE_FDO         Fdo,
-    __in  PIRP              Irp
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    );
+
+_Requires_lock_not_held_(Fdo->EvtchnLock)
+DECLSPEC_NOINLINE
+NTSTATUS
+EvtchnNotify(
+    __in      PXENIFACE_FDO Fdo,
+    __in      ULONG         LocalPort,
+    __in_opt  PFILE_OBJECT  FileObject
+    );
+
+_Function_class_(KDEFERRED_ROUTINE)
+_IRQL_requires_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+VOID
+EvtchnNotificationDpc(
+    __in      PKDPC Dpc,
+    __in_opt  PVOID Context,
+    __in_opt  PVOID Argument1,
+    __in_opt  PVOID Argument2
+    );
+
+_IRQL_requires_(PASSIVE_LEVEL)
+VOID
+EvtchnFree(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_EVTCHN_CONTEXT Context
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabPermitForeignAccess(
+    __in     PXENIFACE_FDO  Fdo,
+    __in     PVOID          Buffer,
+    __in     ULONG          InLen,
+    __in     ULONG          OutLen,
+    __inout  PIRP           Irp
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabGetGrantResult(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabRevokeForeignAccess(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabMapForeignPages(
+    __in     PXENIFACE_FDO     Fdo,
+    __in     PVOID             Buffer,
+    __in     ULONG             InLen,
+    __in     ULONG             OutLen,
+    __inout  PIRP              Irp
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabGetMapResult(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabUnmapForeignPages(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    );
+
+_Acquires_exclusive_lock_(((PXENIFACE_FDO)Argument)->GnttabCacheLock)
+_IRQL_requires_(DISPATCH_LEVEL)
+VOID
+GnttabAcquireLock(
+    __in  PVOID Argument
+    );
+
+_Releases_exclusive_lock_(((PXENIFACE_FDO)Argument)->GnttabCacheLock)
+_IRQL_requires_(DISPATCH_LEVEL)
+VOID
+GnttabReleaseLock(
+    __in  PVOID Argument
+    );
+
+_Function_class_(IO_WORKITEM_ROUTINE)
+VOID
+CompleteGnttabIrp(
+    __in      PDEVICE_OBJECT DeviceObject,
+    __in_opt  PVOID          Context
+    );
+
+_IRQL_requires_max_(APC_LEVEL)
+VOID
+GnttabFreeGrant(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_GRANT_CONTEXT Context
+    );
+
+_IRQL_requires_max_(APC_LEVEL)
+VOID
+GnttabFreeMap(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_MAP_CONTEXT Context
     );
 
 #endif // _IOCTLS_H_
diff --git a/src/xeniface/irp_queue.c b/src/xeniface/irp_queue.c
new file mode 100644
index 0000000..c3bf86c
--- /dev/null
+++ b/src/xeniface/irp_queue.c
@@ -0,0 +1,131 @@
+#include "driver.h"
+#include "irp_queue.h"
+#include "log.h"
+#include "ioctls.h"
+
+// Cancel-safe IRP queue implementation
+
+NTSTATUS
+CsqInsertIrpEx(
+    _In_  PIO_CSQ Csq,
+    _In_  PIRP    Irp,
+    _In_  PVOID   InsertContext // PXENIFACE_CONTEXT_ID
+    )
+{
+    PXENIFACE_FDO Fdo;
+
+    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
+
+    // Fail if a request with the same ID already exists.
+    if (CsqPeekNextIrp(Csq, NULL, InsertContext) != NULL)
+        return STATUS_INVALID_PARAMETER;
+
+    InsertTailList(&Fdo->IrpList, &Irp->Tail.Overlay.ListEntry);
+    return STATUS_SUCCESS;
+}
+
+VOID
+CsqRemoveIrp(
+    _In_  PIO_CSQ Csq,
+    _In_  PIRP    Irp
+    )
+{
+    UNREFERENCED_PARAMETER(Csq);
+
+    RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
+}
+
+PIRP
+CsqPeekNextIrp(
+    _In_      PIO_CSQ Csq,
+    _In_opt_  PIRP    Irp,
+    _In_opt_  PVOID   PeekContext // PXENIFACE_CONTEXT_ID
+    )
+{
+    PXENIFACE_FDO        Fdo;
+    PIRP                 NextIrp = NULL;
+    PLIST_ENTRY          Head, NextEntry;
+    PXENIFACE_CONTEXT_ID Id, TargetId;
+
+    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
+    TargetId = PeekContext;
+    Head = &Fdo->IrpList;
+
+    // If the IRP is NULL, we will start peeking from the list head,
+    // else we will start from that IRP onwards. This is done under the
+    // assumption that new IRPs are always inserted at the tail.
+
+    if (Irp == NULL) {
+        NextEntry = Head->Flink;
+    } else {
+        NextEntry = Irp->Tail.Overlay.ListEntry.Flink;
+    }
+
+    while (NextEntry != Head) {
+        NextIrp = CONTAINING_RECORD(NextEntry, IRP, Tail.Overlay.ListEntry);
+
+        if (PeekContext) {
+            Id = NextIrp->Tail.Overlay.DriverContext[0];
+            if (Id->RequestId == TargetId->RequestId && Id->Process == TargetId->Process)
+                break;
+        } else {
+            break;
+        }
+        NextIrp = NULL;
+        NextEntry = NextEntry->Flink;
+    }
+
+    return NextIrp;
+}
+
+_IRQL_raises_(DISPATCH_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_Acquires_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)->IrpQueueLock)
+VOID
+CsqAcquireLock(
+    _In_                                       PIO_CSQ Csq,
+    _Out_ _At_(*Irql, _Post_ _IRQL_saves_)     PKIRQL  Irql
+    )
+{
+    PXENIFACE_FDO Fdo;
+
+    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
+
+    KeAcquireSpinLock(&Fdo->IrpQueueLock, Irql);
+}
+
+_IRQL_requires_(DISPATCH_LEVEL)
+_Releases_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)->IrpQueueLock)
+VOID
+CsqReleaseLock(
+    _In_                    PIO_CSQ Csq,
+    _In_ _IRQL_restores_    KIRQL   Irql
+    )
+{
+    PXENIFACE_FDO Fdo;
+
+    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
+
+    KeReleaseSpinLock(&Fdo->IrpQueueLock, Irql);
+}
+
+_IRQL_requires_max_(DISPATCH_LEVEL)
+VOID
+CsqCompleteCanceledIrp(
+    _In_  PIO_CSQ Csq,
+    _In_  PIRP    Irp
+    )
+{
+    PXENIFACE_FDO Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
+    PIO_WORKITEM WorkItem;
+
+    XenIfaceDebugPrint(TRACE, "Irp %p, IRQL %d\n",
+                       Irp, KeGetCurrentIrql());
+
+    // This is not guaranteed to run at PASSIVE_LEVEL, so queue a work item
+    // to perform actual cleanup/IRP completion.
+
+    WorkItem = IoAllocateWorkItem(Fdo->Dx->DeviceObject);
+    Irp->Tail.Overlay.DriverContext[1] = WorkItem; // store so the work item can free it
+    IoQueueWorkItem(WorkItem, CompleteGnttabIrp, DelayedWorkQueue, Irp);
+}
diff --git a/src/xeniface/irp_queue.h b/src/xeniface/irp_queue.h
new file mode 100644
index 0000000..746ee19
--- /dev/null
+++ b/src/xeniface/irp_queue.h
@@ -0,0 +1,50 @@
+#ifndef _IRP_QUEUE_H_
+#define _IRP_QUEUE_H_
+
+#include <ntddk.h>
+
+NTSTATUS
+CsqInsertIrpEx(
+    _In_  PIO_CSQ Csq,
+    _In_  PIRP    Irp,
+    _In_  PVOID   InsertContext
+    );
+
+VOID
+CsqRemoveIrp(
+    _In_  PIO_CSQ Csq,
+    _In_  PIRP    Irp
+    );
+
+PIRP
+CsqPeekNextIrp(
+    _In_      PIO_CSQ Csq,
+    _In_opt_  PIRP    Irp,
+    _In_opt_  PVOID   PeekContext // PXENIFACE_CONTEXT_ID
+    );
+
+_IRQL_raises_(DISPATCH_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_Acquires_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)->IrpQueueLock)
+VOID
+CsqAcquireLock(
+    _In_                                       PIO_CSQ Csq,
+    _Out_ _At_(*Irql, _Post_ _IRQL_saves_)     PKIRQL  Irql
+    );
+
+_IRQL_requires_(DISPATCH_LEVEL)
+_Releases_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)->IrpQueueLock)
+VOID
+CsqReleaseLock(
+    _In_                    PIO_CSQ Csq,
+    _In_ _IRQL_restores_    KIRQL   Irql
+    );
+
+_IRQL_requires_max_(DISPATCH_LEVEL)
+VOID
+CsqCompleteCanceledIrp(
+    _In_  PIO_CSQ             Csq,
+    _In_  PIRP                Irp
+    );
+
+#endif
diff --git a/vs2013/xeniface/xeniface.vcxproj b/vs2013/xeniface/xeniface.vcxproj
index fea2ad1..14f1338 100644
--- a/vs2013/xeniface/xeniface.vcxproj
+++ b/vs2013/xeniface/xeniface.vcxproj
@@ -131,6 +131,10 @@
     <ClCompile Include="../../src/xeniface/fdo.c" />
     <ClCompile Include="../../src/xeniface/registry.c" />
     <ClCompile Include="../../src\xeniface/thread.c" />
+    <ClCompile Include="..\..\src\xeniface\ioctl_evtchn.c" />
+    <ClCompile Include="..\..\src\xeniface\ioctl_gnttab.c" />
+    <ClCompile Include="..\..\src\xeniface\ioctl_store.c" />
+    <ClCompile Include="..\..\src\xeniface\irp_queue.c" />
   </ItemGroup>
   <ItemGroup>
     <Mofcomp Include="../../src/xeniface/wmi.mof">
-- 
1.8.1.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 Wed Oct 07 04:48:55 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 07 Oct 2015 04:48: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 1Zjget-0007Uu-3k; Wed, 07 Oct 2015 04:48:55 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1Zjger-0007Up-Fg
	for win-pv-devel@lists.xenproject.org; Wed, 07 Oct 2015 04:48:53 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	93/58-22142-434A4165; Wed, 07 Oct 2015 04:48:52 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-15.tower-206.messagelabs.com!1444193327!24707014!1
X-Originating-IP: [66.111.4.28]
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 6040 invoked from network); 7 Oct 2015 04:48:48 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-15.tower-206.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 7 Oct 2015 04:48:48 -0000
Received: from compute2.internal (compute2.nyi.internal [10.202.2.42])
	by mailout.nyi.internal (Postfix) with ESMTP id B9CE020911
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:48:47 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute2.internal (MEProxy); Wed, 07 Oct 2015 00:48:47 -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=hX66RzyORSkxPz99QkSEF5aG2g0=; b=AXDPbh
	5RyuANs9ZUREyjTiNBKdcIcYtRCsEwHHPPCXpY2Xpd3/yCDeRmZTzfvTl3n+gTSE
	Nqc6enSMGVtN+W50kvYtq/gF2JFiDklOrN1+C7NakNmpHB55HiI9Yx9DuWe9JVkf
	Rvbtw0KkSjTLAFHsn4z/vIRoXqWSmQmu5okNs=
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=hX66RzyORSkxPz99QkSEF5aG2g0=; b=NqGW9
	D1psJDBAVt8VkSopTBBqtq6mkasn9tynG3ssVMSr/Lj4KWjpGiCdAIJI9lPokKdq
	gM9dXypGKLmYCkKrayZ64mjXQahSsq9XWOxTdjNo7ReINx61uKgzv84+Sbz8K9ts
	rT3khptzRdxsV1mQfUWuCO1d7JNKF/J8B1R9+Y=
X-Sasl-enc: 61GTAcWVpTvgMuewB948d+XFC9oYP1OXTuVYyOyzCtHW 1444193326
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 4771D680159
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:48:46 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <5614A431.2020704@invisiblethingslab.com>
Date: Wed, 7 Oct 2015 06:48:49 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 4/5] Implement new IOCTL handlers
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

This patch implements new store, evtchn and gnttab IOCTLs.
Handlers are split into separate files for readability.

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 src/xeniface/fdo.c               | 188 ++++++++--
 src/xeniface/fdo.h               |  25 +-
 src/xeniface/ioctl_evtchn.c      | 467 ++++++++++++++++++++++++
 src/xeniface/ioctl_gnttab.c      | 765 +++++++++++++++++++++++++++++++++++++++
 src/xeniface/ioctl_store.c       | 574 +++++++++++++++++++++++++++++
 src/xeniface/ioctls.c            | 360 ++++++------------
 src/xeniface/ioctls.h            | 315 +++++++++++++++-
 src/xeniface/irp_queue.c         | 131 +++++++
 src/xeniface/irp_queue.h         |  50 +++
 vs2013/xeniface/xeniface.vcxproj |   4 +
 10 files changed, 2602 insertions(+), 277 deletions(-)
 create mode 100644 src/xeniface/ioctl_evtchn.c
 create mode 100644 src/xeniface/ioctl_gnttab.c
 create mode 100644 src/xeniface/ioctl_store.c
 create mode 100644 src/xeniface/irp_queue.c
 create mode 100644 src/xeniface/irp_queue.h

diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index 51bda24..338c8da 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -36,7 +36,8 @@
 #include <stdlib.h>
 
 #include <store_interface.h>
-
+#include <evtchn_interface.h>
+#include <gnttab_interface.h>
 #include <suspend_interface.h>
 
 
@@ -52,6 +53,7 @@
 #include "ioctls.h"
 #include "wmi.h"
 #include "xeniface_ioctls.h"
+#include "irp_queue.h"
 
 #define FDO_POOL 'ODF'
 
@@ -664,6 +666,25 @@ __FdoD3ToD0(
     if (!NT_SUCCESS(status))
         goto fail1;
 
+    status = XENBUS_EVTCHN(Acquire, &Fdo->EvtchnInterface);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = XENBUS_GNTTAB(Acquire, &Fdo->GnttabInterface);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    status = XENBUS_GNTTAB(CreateCache,
+                           &Fdo->GnttabInterface,
+                           "xeniface-gnttab",
+                           0,
+                           GnttabAcquireLock,
+                           GnttabReleaseLock,
+                           Fdo,
+                           &Fdo->GnttabCache);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
     __FdoSetDevicePowerState(Fdo, PowerDeviceD0);
 
     PowerState.DeviceState = PowerDeviceD0;
@@ -675,6 +696,18 @@ __FdoD3ToD0(
 
     return STATUS_SUCCESS;
 
+fail4:
+    Error("fail4\n");
+    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
+
+fail3:
+    Error("fail3\n");
+    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
+
+fail2:
+    Error("fail2\n");
+    XENBUS_STORE(Release, &Fdo->StoreInterface);
+
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -700,6 +733,9 @@ __FdoD0ToD3(
 
     __FdoSetDevicePowerState(Fdo, PowerDeviceD3);
 
+    XENBUS_GNTTAB(DestroyCache, &Fdo->GnttabInterface, Fdo->GnttabCache);
+    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
+    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
     XENBUS_STORE(Release, &Fdo->StoreInterface);
 
     Trace("<====\n");
@@ -1991,27 +2027,25 @@ FdoDispatchDefault(
 
 NTSTATUS
 FdoCreateFile (
-    __in PXENIFACE_FDO fdoData,
-    __inout PIRP Irp
+    __in PXENIFACE_FDO  Fdo,
+    __inout PIRP        Irp
     )
 {
-    NTSTATUS     status;
-
+    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
+    NTSTATUS            status;
 
-    XenIfaceDebugPrint(TRACE, "Create \n");
+    XenIfaceDebugPrint(TRACE, "FO %p, Process %p\n", Stack->FileObject, PsGetCurrentProcess());
 
-    if (Deleted == fdoData->Dx->DevicePnpState)
-    {
+    if (Deleted == Fdo->Dx->DevicePnpState) {
         Irp->IoStatus.Status = STATUS_NO_SUCH_DEVICE;
-        IoCompleteRequest (Irp, IO_NO_INCREMENT);
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
         return STATUS_NO_SUCH_DEVICE;
     }
 
-
     status = STATUS_SUCCESS;
     Irp->IoStatus.Information = 0;
     Irp->IoStatus.Status = status;
-    IoCompleteRequest (Irp, IO_NO_INCREMENT);
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
     return status;
 }
@@ -2019,20 +2053,22 @@ FdoCreateFile (
 
 NTSTATUS
 FdoClose (
-    __in PXENIFACE_FDO fdoData,
-    __inout PIRP Irp
+    __in PXENIFACE_FDO  Fdo,
+    __inout PIRP        Irp
     )
 
 {
+    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
+    NTSTATUS            status;
 
-    NTSTATUS     status;
+    XenIfaceDebugPrint(TRACE, "FO %p, Process %p\n", Stack->FileObject, PsGetCurrentProcess());
 
-    XenIfaceDebugPrint(TRACE, "Close \n");
+    XenIfaceCleanup(Fdo, Stack->FileObject);
 
     status = STATUS_SUCCESS;
     Irp->IoStatus.Information = 0;
     Irp->IoStatus.Status = status;
-    IoCompleteRequest (Irp, IO_NO_INCREMENT);
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
     return status;
 }
@@ -2080,9 +2116,9 @@ FdoDispatch(
         status = FdoDispatchPower(Fdo, Irp);
         break;
 
-	case IRP_MJ_DEVICE_CONTROL:
-		status = XenIFaceIoctl(Fdo, Irp);
-		break;
+    case IRP_MJ_DEVICE_CONTROL:
+        status = XenIfaceIoctl(Fdo, Irp);
+        break;
 
 	case IRP_MJ_SYSTEM_CONTROL:
 		status = XenIfaceSystemControl(Fdo, Irp);
@@ -2206,6 +2242,7 @@ FdoCreate(
     WCHAR               Name[MAXNAMELEN * sizeof (WCHAR)];
     ULONG               Size;
     NTSTATUS            status;
+    ULONG               ProcessorCount;
 
 #pragma prefast(suppress:28197) // Possibly leaking memory 'FunctionDeviceObject'
     status = IoCreateDevice(DriverObject,
@@ -2296,6 +2333,24 @@ FdoCreate(
     if (!NT_SUCCESS(status))
         goto fail10;
 
+    status = FDO_QUERY_INTERFACE(Fdo,
+                                 XENBUS,
+                                 EVTCHN,
+                                 (PINTERFACE)&Fdo->EvtchnInterface,
+                                 sizeof(Fdo->EvtchnInterface),
+                                 FALSE);
+    if (!NT_SUCCESS(status))
+        goto fail11;
+
+    status = FDO_QUERY_INTERFACE(Fdo,
+                                 XENBUS,
+                                 GNTTAB,
+                                 (PINTERFACE)&Fdo->GnttabInterface,
+                                 sizeof(Fdo->GnttabInterface),
+                                 FALSE);
+    if (!NT_SUCCESS(status))
+        goto fail12;
+
     InitializeMutex(&Fdo->Mutex);
     InitializeListHead(&Dx->ListEntry);
     Fdo->References = 1;
@@ -2304,9 +2359,46 @@ FdoCreate(
 
 	KeInitializeEvent(&Fdo->registryWriteEvent, NotificationEvent, FALSE);
 
-	status = ThreadCreate(FdoRegistryThreadHandler, Fdo, &Fdo->registryThread);
-	if (!NT_SUCCESS(status))
-		goto fail11;
+    status = ThreadCreate(FdoRegistryThreadHandler, Fdo, &Fdo->registryThread);
+    if (!NT_SUCCESS(status))
+        goto fail13;
+
+    KeInitializeSpinLock(&Fdo->StoreWatchLock);
+    InitializeListHead(&Fdo->StoreWatchList);
+
+    KeInitializeSpinLock(&Fdo->EvtchnLock);
+    InitializeListHead(&Fdo->EvtchnList);
+
+    KeInitializeSpinLock(&Fdo->IrpQueueLock);
+    InitializeListHead(&Fdo->IrpList);
+
+    KeInitializeSpinLock(&Fdo->GnttabCacheLock);
+
+    status = IoCsqInitializeEx(&Fdo->IrpQueue,
+                               CsqInsertIrpEx,
+                               CsqRemoveIrp,
+                               CsqPeekNextIrp,
+                               CsqAcquireLock,
+                               CsqReleaseLock,
+                               CsqCompleteCanceledIrp);
+    if (!NT_SUCCESS(status))
+        goto fail14;
+
+    ProcessorCount = KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
+    status = STATUS_NO_MEMORY;
+    Fdo->EvtchnDpc = __FdoAllocate(sizeof(KDPC) * ProcessorCount);
+    if (Fdo->EvtchnDpc == NULL)
+        goto fail15;
+
+    for (ULONG i = 0; i < ProcessorCount; i++) {
+        PROCESSOR_NUMBER ProcNumber;
+
+        status = KeGetProcessorNumberFromIndex(i, &ProcNumber);
+        ASSERT(NT_SUCCESS(status));
+        KeInitializeDpc(&Fdo->EvtchnDpc[i], EvtchnNotificationDpc, NULL);
+        status = KeSetTargetProcessorDpcEx(&Fdo->EvtchnDpc[i], &ProcNumber);
+        ASSERT(NT_SUCCESS(status));
+    }
 
     Info("%p (%s)\n",
          FunctionDeviceObject,
@@ -2317,7 +2409,28 @@ FdoCreate(
 
     return STATUS_SUCCESS;
 
-	
+fail15:
+    Error("fail15\n");
+
+fail14:
+    Error("fail14\n");
+
+    ThreadAlert(Fdo->registryThread);
+    ThreadJoin(Fdo->registryThread);
+    Fdo->registryThread = NULL;
+
+fail13:
+    Error("fail13\n");
+
+    RtlZeroMemory(&Fdo->GnttabInterface,
+                  sizeof (XENBUS_GNTTAB_INTERFACE));
+
+fail12:
+    Error("fail12\n");
+
+    RtlZeroMemory(&Fdo->EvtchnInterface,
+                  sizeof(XENBUS_EVTCHN_INTERFACE));
+
 fail11:
 	Error("fail11\n");
 
@@ -2395,6 +2508,7 @@ FdoDestroy(
 {
     PXENIFACE_DX          Dx = Fdo->Dx;
     PDEVICE_OBJECT      FunctionDeviceObject = Dx->DeviceObject;
+    ULONG               ProcessorCount;
 
     ASSERT(IsListEmpty(&Dx->ListEntry));
     ASSERT3U(Fdo->References, ==, 0);
@@ -2408,9 +2522,33 @@ FdoDestroy(
 
     Dx->Fdo = NULL;
 
-    RtlZeroMemory(&Fdo->Mutex, sizeof (XENIFACE_MUTEX));
+    ProcessorCount = KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
+    RtlZeroMemory(Fdo->EvtchnDpc, sizeof(KDPC)*ProcessorCount);
+    __FdoFree(Fdo->EvtchnDpc);
 
-	Fdo->InterfacesAcquired = FALSE;
+    RtlZeroMemory(&Fdo->GnttabCacheLock, sizeof(KSPIN_LOCK));
+    ASSERT(IsListEmpty(&Fdo->IrpList));
+    RtlZeroMemory(&Fdo->IrpList, sizeof(LIST_ENTRY));
+    RtlZeroMemory(&Fdo->IrpQueueLock, sizeof(KSPIN_LOCK));
+    RtlZeroMemory(&Fdo->IrpQueue, sizeof(IO_CSQ));
+
+    ASSERT(IsListEmpty(&Fdo->EvtchnList));
+    RtlZeroMemory(&Fdo->EvtchnList, sizeof(LIST_ENTRY));
+    RtlZeroMemory(&Fdo->EvtchnLock, sizeof(KSPIN_LOCK));
+
+    ASSERT(IsListEmpty(&Fdo->StoreWatchList));
+    RtlZeroMemory(&Fdo->StoreWatchList, sizeof(LIST_ENTRY));
+    RtlZeroMemory(&Fdo->StoreWatchLock, sizeof(KSPIN_LOCK));
+
+    RtlZeroMemory(&Fdo->Mutex, sizeof(XENIFACE_MUTEX));
+
+    Fdo->InterfacesAcquired = FALSE;
+
+    RtlZeroMemory(&Fdo->GnttabInterface,
+                  sizeof(XENBUS_GNTTAB_INTERFACE));
+
+    RtlZeroMemory(&Fdo->EvtchnInterface,
+                  sizeof(XENBUS_EVTCHN_INTERFACE));
 
     RtlZeroMemory(&Fdo->StoreInterface,
                   sizeof (XENBUS_STORE_INTERFACE));
diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
index 4416064..cbe5de3 100644
--- a/src/xeniface/fdo.h
+++ b/src/xeniface/fdo.h
@@ -34,6 +34,8 @@
 
 #include <ntifs.h>
 #include <store_interface.h>
+#include <evtchn_interface.h>
+#include <gnttab_interface.h>
 #include <suspend_interface.h>
 #include <shared_info_interface.h>
 
@@ -73,17 +75,30 @@ typedef struct _XENIFACE_FDO {
 
     FDO_RESOURCE                    Resource[RESOURCE_COUNT];
 
-
     XENBUS_STORE_INTERFACE          StoreInterface;
-
     XENBUS_SUSPEND_INTERFACE        SuspendInterface;
-
-	XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
-
+    XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
+    XENBUS_EVTCHN_INTERFACE         EvtchnInterface;
+    XENBUS_GNTTAB_INTERFACE         GnttabInterface;
     PXENBUS_SUSPEND_CALLBACK        SuspendCallbackLate;
 
 	BOOLEAN						    InterfacesAcquired;
 
+    KSPIN_LOCK                      StoreWatchLock;
+    LIST_ENTRY                      StoreWatchList;
+
+    KSPIN_LOCK                      EvtchnLock;
+    LIST_ENTRY                      EvtchnList;
+    PKDPC                           EvtchnDpc;
+
+    KSPIN_LOCK                      GnttabCacheLock;
+
+    IO_CSQ                          IrpQueue;
+    KSPIN_LOCK                      IrpQueueLock;
+    LIST_ENTRY                      IrpList;
+
+    PXENBUS_GNTTAB_CACHE            GnttabCache;
+
 	#define MAX_SESSIONS    (65536)
 
     int							    WmiReady;
diff --git a/src/xeniface/ioctl_evtchn.c b/src/xeniface/ioctl_evtchn.c
new file mode 100644
index 0000000..d46894f
--- /dev/null
+++ b/src/xeniface/ioctl_evtchn.c
@@ -0,0 +1,467 @@
+/* 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 "driver.h"
+#include "ioctls.h"
+#include "..\..\include\xeniface_ioctls.h"
+#include "log.h"
+
+_Function_class_(KDEFERRED_ROUTINE)
+_IRQL_requires_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+VOID
+EvtchnNotificationDpc(
+    __in      PKDPC Dpc,
+    __in_opt  PVOID _Context,
+    __in_opt  PVOID Argument1,
+    __in_opt  PVOID Argument2
+    )
+{
+    PXENIFACE_EVTCHN_CONTEXT Context = (PXENIFACE_EVTCHN_CONTEXT)Argument1;
+
+    UNREFERENCED_PARAMETER(Dpc);
+    UNREFERENCED_PARAMETER(_Context);
+    UNREFERENCED_PARAMETER(Argument2);
+
+    ASSERT(Context);
+
+#if DBG
+    XenIfaceDebugPrint(INFO, "Channel %p, LocalPort %d, Active %d, Cpu %lu\n",
+                       Context->Channel, Context->LocalPort, Context->Active, KeGetCurrentProcessorNumber());
+#endif
+    if (Context->Active) {
+        KeSetEvent(Context->Event, 0, FALSE);
+
+        XENBUS_EVTCHN(Unmask,
+                      &Context->Fdo->EvtchnInterface,
+                      Context->Channel,
+                      FALSE);
+    }
+}
+
+_Function_class_(KSERVICE_ROUTINE)
+_IRQL_requires_(HIGH_LEVEL)
+_IRQL_requires_same_
+static DECLSPEC_NOINLINE
+BOOLEAN
+EvtchnInterruptHandler(
+    __in      PKINTERRUPT Interrupt,
+    __in_opt  PVOID Argument
+    )
+{
+    PXENIFACE_EVTCHN_CONTEXT Context = (PXENIFACE_EVTCHN_CONTEXT)Argument;
+    PROCESSOR_NUMBER ProcNumber;
+    ULONG ProcIndex;
+
+    UNREFERENCED_PARAMETER(Interrupt);
+    ASSERT(Context);
+
+    KeGetCurrentProcessorNumberEx(&ProcNumber);
+    ProcIndex = KeGetProcessorIndexFromNumber(&ProcNumber);
+    if (Context->Active)
+        KeInsertQueueDpc(&Context->Fdo->EvtchnDpc[ProcIndex], Context, NULL);
+
+    return TRUE;
+}
+
+_IRQL_requires_(PASSIVE_LEVEL) // needed for KeFlushQueuedDpcs
+VOID
+EvtchnFree(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_EVTCHN_CONTEXT Context
+    )
+{
+    ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
+
+    XenIfaceDebugPrint(TRACE, "Context %p, LocalPort %d, FO %p\n",
+                       Context, Context->LocalPort, Context->FileObject);
+
+    InterlockedExchange8(&Context->Active, 0);
+
+    XENBUS_EVTCHN(Close,
+                  &Fdo->EvtchnInterface,
+                  Context->Channel);
+
+    // There may still be a pending event at this time.
+    // Wait for our DPCs to complete.
+    KeFlushQueuedDpcs();
+
+    ObDereferenceObject(Context->Event);
+    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+}
+
+_Requires_exclusive_lock_held_(Fdo->EvtchnLock)
+static
+PXENIFACE_EVTCHN_CONTEXT
+EvtchnFindChannel(
+    __in      PXENIFACE_FDO Fdo,
+    __in      ULONG         LocalPort,
+    __in_opt  PFILE_OBJECT  FileObject
+    )
+{
+    PXENIFACE_EVTCHN_CONTEXT Context, Found = NULL;
+    PLIST_ENTRY Node;
+
+    Node = Fdo->EvtchnList.Flink;
+    while (Node->Flink != Fdo->EvtchnList.Flink) {
+        Context = CONTAINING_RECORD(Node, XENIFACE_EVTCHN_CONTEXT, Entry);
+
+        Node = Node->Flink;
+        if (Context->LocalPort != LocalPort)
+            continue;
+
+        if (FileObject != NULL && Context->FileObject != FileObject)
+            continue;
+
+        Found = Context;
+        break;
+    }
+
+    return Found;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnBindUnbound(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_BIND_UNBOUND_IN In = Buffer;
+    PXENIFACE_EVTCHN_BIND_UNBOUND_OUT Out = Buffer;
+    PXENIFACE_EVTCHN_CONTEXT Context;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_IN) || OutLen != sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_OUT))
+        goto fail1;
+
+    status = STATUS_NO_MEMORY;
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_EVTCHN_CONTEXT), XENIFACE_POOL_TAG);
+    if (Context == NULL)
+        goto fail2;
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
+    Context->FileObject = FileObject;
+
+    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, Mask %d, FO %p\n",
+                       In->RemoteDomain, In->Mask, FileObject);
+
+    status = ObReferenceObjectByHandle(In->Event, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode, &Context->Event, NULL);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    status = STATUS_UNSUCCESSFUL;
+    Context->Channel = XENBUS_EVTCHN(Open,
+                                     &Fdo->EvtchnInterface,
+                                     XENBUS_EVTCHN_TYPE_UNBOUND,
+                                     EvtchnInterruptHandler,
+                                     Context,
+                                     In->RemoteDomain,
+                                     TRUE);
+    if (Context->Channel == NULL)
+        goto fail4;
+
+    Context->LocalPort = XENBUS_EVTCHN(GetPort,
+                                       &Fdo->EvtchnInterface,
+                                       Context->Channel);
+
+    Context->Fdo = Fdo;
+
+    ExInterlockedInsertTailList(&Fdo->EvtchnList, &Context->Entry, &Fdo->EvtchnLock);
+
+    InterlockedExchange8(&Context->Active, 1);
+    Out->LocalPort = Context->LocalPort;
+    *Info = sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_OUT);
+
+    if (!In->Mask) {
+        XENBUS_EVTCHN(Unmask,
+                      &Fdo->EvtchnInterface,
+                      Context->Channel,
+                      FALSE);
+    }
+
+    XenIfaceDebugPrint(TRACE, "< LocalPort %lu, Context %p\n", Context->LocalPort, Context);
+    return STATUS_SUCCESS;
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+    ObDereferenceObject(Context->Event);
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnBindInterdomain(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_BIND_INTERDOMAIN_IN In = Buffer;
+    PXENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT Out = Buffer;
+    PXENIFACE_EVTCHN_CONTEXT Context;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN) || OutLen != sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT))
+        goto fail1;
+
+    status = STATUS_NO_MEMORY;
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_EVTCHN_CONTEXT), XENIFACE_POOL_TAG);
+    if (Context == NULL)
+        goto fail2;
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
+    Context->FileObject = FileObject;
+
+    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, RemotePort %lu, Mask %d, FO %p\n",
+                       In->RemoteDomain, In->RemotePort, In->Mask, FileObject);
+
+    status = ObReferenceObjectByHandle(In->Event, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode, &Context->Event, NULL);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    status = STATUS_UNSUCCESSFUL;
+    Context->Channel = XENBUS_EVTCHN(Open,
+                                     &Fdo->EvtchnInterface,
+                                     XENBUS_EVTCHN_TYPE_INTER_DOMAIN,
+                                     EvtchnInterruptHandler,
+                                     Context,
+                                     In->RemoteDomain,
+                                     In->RemotePort,
+                                     TRUE);
+    if (Context->Channel == NULL)
+        goto fail4;
+
+    Context->LocalPort = XENBUS_EVTCHN(GetPort,
+                                       &Fdo->EvtchnInterface,
+                                       Context->Channel);
+
+    Context->Fdo = Fdo;
+
+    ExInterlockedInsertTailList(&Fdo->EvtchnList, &Context->Entry, &Fdo->EvtchnLock);
+
+    InterlockedExchange8(&Context->Active, 1);
+    Out->LocalPort = Context->LocalPort;
+    *Info = sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT);
+
+    if (!In->Mask) {
+        XENBUS_EVTCHN(Unmask,
+                      &Fdo->EvtchnInterface,
+                      Context->Channel,
+                      FALSE);
+    }
+
+    XenIfaceDebugPrint(TRACE, "< LocalPort %lu, Context %p\n", Context->LocalPort, Context);
+
+    return STATUS_SUCCESS;
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+    ObDereferenceObject(Context->Event);
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnClose(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_CLOSE_IN In = Buffer;
+    PXENIFACE_EVTCHN_CONTEXT Context = NULL;
+    KIRQL Irql;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_EVTCHN_CLOSE_IN) || OutLen != 0)
+        goto fail1;
+
+    XenIfaceDebugPrint(TRACE, "> LocalPort %lu, FO %p\n", In->LocalPort, FileObject);
+
+    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
+    Context = EvtchnFindChannel(Fdo, In->LocalPort, FileObject);
+    if (Context != NULL)
+        RemoveEntryList(&Context->Entry);
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+    if (Context != NULL)
+        EvtchnFree(Fdo, Context);
+
+    status = STATUS_NOT_FOUND;
+    if (Context == NULL)
+        goto fail2;
+
+    return STATUS_SUCCESS;
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+_Requires_lock_not_held_(Fdo->EvtchnLock)
+DECLSPEC_NOINLINE
+NTSTATUS
+EvtchnNotify(
+    __in      PXENIFACE_FDO Fdo,
+    __in      ULONG         LocalPort,
+    __in_opt  PFILE_OBJECT  FileObject
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_CONTEXT Context = NULL;
+    KIRQL Irql;
+
+    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
+
+    Context = EvtchnFindChannel(Fdo, LocalPort, FileObject);
+
+    status = STATUS_NOT_FOUND;
+    if (Context == NULL)
+        goto fail1;
+
+    XENBUS_EVTCHN(Send,
+                  &Fdo->EvtchnInterface,
+                  Context->Channel);
+
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+
+    return STATUS_SUCCESS;
+
+fail1:
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnNotify(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_NOTIFY_IN In = Buffer;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_EVTCHN_NOTIFY_IN) || OutLen != 0)
+        goto fail1;
+#if DBG
+    XenIfaceDebugPrint(INFO, "> LocalPort %d, FO %p\n", In->LocalPort, FileObject);
+#endif
+
+    return EvtchnNotify(Fdo, In->LocalPort, FileObject);
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnUnmask(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_UNMASK_IN In = Buffer;
+    PXENIFACE_EVTCHN_CONTEXT Context = NULL;
+    KIRQL Irql;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_EVTCHN_UNMASK_IN) || OutLen != 0)
+        goto fail1;
+
+    XenIfaceDebugPrint(TRACE, "> LocalPort %d, FO %p\n", In->LocalPort, FileObject);
+
+    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
+
+    Context = EvtchnFindChannel(Fdo, In->LocalPort, FileObject);
+
+    status = STATUS_INVALID_PARAMETER;
+    if (Context == NULL)
+        goto fail2;
+
+    XENBUS_EVTCHN(Unmask,
+                  &Fdo->EvtchnInterface,
+                  Context->Channel,
+                  FALSE);
+
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
diff --git a/src/xeniface/ioctl_gnttab.c b/src/xeniface/ioctl_gnttab.c
new file mode 100644
index 0000000..a279b77
--- /dev/null
+++ b/src/xeniface/ioctl_gnttab.c
@@ -0,0 +1,765 @@
+/* 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 "driver.h"
+#include "ioctls.h"
+#include "..\..\include\xeniface_ioctls.h"
+#include "log.h"
+#include "irp_queue.h"
+
+// Complete a canceled gnttab IRP, cleanup associated grant/map.
+_Function_class_(IO_WORKITEM_ROUTINE)
+VOID
+CompleteGnttabIrp(
+    __in      PDEVICE_OBJECT DeviceObject,
+    __in_opt  PVOID          Context
+    )
+{
+    PXENIFACE_DX Dx = (PXENIFACE_DX)DeviceObject->DeviceExtension;
+    PXENIFACE_FDO Fdo = Dx->Fdo;
+    PIRP Irp = Context;
+    PXENIFACE_CONTEXT_ID Id;
+    PIO_WORKITEM WorkItem;
+    KAPC_STATE ApcState;
+    BOOLEAN ChangeProcess;
+
+    ASSERT(Context != NULL);
+
+    Id = Irp->Tail.Overlay.DriverContext[0];
+    WorkItem = Irp->Tail.Overlay.DriverContext[1];
+    
+    // We are not guaranteed to be in the context of the process that initiated the IRP,
+    // but we need to be there to unmap memory.
+    ChangeProcess = PsGetCurrentProcess() != Id->Process;
+    if (ChangeProcess) {
+        XenIfaceDebugPrint(TRACE, "Changing process from %p to %p\n", PsGetCurrentProcess(), Id->Process);
+        KeStackAttachProcess(Id->Process, &ApcState);
+    }
+
+    XenIfaceDebugPrint(TRACE, "Irp %p, Process %p, Id %lu, Type %d, IRQL %d\n",
+                       Irp, Id->Process, Id->RequestId, Id->Type, KeGetCurrentIrql());
+
+    switch (Id->Type) {
+
+    case XENIFACE_CONTEXT_GRANT:
+        GnttabFreeGrant(Fdo, CONTAINING_RECORD(Id, XENIFACE_GRANT_CONTEXT, Id));
+        break;
+
+    case XENIFACE_CONTEXT_MAP:
+        GnttabFreeMap(Fdo, CONTAINING_RECORD(Id, XENIFACE_MAP_CONTEXT, Id));
+        break;
+
+    default:
+        ASSERT(FALSE);
+    }
+
+    if (ChangeProcess)
+        KeUnstackDetachProcess(&ApcState);
+
+    IoFreeWorkItem(WorkItem);
+
+    Irp->IoStatus.Status = STATUS_CANCELLED;
+    Irp->IoStatus.Information = 0;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+}
+
+_Acquires_exclusive_lock_(((PXENIFACE_FDO)Argument)->GnttabCacheLock)
+_IRQL_requires_(DISPATCH_LEVEL)
+VOID
+GnttabAcquireLock(
+    __in  PVOID Argument
+    )
+{
+    PXENIFACE_FDO Fdo = Argument;
+
+    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+
+    KeAcquireSpinLockAtDpcLevel(&Fdo->GnttabCacheLock);
+}
+
+_Releases_exclusive_lock_(((PXENIFACE_FDO)Argument)->GnttabCacheLock)
+_IRQL_requires_(DISPATCH_LEVEL)
+VOID
+GnttabReleaseLock(
+    __in  PVOID Argument
+    )
+{
+    PXENIFACE_FDO Fdo = Argument;
+
+    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+
+    KeReleaseSpinLockFromDpcLevel(&Fdo->GnttabCacheLock);
+}
+
+_Requires_lock_not_held_(Fdo->IrpQueueLock)
+static
+PIRP
+FindGnttabIrp(
+    __in  PXENIFACE_FDO Fdo,
+    __in  PXENIFACE_CONTEXT_ID Id
+    )
+{
+    KIRQL Irql;
+    PIRP Irp;
+
+    CsqAcquireLock(&Fdo->IrpQueue, &Irql);
+    Irp = CsqPeekNextIrp(&Fdo->IrpQueue, NULL, Id);
+    CsqReleaseLock(&Fdo->IrpQueue, Irql);
+    return Irp;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabPermitForeignAccess(
+    __in     PXENIFACE_FDO  Fdo,
+    __in     PVOID          Buffer,
+    __in     ULONG          InLen,
+    __in     ULONG          OutLen,
+    __inout  PIRP           Irp
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN In = Buffer;
+    PXENIFACE_GRANT_CONTEXT Context;
+    ULONG Page;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN) || OutLen != 0)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if ((In->NumberPages == 0) || (In->NumberPages > 1024 * 1024) ||
+        ((In->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) && (In->NotifyOffset >= In->NumberPages * PAGE_SIZE))
+        )
+        goto fail2;
+
+    status = STATUS_NO_MEMORY;
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_GRANT_CONTEXT), XENIFACE_POOL_TAG);
+    if (Context == NULL)
+        goto fail3;
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
+    Context->Id.Type = XENIFACE_CONTEXT_GRANT;
+    Context->Id.Process = PsGetCurrentProcess();
+    Context->Id.RequestId = In->RequestId;
+    Context->RemoteDomain = In->RemoteDomain;
+    Context->NumberPages = In->NumberPages;
+    Context->Flags = In->Flags;
+    Context->NotifyOffset = In->NotifyOffset;
+    Context->NotifyPort = In->NotifyPort;
+
+    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, NumberPages %lu, Flags 0x%x, Offset 0x%x, Port %d, Process %p, Id %lu\n",
+                       Context->RemoteDomain, Context->NumberPages, Context->Flags, Context->NotifyOffset, Context->NotifyPort,
+                       Context->Id.Process, Context->Id.RequestId);
+
+    // Check if the request ID is unique.
+    // This doesn't protect us from simultaneous requests with the same ID arriving here
+    // but another check for duplicate ID is performed when the context/IRP is queued at the end.
+    // Ideally we would lock the whole section but that's not really an option since we touch user memory.
+    status = STATUS_INVALID_PARAMETER;
+    if (FindGnttabIrp(Fdo, &Context->Id) != NULL)
+        goto fail4;
+
+    status = STATUS_NO_MEMORY;
+    Context->Grants = ExAllocatePoolWithTag(NonPagedPool, Context->NumberPages * sizeof(PXENBUS_GNTTAB_ENTRY), XENIFACE_POOL_TAG);
+    if (Context->Grants == NULL)
+        goto fail5;
+
+    RtlZeroMemory(Context->Grants, Context->NumberPages * sizeof(PXENBUS_GNTTAB_ENTRY));
+
+    // allocate memory to share
+    status = STATUS_NO_MEMORY;
+    Context->KernelVa = ExAllocatePoolWithTag(NonPagedPool, Context->NumberPages * PAGE_SIZE, XENIFACE_POOL_TAG);
+    if (Context->KernelVa == NULL)
+        goto fail6;
+
+    RtlZeroMemory(Context->KernelVa, Context->NumberPages * PAGE_SIZE);
+    Context->Mdl = IoAllocateMdl(Context->KernelVa, Context->NumberPages * PAGE_SIZE, FALSE, FALSE, NULL);
+    if (Context->Mdl == NULL)
+        goto fail7;
+
+    MmBuildMdlForNonPagedPool(Context->Mdl);
+    ASSERT(MmGetMdlByteCount(Context->Mdl) == Context->NumberPages * PAGE_SIZE);
+
+    // perform sharing
+    for (Page = 0; Page < Context->NumberPages; Page++) {
+        status = XENBUS_GNTTAB(PermitForeignAccess,
+                               &Fdo->GnttabInterface,
+                               Fdo->GnttabCache,
+                               FALSE,
+                               Context->RemoteDomain,
+                               MmGetMdlPfnArray(Context->Mdl)[Page],
+                               (Context->Flags & XENIFACE_GNTTAB_READONLY) != 0,
+                               &(Context->Grants[Page]));
+
+// prefast somehow thinks that this call can modify Page...
+#pragma prefast(suppress:6385)
+        XenIfaceDebugPrint(INFO, "Grants[%lu] = %p\n", Page, Context->Grants[Page]);
+        if (!NT_SUCCESS(status))
+            goto fail8;
+    }
+
+    // map into user mode
+#pragma prefast(suppress:6320) // we want to catch all exceptions
+    __try {
+        Context->UserVa = MmMapLockedPagesSpecifyCache(Context->Mdl, UserMode, MmCached, NULL, FALSE, NormalPagePriority);
+    }
+    __except (EXCEPTION_EXECUTE_HANDLER) {
+        status = GetExceptionCode();
+        goto fail9;
+    }
+
+    status = STATUS_UNSUCCESSFUL;
+    if (Context->UserVa == NULL)
+        goto fail10;
+
+    XenIfaceDebugPrint(TRACE, "< Context %p, Irp %p, KernelVa %p, UserVa %p\n", Context, Irp, Context->KernelVa, Context->UserVa);
+    
+    // Insert the IRP/context into the pending queue.
+    // This also checks (again) if the request ID is unique.
+    Irp->Tail.Overlay.DriverContext[0] = &Context->Id;
+    status = IoCsqInsertIrpEx(&Fdo->IrpQueue, Irp, NULL, &Context->Id);
+    if (!NT_SUCCESS(status))
+        goto fail11;
+
+    return STATUS_PENDING;
+
+fail11:
+    XenIfaceDebugPrint(ERROR, "Fail11\n");
+    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
+
+fail10:
+    XenIfaceDebugPrint(ERROR, "Fail10\n");
+
+fail9:
+    XenIfaceDebugPrint(ERROR, "Fail9\n");
+
+fail8:
+    XenIfaceDebugPrint(ERROR, "Fail8: Page = %lu\n", Page);
+
+    while (Page > 0) {
+        ASSERT(NT_SUCCESS(XENBUS_GNTTAB(RevokeForeignAccess,
+                                        &Fdo->GnttabInterface,
+                                        Fdo->GnttabCache,
+                                        FALSE,
+                                        Context->Grants[Page - 1])));
+
+        --Page;
+    }
+    IoFreeMdl(Context->Mdl);
+
+fail7:
+    XenIfaceDebugPrint(ERROR, "Fail7\n");
+    ExFreePoolWithTag(Context->KernelVa, XENIFACE_POOL_TAG);
+
+fail6:
+    XenIfaceDebugPrint(ERROR, "Fail6\n");
+    ExFreePoolWithTag(Context->Grants, XENIFACE_POOL_TAG);
+
+fail5:
+    XenIfaceDebugPrint(ERROR, "Fail5\n");
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabGetGrantResult(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_GNTTAB_GET_GRANT_RESULT_IN In = Buffer;
+    PXENIFACE_GNTTAB_GET_GRANT_RESULT_OUT Out = Buffer;
+    XENIFACE_CONTEXT_ID Id;
+    KIRQL Irql;
+    PIRP Irp;
+    PXENIFACE_CONTEXT_ID ContextId;
+    PXENIFACE_GRANT_CONTEXT Context;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_GNTTAB_GET_GRANT_RESULT_IN))
+        goto fail1;
+
+    Id.Process = PsGetCurrentProcess();
+    Id.RequestId = In->RequestId;
+    Id.Type = XENIFACE_CONTEXT_GRANT;
+
+    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process, Id.RequestId);
+
+    CsqAcquireLock(&Fdo->IrpQueue, &Irql);
+    Irp = CsqPeekNextIrp(&Fdo->IrpQueue, NULL, &Id);
+
+    status = STATUS_NOT_FOUND;
+    if (Irp == NULL)
+        goto fail2;
+
+    ContextId = Irp->Tail.Overlay.DriverContext[0];
+    Context = CONTAINING_RECORD(ContextId, XENIFACE_GRANT_CONTEXT, Id);
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (OutLen != (sizeof(XENIFACE_GNTTAB_GET_GRANT_RESULT_OUT) + sizeof(ULONG) * Context->NumberPages))
+        goto fail3;
+
+    Out->Address = Context->UserVa;
+    XenIfaceDebugPrint(TRACE, "< Address %p, Irp %p\n", Context->UserVa, Irp);
+
+    for (ULONG Page = 0; Page < Context->NumberPages; Page++) {
+        Out->References[Page] = XENBUS_GNTTAB(GetReference,
+                                              &Fdo->GnttabInterface,
+                                              Context->Grants[Page]);
+        XenIfaceDebugPrint(INFO, "Ref[%lu] = %lu\n", Page, Out->References[Page]);
+    }
+
+    CsqReleaseLock(&Fdo->IrpQueue, Irql);
+    *Info = OutLen;
+
+    return STATUS_SUCCESS;
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+    CsqReleaseLock(&Fdo->IrpQueue, Irql);
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+_IRQL_requires_max_(APC_LEVEL)
+VOID
+GnttabFreeGrant(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_GRANT_CONTEXT Context
+)
+{
+    NTSTATUS status;
+    ULONG Page;
+
+    ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
+
+    XenIfaceDebugPrint(TRACE, "Context %p\n", Context);
+
+    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) {
+        ((PCHAR)Context->KernelVa)[Context->NotifyOffset] = 0;
+    }
+
+    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_PORT) {
+        status = EvtchnNotify(Fdo, Context->NotifyPort, NULL);
+
+        if (!NT_SUCCESS(status)) // non-fatal, we must free memory
+            XenIfaceDebugPrint(ERROR, "failed to notify port %lu: 0x%x\n", Context->NotifyPort, status);
+    }
+
+    // unmap from user address space
+    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
+
+    // stop sharing
+    for (Page = 0; Page < Context->NumberPages; Page++) {
+        status = XENBUS_GNTTAB(RevokeForeignAccess,
+                               &Fdo->GnttabInterface,
+                               Fdo->GnttabCache,
+                               FALSE,
+                               Context->Grants[Page]);
+
+        ASSERT(NT_SUCCESS(status)); // failure here is fatal, something must've gone catastrophically wrong
+    }
+
+    IoFreeMdl(Context->Mdl);
+
+    RtlZeroMemory(Context->KernelVa, Context->NumberPages * PAGE_SIZE);
+    ExFreePoolWithTag(Context->KernelVa, XENIFACE_POOL_TAG);
+
+    RtlZeroMemory(Context->Grants, Context->NumberPages * sizeof(PXENBUS_GNTTAB_ENTRY));
+    ExFreePoolWithTag(Context->Grants, XENIFACE_POOL_TAG);
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabRevokeForeignAccess(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN In = Buffer;
+    PXENIFACE_GRANT_CONTEXT Context = NULL;
+    XENIFACE_CONTEXT_ID Id;
+    PIRP PendingIrp;
+    PXENIFACE_CONTEXT_ID ContextId;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN))
+        goto fail1;
+
+    Id.Type = XENIFACE_CONTEXT_GRANT;
+    Id.Process = PsGetCurrentProcess();
+    Id.RequestId = In->RequestId;
+
+    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process, Id.RequestId);
+
+    status = STATUS_NOT_FOUND;
+    PendingIrp = IoCsqRemoveNextIrp(&Fdo->IrpQueue, &Id);
+    if (PendingIrp == NULL)
+        goto fail2;
+
+    ContextId = PendingIrp->Tail.Overlay.DriverContext[0];
+    Context = CONTAINING_RECORD(ContextId, XENIFACE_GRANT_CONTEXT, Id);
+    GnttabFreeGrant(Fdo, Context);
+
+    PendingIrp->IoStatus.Status = STATUS_SUCCESS;
+    PendingIrp->IoStatus.Information = 0;
+    IoCompleteRequest(PendingIrp, IO_NO_INCREMENT);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabMapForeignPages(
+    __in     PXENIFACE_FDO     Fdo,
+    __in     PVOID             Buffer,
+    __in     ULONG             InLen,
+    __in     ULONG             OutLen,
+    __inout  PIRP           Irp
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN In = Buffer;
+    PXENIFACE_MAP_CONTEXT Context;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen < sizeof(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN) || OutLen != 0)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if ((In->NumberPages == 0) || (In->NumberPages > 1024 * 1024) ||
+        ((In->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) && (In->NotifyOffset >= In->NumberPages * PAGE_SIZE))
+        )
+        goto fail2;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN) + sizeof(ULONG) * In->NumberPages)
+        goto fail3;
+
+    status = STATUS_NO_MEMORY;
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_MAP_CONTEXT), XENIFACE_POOL_TAG);
+    if (Context == NULL)
+        goto fail4;
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
+    Context->Id.Type = XENIFACE_CONTEXT_MAP;
+    Context->Id.Process = PsGetCurrentProcess();
+    Context->Id.RequestId = In->RequestId;
+    Context->RemoteDomain = In->RemoteDomain;
+    Context->NumberPages = In->NumberPages;
+    Context->Flags = In->Flags;
+    Context->NotifyOffset = In->NotifyOffset;
+    Context->NotifyPort = In->NotifyPort;
+
+    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, NumberPages %lu, Flags 0x%x, Offset 0x%x, Port %d, Process %p, Id %lu\n",
+                       Context->RemoteDomain, Context->NumberPages, Context->Flags, Context->NotifyOffset, Context->NotifyPort,
+                       Context->Id.Process, Context->Id.RequestId);
+
+    for (ULONG i = 0; i < In->NumberPages; i++)
+        XenIfaceDebugPrint(INFO, "> Ref %d\n", In->References[i]);
+
+    status = STATUS_INVALID_PARAMETER;
+    if (FindGnttabIrp(Fdo, &Context->Id) != NULL)
+        goto fail5;
+
+    status = XENBUS_GNTTAB(MapForeignPages,
+                           &Fdo->GnttabInterface,
+                           Context->RemoteDomain,
+                           Context->NumberPages,
+                           In->References,
+                           Context->Flags & XENIFACE_GNTTAB_READONLY,
+                           &Context->Address);
+
+    if (!NT_SUCCESS(status))
+        goto fail6;
+
+    status = STATUS_NO_MEMORY;
+    Context->KernelVa = MmMapIoSpace(Context->Address, Context->NumberPages * PAGE_SIZE, MmCached);
+    if (Context->KernelVa == NULL)
+        goto fail7;
+
+    status = STATUS_NO_MEMORY;
+    Context->Mdl = IoAllocateMdl(Context->KernelVa, Context->NumberPages * PAGE_SIZE, FALSE, FALSE, NULL);
+    if (Context->Mdl == NULL)
+        goto fail8;
+
+    MmBuildMdlForNonPagedPool(Context->Mdl);
+
+    // map into user mode
+#pragma prefast(suppress: 6320) // we want to catch all exceptions
+    __try {
+        Context->UserVa = MmMapLockedPagesSpecifyCache(Context->Mdl, UserMode, MmCached, NULL, FALSE, NormalPagePriority);
+    }
+    __except (EXCEPTION_EXECUTE_HANDLER) {
+        status = GetExceptionCode();
+        goto fail9;
+    }
+
+    status = STATUS_UNSUCCESSFUL;
+    if (Context->UserVa == NULL)
+        goto fail10;
+
+    XenIfaceDebugPrint(TRACE, "< Context %p, Irp %p, Address %p, KernelVa %p, UserVa %p\n",
+                       Context, Irp, Context->Address, Context->KernelVa, Context->UserVa);
+
+    // Insert the IRP/context into the pending queue.
+    // This also checks (again) if the request ID is unique.
+    Irp->Tail.Overlay.DriverContext[0] = &Context->Id;
+    status = IoCsqInsertIrpEx(&Fdo->IrpQueue, Irp, NULL, &Context->Id);
+    if (!NT_SUCCESS(status))
+        goto fail11;
+
+    return STATUS_PENDING;
+
+fail11:
+    XenIfaceDebugPrint(ERROR, "Fail11\n");
+    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
+
+fail10:
+    XenIfaceDebugPrint(ERROR, "Fail10\n");
+
+fail9:
+    XenIfaceDebugPrint(ERROR, "Fail9\n");
+    IoFreeMdl(Context->Mdl);
+
+fail8:
+    XenIfaceDebugPrint(ERROR, "Fail8\n");
+    MmUnmapIoSpace(Context->KernelVa, Context->NumberPages * PAGE_SIZE);
+
+fail7:
+    XenIfaceDebugPrint(ERROR, "Fail7\n");
+    ASSERT(NT_SUCCESS(XENBUS_GNTTAB(UnmapForeignPages,
+                                    &Fdo->GnttabInterface,
+                                    Context->Address
+                                    )));
+
+fail6:
+    XenIfaceDebugPrint(ERROR, "Fail6\n");
+
+fail5:
+    XenIfaceDebugPrint(ERROR, "Fail5\n");
+    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabGetMapResult(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_GNTTAB_GET_MAP_RESULT_IN In = Buffer;
+    PXENIFACE_GNTTAB_GET_MAP_RESULT_OUT Out = Buffer;
+    XENIFACE_CONTEXT_ID Id;
+    KIRQL Irql;
+    PIRP Irp;
+    PXENIFACE_MAP_CONTEXT Context;
+    PXENIFACE_CONTEXT_ID ContextId;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_GNTTAB_GET_MAP_RESULT_IN) || OutLen != sizeof(XENIFACE_GNTTAB_GET_MAP_RESULT_OUT))
+        goto fail1;
+
+    Id.Type = XENIFACE_CONTEXT_MAP;
+    Id.Process = PsGetCurrentProcess();
+    Id.RequestId = In->RequestId;
+
+    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process, Id.RequestId);
+
+    CsqAcquireLock(&Fdo->IrpQueue, &Irql);
+    Irp = CsqPeekNextIrp(&Fdo->IrpQueue, NULL, &Id);
+
+    status = STATUS_NOT_FOUND;
+    if (Irp == NULL)
+        goto fail2;
+
+    ContextId = Irp->Tail.Overlay.DriverContext[0];
+    Context = CONTAINING_RECORD(ContextId, XENIFACE_MAP_CONTEXT, Id);
+
+    Out->Address = Context->UserVa;
+    XenIfaceDebugPrint(TRACE, "< Address %p, Irp %p\n", Context->UserVa, Irp);
+
+    CsqReleaseLock(&Fdo->IrpQueue, Irql);
+    *Info = OutLen;
+
+    return STATUS_SUCCESS;
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+    CsqReleaseLock(&Fdo->IrpQueue, Irql);
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+_IRQL_requires_max_(APC_LEVEL)
+DECLSPEC_NOINLINE
+VOID
+GnttabFreeMap(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_MAP_CONTEXT Context
+    )
+{
+    NTSTATUS status;
+
+    ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
+
+    XenIfaceDebugPrint(TRACE, "Context %p\n", Context);
+
+    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) {
+        ((PCHAR)Context->KernelVa)[Context->NotifyOffset] = 0;
+    }
+
+    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_PORT) {
+        status = EvtchnNotify(Fdo, Context->NotifyPort, NULL);
+
+        if (!NT_SUCCESS(status)) // non-fatal, we must free memory
+            XenIfaceDebugPrint(ERROR, "failed to notify port %lu: 0x%x\n", Context->NotifyPort, status);
+    }
+
+    // unmap from user address space
+    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
+
+    IoFreeMdl(Context->Mdl);
+
+    // unmap from system space
+    MmUnmapIoSpace(Context->KernelVa, Context->NumberPages * PAGE_SIZE);
+
+    // undo mapping
+    status = XENBUS_GNTTAB(UnmapForeignPages,
+                           &Fdo->GnttabInterface,
+                           Context->Address);
+
+    ASSERT(NT_SUCCESS(status));
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabUnmapForeignPages(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN In = Buffer;
+    PXENIFACE_MAP_CONTEXT Context = NULL;
+    XENIFACE_CONTEXT_ID Id;
+    PIRP PendingIrp;
+    PXENIFACE_CONTEXT_ID ContextId;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN) && OutLen != 0)
+        goto fail1;
+
+    Id.Type = XENIFACE_CONTEXT_MAP;
+    Id.Process = PsGetCurrentProcess();
+    Id.RequestId = In->RequestId;
+
+    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process, Id.RequestId);
+
+    status = STATUS_NOT_FOUND;
+    PendingIrp = IoCsqRemoveNextIrp(&Fdo->IrpQueue, &Id);
+    if (PendingIrp == NULL)
+        goto fail2;
+
+    ContextId = PendingIrp->Tail.Overlay.DriverContext[0];
+    Context = CONTAINING_RECORD(ContextId, XENIFACE_MAP_CONTEXT, Id);
+    GnttabFreeMap(Fdo, Context);
+
+    PendingIrp->IoStatus.Status = STATUS_SUCCESS;
+    PendingIrp->IoStatus.Information = 0;
+    IoCompleteRequest(PendingIrp, IO_NO_INCREMENT);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
diff --git a/src/xeniface/ioctl_store.c b/src/xeniface/ioctl_store.c
new file mode 100644
index 0000000..181c706
--- /dev/null
+++ b/src/xeniface/ioctl_store.c
@@ -0,0 +1,574 @@
+/* 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 "driver.h"
+#include "ioctls.h"
+#include "..\..\include\xeniface_ioctls.h"
+#include "log.h"
+
+#define XENSTORE_ABS_PATH_MAX 3072
+#define XENSTORE_REL_PATH_MAX 2048
+
+static
+NTSTATUS
+__CaptureUserBuffer(
+    __in  PVOID Buffer,
+    __in  ULONG Length,
+    __out PVOID *CapturedBuffer
+    )
+{
+    NTSTATUS Status;
+    PVOID TempBuffer = NULL;
+
+    if (Length == 0) {
+        *CapturedBuffer = NULL;
+        return STATUS_SUCCESS;
+    }
+
+    Status = STATUS_NO_MEMORY;
+    TempBuffer = ExAllocatePoolWithTag(NonPagedPool, Length, XENIFACE_POOL_TAG);
+    if (TempBuffer == NULL)
+        return STATUS_INSUFFICIENT_RESOURCES;
+
+    Status = STATUS_SUCCESS;
+
+#pragma prefast(suppress: 6320) // we want to catch all exceptions
+    try {
+        ProbeForRead(Buffer, Length, 1);
+        RtlCopyMemory(TempBuffer, Buffer, Length);
+    } except(EXCEPTION_EXECUTE_HANDLER) {
+        XenIfaceDebugPrint(ERROR, "Exception while probing/reading buffer at %p, size 0x%lx\n", Buffer, Length);
+        ExFreePoolWithTag(TempBuffer, XENIFACE_POOL_TAG);
+        TempBuffer = NULL;
+        Status = GetExceptionCode();
+    }
+
+    *CapturedBuffer = TempBuffer;
+
+    return Status;
+ }
+
+static
+VOID
+__FreeCapturedBuffer(
+    __in  PVOID CapturedBuffer
+    )
+{
+    if (CapturedBuffer != NULL) {
+        ExFreePoolWithTag(CapturedBuffer, XENIFACE_POOL_TAG);
+    }
+}
+
+static FORCEINLINE
+BOOLEAN
+__IsValidStr(
+    __in  PCHAR             Str,
+    __in  ULONG             Len
+    )
+{
+    for ( ; Len--; ++Str) {
+        if (*Str == '\0')
+            return TRUE;
+        if (!isprint((unsigned char)*Str))
+            break;
+    }
+    return FALSE;
+}
+
+static FORCEINLINE
+ULONG
+__MultiSzLen(
+    __in  PCHAR             Str,
+    __out PULONG            Count
+    )
+{
+    ULONG Length = 0;
+    if (Count)  *Count = 0;
+    do {
+        for ( ; *Str; ++Str, ++Length) ;
+        ++Str; ++Length;
+        if (*Count) ++(*Count);
+    } while (*Str);
+    return Length;
+}
+
+static FORCEINLINE
+VOID
+__DisplayMultiSz(
+    __in PCHAR              Caller,
+    __in PCHAR              Str
+    )
+{
+    PCHAR   Ptr;
+    ULONG   Idx;
+    ULONG   Len;
+
+    for (Ptr = Str, Idx = 0; *Ptr; ++Idx) {
+        Len = (ULONG)strlen(Ptr);
+        XenIfaceDebugPrint(TRACE, "|%s: [%d]=(%d)->\"%s\"\n", Caller, Idx, Len, Ptr);
+        Ptr += (Len + 1);
+    }
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRead(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS    status;
+    PCHAR       Value;
+    ULONG       Length;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen == 0)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (!__IsValidStr(Buffer, InLen))
+        goto fail2;
+
+    status = XENBUS_STORE(Read, &Fdo->StoreInterface, NULL, NULL, Buffer, &Value);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    Length = (ULONG)strlen(Value) + 1;
+
+    status = STATUS_BUFFER_OVERFLOW;
+    if (OutLen == 0) {
+        XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)\n", Buffer, Length);
+        goto done;
+    }
+
+    status = STATUS_INVALID_PARAMETER;
+    if (OutLen < Length)
+        goto fail4;
+
+    XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)->\"%s\"\n", Buffer, Length, Value);
+
+    RtlCopyMemory(Buffer, Value, Length);
+    Buffer[Length - 1] = 0;
+    status = STATUS_SUCCESS;
+
+done:
+    *Info = (ULONG_PTR)Length;
+    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
+    return status;
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")=(%d < %d)\n", Buffer, OutLen, Length);
+    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreWrite(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    )
+{
+    NTSTATUS    status;
+    PCHAR       Value;
+    ULONG       Length;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen == 0 || OutLen != 0)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (!__IsValidStr(Buffer, InLen))
+        goto fail2;
+
+    Length = (ULONG)strlen(Buffer) + 1;
+    Value = Buffer + Length;
+
+    if (!__IsValidStr(Value, InLen - Length))
+        goto fail3;
+
+    status = XENBUS_STORE(Printf, &Fdo->StoreInterface, NULL, NULL, Buffer, Value);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+    XenIfaceDebugPrint(TRACE, "(\"%s\"=\"%s\")\n", Buffer, Value);
+    return status;
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")\n", Value);
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreDirectory(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS    status;
+    PCHAR       Value;
+    ULONG       Length;
+    ULONG       Count;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen == 0)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (!__IsValidStr(Buffer, InLen))
+        goto fail2;
+
+    status = XENBUS_STORE(Directory, &Fdo->StoreInterface, NULL, NULL, Buffer, &Value);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    Length = __MultiSzLen(Value, &Count) + 1;
+
+    status = STATUS_BUFFER_OVERFLOW;
+    if (OutLen == 0) {
+        XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)(%d)\n", Buffer, Length, Count);
+        goto done;
+    }
+
+    status = STATUS_INVALID_PARAMETER;
+    if (OutLen < Length)
+        goto fail4;
+
+    XenIfaceDebugPrint(INFO, "(\"%s\")=(%d)(%d)\n", Buffer, Length, Count);
+#if DBG
+    __DisplayMultiSz(__FUNCTION__, Value);
+#endif
+
+    RtlCopyMemory(Buffer, Value, Length);
+    Buffer[Length - 2] = 0;
+    Buffer[Length - 1] = 0;
+    status = STATUS_SUCCESS;
+
+done:
+    *Info = (ULONG_PTR)Length;
+    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
+    return status;
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")=(%d < %d)\n", Buffer, OutLen, Length);
+    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRemove(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    )
+{
+    NTSTATUS    status;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen == 0 || OutLen != 0)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (!__IsValidStr(Buffer, InLen))
+        goto fail2;
+
+    status = XENBUS_STORE(Remove, &Fdo->StoreInterface, NULL, NULL, Buffer);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    XenIfaceDebugPrint(TRACE, "(\"%s\")\n", Buffer);
+    return status;
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreSetPermissions(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_STORE_SET_PERMISSIONS_IN In = Buffer;
+    ULONG Index;
+    PCHAR Path;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen < sizeof(XENIFACE_STORE_SET_PERMISSIONS_IN) || OutLen != 0)
+        goto fail1;
+
+    if (InLen < sizeof(XENIFACE_STORE_SET_PERMISSIONS_IN) + In->NumberPermissions * sizeof(XENBUS_STORE_PERMISSION))
+        goto fail2;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (In->PathLength == 0 || In->PathLength > XENSTORE_ABS_PATH_MAX)
+        goto fail3;
+
+    status = __CaptureUserBuffer(In->Path, In->PathLength, &Path);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+    Path[In->PathLength - 1] = 0;
+    XenIfaceDebugPrint(TRACE, "> Path '%s', NumberPermissions %lu\n", Path, In->NumberPermissions);
+
+    for (Index = 0; Index < In->NumberPermissions; Index++) {
+        XenIfaceDebugPrint(TRACE, "> %lu: Domain %d, Mask 0x%x\n", Index, In->Permissions[Index].Domain, In->Permissions[Index].Mask);
+        if ((In->Permissions[Index].Mask & ~XENIFACE_STORE_ALLOWED_PERMISSIONS) != 0)
+            goto fail5;
+    }
+
+    status = XENBUS_STORE(PermissionsSet,
+                          &Fdo->StoreInterface,
+                          NULL, // transaction
+                          NULL, // prefix
+                          Path,
+                          In->Permissions,
+                          In->NumberPermissions);
+
+    if (!NT_SUCCESS(status))
+        goto fail6;
+
+    __FreeCapturedBuffer(Path);
+    return status;
+
+fail6:
+    XenIfaceDebugPrint(ERROR, "Fail6\n");
+fail5:
+    XenIfaceDebugPrint(ERROR, "Fail5\n");
+    __FreeCapturedBuffer(Path);
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreAddWatch(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_STORE_ADD_WATCH_IN In = Buffer;
+    PXENIFACE_STORE_ADD_WATCH_OUT Out = Buffer;
+    PCHAR Path;
+    PXENIFACE_STORE_CONTEXT Context;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_STORE_ADD_WATCH_IN) || OutLen != sizeof(XENIFACE_STORE_ADD_WATCH_OUT))
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (In->PathLength == 0 || In->PathLength > XENSTORE_ABS_PATH_MAX)
+        goto fail2;
+
+    status = __CaptureUserBuffer(In->Path, In->PathLength, &Path);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    Path[In->PathLength - 1] = 0;
+
+    status = STATUS_NO_MEMORY;
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_STORE_CONTEXT), XENIFACE_POOL_TAG);
+    if (Context == NULL)
+        goto fail4;
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
+
+    Context->FileObject = FileObject;
+
+    status = ObReferenceObjectByHandle(In->Event, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode, &Context->Event, NULL);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
+    XenIfaceDebugPrint(TRACE, "> Path '%s', Event %p, FO %p\n", Path, In->Event, FileObject);
+
+    status = XENBUS_STORE(WatchAdd,
+                          &Fdo->StoreInterface,
+                          NULL, // prefix
+                          Path,
+                          Context->Event,
+                          &Context->Watch);
+
+    if (!NT_SUCCESS(status))
+        goto fail6;
+
+    __FreeCapturedBuffer(Path);
+
+    ExInterlockedInsertTailList(&Fdo->StoreWatchList, &Context->Entry, &Fdo->StoreWatchLock);
+
+    XenIfaceDebugPrint(TRACE, "< Context %p, Watch %p\n", Context, Context->Watch);
+
+    Out->Context = Context;
+    *Info = sizeof(XENIFACE_STORE_ADD_WATCH_OUT);
+
+    return status;
+
+fail6:
+    XenIfaceDebugPrint(ERROR, "Fail6\n");
+    ObDereferenceObject(Context->Event);
+fail5:
+    XenIfaceDebugPrint(ERROR, "Fail5\n");
+    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+    __FreeCapturedBuffer(Path);
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+_IRQL_requires_max_(DISPATCH_LEVEL)
+VOID
+StoreFreeWatch(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_STORE_CONTEXT Context
+    )
+{
+    NTSTATUS status;
+
+    XenIfaceDebugPrint(TRACE, "Context %p, Watch %p, FO %p\n",
+                       Context, Context->Watch, Context->FileObject);
+
+    status = XENBUS_STORE(WatchRemove,
+                          &Fdo->StoreInterface,
+                          Context->Watch);
+
+    ASSERT(NT_SUCCESS(status)); // this is fatal since we'd leave an active watch without cleaning it up
+
+    ObDereferenceObject(Context->Event);
+    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRemoveWatch(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_STORE_REMOVE_WATCH_IN In = Buffer;
+    PXENIFACE_STORE_CONTEXT Context = NULL;
+    KIRQL Irql;
+    PLIST_ENTRY Node;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_STORE_REMOVE_WATCH_IN) || OutLen != 0)
+        goto fail1;
+
+    XenIfaceDebugPrint(TRACE, "> Context %p, FO %p\n", In->Context, FileObject);
+
+    KeAcquireSpinLock(&Fdo->StoreWatchLock, &Irql);
+    Node = Fdo->StoreWatchList.Flink;
+    while (Node->Flink != Fdo->StoreWatchList.Flink) {
+        Context = CONTAINING_RECORD(Node, XENIFACE_STORE_CONTEXT, Entry);
+
+        Node = Node->Flink;
+        if (Context != In->Context || Context->FileObject != FileObject)
+            continue;
+
+        RemoveEntryList(&Context->Entry);
+        break;
+    }
+    KeReleaseSpinLock(&Fdo->StoreWatchLock, Irql);
+
+    status = STATUS_NOT_FOUND;
+    if (Context == NULL || Context != In->Context)
+        goto fail2;
+
+    StoreFreeWatch(Fdo, Context);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
diff --git a/src/xeniface/ioctls.c b/src/xeniface/ioctls.c
index 3bef9ea..e20b7dc 100644
--- a/src/xeniface/ioctls.c
+++ b/src/xeniface/ioctls.c
@@ -35,287 +35,156 @@
 #include "..\..\include\xeniface_ioctls.h"
 #include "log.h"
 
-static FORCEINLINE BOOLEAN
-__IsValidStr(
-    __in  PCHAR             Str,
-    __in  ULONG             Len
-    )
-{
-    for ( ; Len--; ++Str) {
-        if (*Str == '\0')
-            return TRUE;
-        if (!isprint((unsigned char)*Str))
-            break;
-    }
-    return FALSE;
-}
-static FORCEINLINE ULONG
-__MultiSzLen(
-    __in  PCHAR             Str,
-    __out PULONG            Count
-    )
-{
-    ULONG Length = 0;
-    if (Count)  *Count = 0;
-    do {
-        for ( ; *Str; ++Str, ++Length) ;
-        ++Str; ++Length;
-        if (*Count) ++(*Count);
-    } while (*Str);
-    return Length;
-}
-static FORCEINLINE VOID
-__DisplayMultiSz(
-    __in PCHAR              Caller,
-    __in PCHAR              Str
-    )
-{
-    PCHAR   Ptr;
-    ULONG   Idx;
-    ULONG   Len;
-
-    for (Ptr = Str, Idx = 0; *Ptr; ++Idx) {
-        Len = (ULONG)strlen(Ptr);
-        XenIfaceDebugPrint(INFO, "|%s: [%d]=(%d)->\"%s\"\n", Caller, Idx, Len, Ptr);
-        Ptr += (Len + 1);
-    }
-}
-
-
-static DECLSPEC_NOINLINE NTSTATUS
-IoctlRead(
+// Cleanup store watches and event channels, called on file object close.
+_IRQL_requires_(PASSIVE_LEVEL) // EvtchnFree calls KeFlushQueuedDpcs
+VOID
+XenIfaceCleanup(
     __in  PXENIFACE_FDO         Fdo,
-    __in  PCHAR             Buffer,
-    __in  ULONG             InLen,
-    __in  ULONG             OutLen,
-    __out PULONG_PTR        Info
+    __in  PFILE_OBJECT  FileObject
     )
 {
-    NTSTATUS    status;
-    PCHAR       Value;
-    ULONG       Length;
-
-    status = STATUS_INVALID_BUFFER_SIZE;
-    if (InLen == 0)
-        goto fail1;
-
-    status = STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
-        goto fail2;
-
-    status = XENBUS_STORE(Read, &Fdo->StoreInterface, NULL, NULL, Buffer, &Value);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
-    Length = (ULONG)strlen(Value) + 1;
-
-    status = STATUS_BUFFER_OVERFLOW;
-    if (OutLen == 0) {
-        XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)\n", __FUNCTION__, Buffer, Length);
-        goto done;
+    PLIST_ENTRY Node;
+    PXENIFACE_STORE_CONTEXT StoreContext;
+    PXENIFACE_EVTCHN_CONTEXT EvtchnContext;
+    KIRQL Irql;
+    LIST_ENTRY ToFree;
+
+    XenIfaceDebugPrint(TRACE, "FO %p, IRQL %d, Cpu %lu\n", FileObject, KeGetCurrentIrql(), KeGetCurrentProcessorNumber());
+
+    // store watches
+    KeAcquireSpinLock(&Fdo->StoreWatchLock, &Irql);
+    Node = Fdo->StoreWatchList.Flink;
+    while (Node->Flink != Fdo->StoreWatchList.Flink) {
+        StoreContext = CONTAINING_RECORD(Node, XENIFACE_STORE_CONTEXT, Entry);
+
+        Node = Node->Flink;
+        if (StoreContext->FileObject != FileObject)
+            continue;
+
+        XenIfaceDebugPrint(TRACE, "Store context %p\n", StoreContext);
+        RemoveEntryList(&StoreContext->Entry);
+        StoreFreeWatch(Fdo, StoreContext);
     } 
+    KeReleaseSpinLock(&Fdo->StoreWatchLock, Irql);
     
-    status = STATUS_INVALID_PARAMETER;
-    if (OutLen < Length)
-        goto fail4;
-
-    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)->\"%s\"\n", __FUNCTION__, Buffer, Length, Value);
-
-    RtlCopyMemory(Buffer, Value, Length);
-    Buffer[Length - 1] = 0;
-    status = STATUS_SUCCESS;
+    // event channels
+    InitializeListHead(&ToFree);
+    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
+    Node = Fdo->EvtchnList.Flink;
+    while (Node->Flink != Fdo->EvtchnList.Flink) {
+        EvtchnContext = CONTAINING_RECORD(Node, XENIFACE_EVTCHN_CONTEXT, Entry);
+
+        Node = Node->Flink;
+        if (EvtchnContext->FileObject != FileObject)
+            continue;
+
+        XenIfaceDebugPrint(TRACE, "Evtchn context %p\n", EvtchnContext);
+        RemoveEntryList(&EvtchnContext->Entry);
+        // EvtchnFree requires PASSIVE_LEVEL and we're inside a lock
+        InsertTailList(&ToFree, &EvtchnContext->Entry);
+    }
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
 
-done:
-    *Info = (ULONG_PTR)Length;
-    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
-    return status;
+    Node = ToFree.Flink;
+    while (Node->Flink != ToFree.Flink) {
+        EvtchnContext = CONTAINING_RECORD(Node, XENIFACE_EVTCHN_CONTEXT, Entry);
+        Node = Node->Flink;
 
-fail4:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")=(%d < %d)\n", __FUNCTION__, Buffer, OutLen, Length);
-    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
-fail3:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__, Buffer);
-fail2:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
-fail1:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__, status);
-    return status;
+        RemoveEntryList(&EvtchnContext->Entry);
+        EvtchnFree(Fdo, EvtchnContext);
 }
-
-static DECLSPEC_NOINLINE NTSTATUS
-IoctlWrite(
-    __in  PXENIFACE_FDO         Fdo,
-    __in  PCHAR             Buffer,
-    __in  ULONG             InLen,
-    __in  ULONG             OutLen
-    )
-{
-    NTSTATUS    status;
-    PCHAR       Value;
-    ULONG       Length;
-
-    status = STATUS_INVALID_BUFFER_SIZE;
-    if (InLen == 0 || OutLen != 0)
-        goto fail1;
-
-    status = STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
-        goto fail2;
-
-    Length = (ULONG)strlen(Buffer) + 1;
-    Value = Buffer + Length;
-
-    if (!__IsValidStr(Value, InLen - Length))
-        goto fail3;
-
-    status = XENBUS_STORE(Printf, &Fdo->StoreInterface, NULL, NULL, Buffer, Value);
-    if (!NT_SUCCESS(status))
-        goto fail4;
-
-    XenIfaceDebugPrint(INFO, "|%s: (\"%s\"=\"%s\")\n", __FUNCTION__, Buffer, Value);
-    return status;
-
-fail4:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")\n", __FUNCTION__, Value);
-fail3:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__, Buffer);
-fail2:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
-fail1:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__, status);
-    return status;
 }
 
-static DECLSPEC_NOINLINE NTSTATUS
-IoctlDirectory(
+NTSTATUS
+XenIfaceIoctl(
     __in  PXENIFACE_FDO         Fdo,
-    __in  PCHAR             Buffer,
-    __in  ULONG             InLen,
-    __in  ULONG             OutLen,
-    __out PULONG_PTR        Info
+    __inout  PIRP              Irp
     )
 {
     NTSTATUS    status;
-    PCHAR       Value;
-    ULONG       Length;
-    ULONG       Count;
-
-    status = STATUS_INVALID_BUFFER_SIZE;
-    if (InLen == 0)
-        goto fail1;
-
-    status = STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
-        goto fail2;
-
-    status = XENBUS_STORE(Directory, &Fdo->StoreInterface, NULL, NULL, Buffer, &Value);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
-    Length = __MultiSzLen(Value, &Count) + 1;
+    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
+    PVOID               Buffer = Irp->AssociatedIrp.SystemBuffer;
+    ULONG               InLen = Stack->Parameters.DeviceIoControl.InputBufferLength;
+    ULONG               OutLen = Stack->Parameters.DeviceIoControl.OutputBufferLength;
 
-    status = STATUS_BUFFER_OVERFLOW;
-    if (OutLen == 0) {
-        XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)(%d)\n", __FUNCTION__, Buffer, Length, Count);
+    status = STATUS_DEVICE_NOT_READY;
+    if (Fdo->InterfacesAcquired == FALSE)
         goto done;
-    } 
 
-    status = STATUS_INVALID_PARAMETER;
-    if (OutLen < Length)
-        goto fail4;
+    switch (Stack->Parameters.DeviceIoControl.IoControlCode) {
+        // store
+    case IOCTL_XENIFACE_STORE_READ:
+        status = IoctlStoreRead(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp->IoStatus.Information);
+        break;
 
-    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)(%d)\n", __FUNCTION__, Buffer, Length, Count);
-#if DBG
-    __DisplayMultiSz(__FUNCTION__, Value);
-#endif
+    case IOCTL_XENIFACE_STORE_WRITE:
+        status = IoctlStoreWrite(Fdo, (PCHAR)Buffer, InLen, OutLen);
+        break;
 
-    RtlCopyMemory(Buffer, Value, Length);
-    Buffer[Length - 2] = 0;
-    Buffer[Length - 1] = 0;
-    status = STATUS_SUCCESS;
+    case IOCTL_XENIFACE_STORE_DIRECTORY:
+        status = IoctlStoreDirectory(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp->IoStatus.Information);
+        break;
 
-done:
-    *Info = (ULONG_PTR)Length;
-    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
-    return status;
+    case IOCTL_XENIFACE_STORE_REMOVE:
+        status = IoctlStoreRemove(Fdo, (PCHAR)Buffer, InLen, OutLen);
+        break;
 
-fail4:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")=(%d < %d)\n", __FUNCTION__, Buffer, OutLen, Length);
-    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
-fail3:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__, Buffer);
-fail2:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
-fail1:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__, status);
-    return status;
-}
+    case IOCTL_XENIFACE_STORE_SET_PERMISSIONS:
+        status = IoctlStoreSetPermissions(Fdo, Buffer, InLen, OutLen);
+        break;
 
-static DECLSPEC_NOINLINE NTSTATUS
-IoctlRemove(
-    __in  PXENIFACE_FDO         Fdo,
-    __in  PCHAR             Buffer,
-    __in  ULONG             InLen,
-    __in  ULONG             OutLen
-    )
-{
-    NTSTATUS    status;
+    case IOCTL_XENIFACE_STORE_ADD_WATCH:
+        status = IoctlStoreAddWatch(Fdo, Buffer, InLen, OutLen, Stack->FileObject, &Irp->IoStatus.Information);
+        break;
 
-    status = STATUS_INVALID_BUFFER_SIZE;
-    if (InLen == 0 || OutLen != 0)
-        goto fail1;
+    case IOCTL_XENIFACE_STORE_REMOVE_WATCH:
+        status = IoctlStoreRemoveWatch(Fdo, Buffer, InLen, OutLen, Stack->FileObject);
+        break;
 
-    status = STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
-        goto fail2;
+        // evtchn
+    case IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND:
+        status = IoctlEvtchnBindUnbound(Fdo, Buffer, InLen, OutLen, Stack->FileObject, &Irp->IoStatus.Information);
+        break;
 
-    status = XENBUS_STORE(Remove, &Fdo->StoreInterface, NULL, NULL, Buffer);
-    if (!NT_SUCCESS(status))
-        goto fail3;
+    case IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN:
+        status = IoctlEvtchnBindInterdomain(Fdo, Buffer, InLen, OutLen, Stack->FileObject, &Irp->IoStatus.Information);
+        break;
 
-    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")\n", __FUNCTION__, Buffer);
-    return status;
+    case IOCTL_XENIFACE_EVTCHN_CLOSE:
+        status = IoctlEvtchnClose(Fdo, Buffer, InLen, OutLen, Stack->FileObject);
+        break;
 
-fail3:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__, Buffer);
-fail2:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
-fail1:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__, status);
-    return status;
-}
+    case IOCTL_XENIFACE_EVTCHN_NOTIFY:
+        status = IoctlEvtchnNotify(Fdo, Buffer, InLen, OutLen, Stack->FileObject);
+        break;
 
-NTSTATUS
-XenIFaceIoctl(
-    __in  PXENIFACE_FDO         Fdo,
-    __in  PIRP              Irp
-    )
-{
-    NTSTATUS            status;
-    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
-    PVOID               Buffer = Irp->AssociatedIrp.SystemBuffer;
-    ULONG               InLen = Stack->Parameters.DeviceIoControl.InputBufferLength;
-    ULONG               OutLen = Stack->Parameters.DeviceIoControl.OutputBufferLength;
+    case IOCTL_XENIFACE_EVTCHN_UNMASK:
+        status = IoctlEvtchnUnmask(Fdo, Buffer, InLen, OutLen, Stack->FileObject);
+        break;
 
-    status = STATUS_DEVICE_NOT_READY;
-    if (Fdo->InterfacesAcquired == FALSE)
-        goto done;
+        // gnttab
+    case IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS:
+        status = IoctlGnttabPermitForeignAccess(Fdo, Buffer, InLen, OutLen, Irp);
+        break;
 
-    switch (Stack->Parameters.DeviceIoControl.IoControlCode) {
-    case IOCTL_XENIFACE_STORE_READ:
-        status = IoctlRead(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp->IoStatus.Information);
+    case IOCTL_XENIFACE_GNTTAB_GET_GRANT_RESULT:
+        status = IoctlGnttabGetGrantResult(Fdo, Buffer, InLen, OutLen, &Irp->IoStatus.Information);
         break;
 
-    case IOCTL_XENIFACE_STORE_WRITE:
-        status = IoctlWrite(Fdo, (PCHAR)Buffer, InLen, OutLen);
+    case IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS:
+        status = IoctlGnttabRevokeForeignAccess(Fdo, Buffer, InLen, OutLen);
         break;
 
-    case IOCTL_XENIFACE_STORE_DIRECTORY:
-        status = IoctlDirectory(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp->IoStatus.Information);
+    case IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES:
+        status = IoctlGnttabMapForeignPages(Fdo, Buffer, InLen, OutLen, Irp);
         break;
 
-    case IOCTL_XENIFACE_STORE_REMOVE:
-        status = IoctlRemove(Fdo, (PCHAR)Buffer, InLen, OutLen);
+    case IOCTL_XENIFACE_GNTTAB_GET_MAP_RESULT:
+        status = IoctlGnttabGetMapResult(Fdo, Buffer, InLen, OutLen, &Irp->IoStatus.Information);
+        break;
+
+    case IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES:
+        status = IoctlGnttabUnmapForeignPages(Fdo, Buffer, InLen, OutLen);
         break;
 
     default:
@@ -327,6 +196,7 @@ done:
 
 	Irp->IoStatus.Status = status;
 
+    if (status != STATUS_PENDING)
 	IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
     return status;
diff --git a/src/xeniface/ioctls.h b/src/xeniface/ioctls.h
index 7ee7801..00e11e4 100644
--- a/src/xeniface/ioctls.h
+++ b/src/xeniface/ioctls.h
@@ -33,11 +33,322 @@
 #define _IOCTLS_H_
 
 #define XENIFACE_KERNEL_MODE
+#include "xeniface_ioctls.h"
 
+typedef enum _XENIFACE_CONTEXT_TYPE {
+    XENIFACE_CONTEXT_GRANT = 1,
+    XENIFACE_CONTEXT_MAP
+} XENIFACE_CONTEXT_TYPE;
+
+typedef struct _XENIFACE_CONTEXT_ID {
+    XENIFACE_CONTEXT_TYPE  Type;
+    ULONG                  RequestId;
+    PEPROCESS              Process;
+} XENIFACE_CONTEXT_ID, *PXENIFACE_CONTEXT_ID;
+
+typedef struct _XENIFACE_STORE_CONTEXT {
+    LIST_ENTRY             Entry;
+    PXENBUS_STORE_WATCH    Watch;
+    PKEVENT                Event;
+    PVOID                  FileObject;
+} XENIFACE_STORE_CONTEXT, *PXENIFACE_STORE_CONTEXT;
+
+typedef struct _XENIFACE_EVTCHN_CONTEXT {
+    LIST_ENTRY             Entry;
+    PXENBUS_EVTCHN_CHANNEL Channel;
+    ULONG                  LocalPort;
+    PKEVENT                Event;
+    PXENIFACE_FDO          Fdo;
+    BOOLEAN                Active;
+    PVOID                  FileObject;
+} XENIFACE_EVTCHN_CONTEXT, *PXENIFACE_EVTCHN_CONTEXT;
+
+typedef struct _XENIFACE_GRANT_CONTEXT {
+    XENIFACE_CONTEXT_ID        Id;
+    LIST_ENTRY                 Entry;
+    PXENBUS_GNTTAB_ENTRY       *Grants;
+    USHORT                     RemoteDomain;
+    ULONG                      NumberPages;
+    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
+    ULONG                      NotifyOffset;
+    ULONG                      NotifyPort;
+    PVOID                      KernelVa;
+    PVOID                      UserVa;
+    PMDL                       Mdl;
+} XENIFACE_GRANT_CONTEXT, *PXENIFACE_GRANT_CONTEXT;
+
+typedef struct _XENIFACE_MAP_CONTEXT {
+    XENIFACE_CONTEXT_ID        Id;
+    LIST_ENTRY                 Entry;
+    USHORT                     RemoteDomain;
+    ULONG                      NumberPages;
+    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
+    ULONG                      NotifyOffset;
+    ULONG                      NotifyPort;
+    PHYSICAL_ADDRESS           Address;
+    PVOID                      KernelVa;
+    PVOID                      UserVa;
+    PMDL                       Mdl;
+} XENIFACE_MAP_CONTEXT, *PXENIFACE_MAP_CONTEXT;
+
+NTSTATUS
+XenIfaceIoctl(
+    __in     PXENIFACE_FDO     Fdo,
+    __inout  PIRP              Irp
+    );
+
+_IRQL_requires_(PASSIVE_LEVEL)
+VOID
+XenIfaceCleanup(
+    __in  PXENIFACE_FDO Fdo,
+    __in  PFILE_OBJECT  FileObject
+    );
+
+DECLSPEC_NOINLINE
 NTSTATUS
-XenIFaceIoctl(
+IoctlStoreRead(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreWrite(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreDirectory(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRemove(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreSetPermissions(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreAddWatch(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRemoveWatch(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    );
+
+_IRQL_requires_max_(DISPATCH_LEVEL)
+VOID
+StoreFreeWatch(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_STORE_CONTEXT Context
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnBindUnbound(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnBindInterdomain(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnClose(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnNotify(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnUnmask(
     __in  PXENIFACE_FDO         Fdo,
-    __in  PIRP              Irp
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    );
+
+_Requires_lock_not_held_(Fdo->EvtchnLock)
+DECLSPEC_NOINLINE
+NTSTATUS
+EvtchnNotify(
+    __in      PXENIFACE_FDO Fdo,
+    __in      ULONG         LocalPort,
+    __in_opt  PFILE_OBJECT  FileObject
+    );
+
+_Function_class_(KDEFERRED_ROUTINE)
+_IRQL_requires_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+VOID
+EvtchnNotificationDpc(
+    __in      PKDPC Dpc,
+    __in_opt  PVOID Context,
+    __in_opt  PVOID Argument1,
+    __in_opt  PVOID Argument2
+    );
+
+_IRQL_requires_(PASSIVE_LEVEL)
+VOID
+EvtchnFree(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_EVTCHN_CONTEXT Context
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabPermitForeignAccess(
+    __in     PXENIFACE_FDO  Fdo,
+    __in     PVOID          Buffer,
+    __in     ULONG          InLen,
+    __in     ULONG          OutLen,
+    __inout  PIRP           Irp
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabGetGrantResult(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabRevokeForeignAccess(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabMapForeignPages(
+    __in     PXENIFACE_FDO     Fdo,
+    __in     PVOID             Buffer,
+    __in     ULONG             InLen,
+    __in     ULONG             OutLen,
+    __inout  PIRP              Irp
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabGetMapResult(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabUnmapForeignPages(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    );
+
+_Acquires_exclusive_lock_(((PXENIFACE_FDO)Argument)->GnttabCacheLock)
+_IRQL_requires_(DISPATCH_LEVEL)
+VOID
+GnttabAcquireLock(
+    __in  PVOID Argument
+    );
+
+_Releases_exclusive_lock_(((PXENIFACE_FDO)Argument)->GnttabCacheLock)
+_IRQL_requires_(DISPATCH_LEVEL)
+VOID
+GnttabReleaseLock(
+    __in  PVOID Argument
+    );
+
+_Function_class_(IO_WORKITEM_ROUTINE)
+VOID
+CompleteGnttabIrp(
+    __in      PDEVICE_OBJECT DeviceObject,
+    __in_opt  PVOID          Context
+    );
+
+_IRQL_requires_max_(APC_LEVEL)
+VOID
+GnttabFreeGrant(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_GRANT_CONTEXT Context
+    );
+
+_IRQL_requires_max_(APC_LEVEL)
+VOID
+GnttabFreeMap(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_MAP_CONTEXT Context
     );
 
 #endif // _IOCTLS_H_
diff --git a/src/xeniface/irp_queue.c b/src/xeniface/irp_queue.c
new file mode 100644
index 0000000..c3bf86c
--- /dev/null
+++ b/src/xeniface/irp_queue.c
@@ -0,0 +1,131 @@
+#include "driver.h"
+#include "irp_queue.h"
+#include "log.h"
+#include "ioctls.h"
+
+// Cancel-safe IRP queue implementation
+
+NTSTATUS
+CsqInsertIrpEx(
+    _In_  PIO_CSQ Csq,
+    _In_  PIRP    Irp,
+    _In_  PVOID   InsertContext // PXENIFACE_CONTEXT_ID
+    )
+{
+    PXENIFACE_FDO Fdo;
+
+    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
+
+    // Fail if a request with the same ID already exists.
+    if (CsqPeekNextIrp(Csq, NULL, InsertContext) != NULL)
+        return STATUS_INVALID_PARAMETER;
+
+    InsertTailList(&Fdo->IrpList, &Irp->Tail.Overlay.ListEntry);
+    return STATUS_SUCCESS;
+}
+
+VOID
+CsqRemoveIrp(
+    _In_  PIO_CSQ Csq,
+    _In_  PIRP    Irp
+    )
+{
+    UNREFERENCED_PARAMETER(Csq);
+
+    RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
+}
+
+PIRP
+CsqPeekNextIrp(
+    _In_      PIO_CSQ Csq,
+    _In_opt_  PIRP    Irp,
+    _In_opt_  PVOID   PeekContext // PXENIFACE_CONTEXT_ID
+    )
+{
+    PXENIFACE_FDO        Fdo;
+    PIRP                 NextIrp = NULL;
+    PLIST_ENTRY          Head, NextEntry;
+    PXENIFACE_CONTEXT_ID Id, TargetId;
+
+    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
+    TargetId = PeekContext;
+    Head = &Fdo->IrpList;
+
+    // If the IRP is NULL, we will start peeking from the list head,
+    // else we will start from that IRP onwards. This is done under the
+    // assumption that new IRPs are always inserted at the tail.
+
+    if (Irp == NULL) {
+        NextEntry = Head->Flink;
+    } else {
+        NextEntry = Irp->Tail.Overlay.ListEntry.Flink;
+    }
+
+    while (NextEntry != Head) {
+        NextIrp = CONTAINING_RECORD(NextEntry, IRP, Tail.Overlay.ListEntry);
+
+        if (PeekContext) {
+            Id = NextIrp->Tail.Overlay.DriverContext[0];
+            if (Id->RequestId == TargetId->RequestId && Id->Process == TargetId->Process)
+                break;
+        } else {
+            break;
+        }
+        NextIrp = NULL;
+        NextEntry = NextEntry->Flink;
+    }
+
+    return NextIrp;
+}
+
+_IRQL_raises_(DISPATCH_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_Acquires_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)->IrpQueueLock)
+VOID
+CsqAcquireLock(
+    _In_                                       PIO_CSQ Csq,
+    _Out_ _At_(*Irql, _Post_ _IRQL_saves_)     PKIRQL  Irql
+    )
+{
+    PXENIFACE_FDO Fdo;
+
+    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
+
+    KeAcquireSpinLock(&Fdo->IrpQueueLock, Irql);
+}
+
+_IRQL_requires_(DISPATCH_LEVEL)
+_Releases_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)->IrpQueueLock)
+VOID
+CsqReleaseLock(
+    _In_                    PIO_CSQ Csq,
+    _In_ _IRQL_restores_    KIRQL   Irql
+    )
+{
+    PXENIFACE_FDO Fdo;
+
+    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
+
+    KeReleaseSpinLock(&Fdo->IrpQueueLock, Irql);
+}
+
+_IRQL_requires_max_(DISPATCH_LEVEL)
+VOID
+CsqCompleteCanceledIrp(
+    _In_  PIO_CSQ Csq,
+    _In_  PIRP    Irp
+    )
+{
+    PXENIFACE_FDO Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
+    PIO_WORKITEM WorkItem;
+
+    XenIfaceDebugPrint(TRACE, "Irp %p, IRQL %d\n",
+                       Irp, KeGetCurrentIrql());
+
+    // This is not guaranteed to run at PASSIVE_LEVEL, so queue a work item
+    // to perform actual cleanup/IRP completion.
+
+    WorkItem = IoAllocateWorkItem(Fdo->Dx->DeviceObject);
+    Irp->Tail.Overlay.DriverContext[1] = WorkItem; // store so the work item can free it
+    IoQueueWorkItem(WorkItem, CompleteGnttabIrp, DelayedWorkQueue, Irp);
+}
diff --git a/src/xeniface/irp_queue.h b/src/xeniface/irp_queue.h
new file mode 100644
index 0000000..746ee19
--- /dev/null
+++ b/src/xeniface/irp_queue.h
@@ -0,0 +1,50 @@
+#ifndef _IRP_QUEUE_H_
+#define _IRP_QUEUE_H_
+
+#include <ntddk.h>
+
+NTSTATUS
+CsqInsertIrpEx(
+    _In_  PIO_CSQ Csq,
+    _In_  PIRP    Irp,
+    _In_  PVOID   InsertContext
+    );
+
+VOID
+CsqRemoveIrp(
+    _In_  PIO_CSQ Csq,
+    _In_  PIRP    Irp
+    );
+
+PIRP
+CsqPeekNextIrp(
+    _In_      PIO_CSQ Csq,
+    _In_opt_  PIRP    Irp,
+    _In_opt_  PVOID   PeekContext // PXENIFACE_CONTEXT_ID
+    );
+
+_IRQL_raises_(DISPATCH_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_Acquires_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)->IrpQueueLock)
+VOID
+CsqAcquireLock(
+    _In_                                       PIO_CSQ Csq,
+    _Out_ _At_(*Irql, _Post_ _IRQL_saves_)     PKIRQL  Irql
+    );
+
+_IRQL_requires_(DISPATCH_LEVEL)
+_Releases_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)->IrpQueueLock)
+VOID
+CsqReleaseLock(
+    _In_                    PIO_CSQ Csq,
+    _In_ _IRQL_restores_    KIRQL   Irql
+    );
+
+_IRQL_requires_max_(DISPATCH_LEVEL)
+VOID
+CsqCompleteCanceledIrp(
+    _In_  PIO_CSQ             Csq,
+    _In_  PIRP                Irp
+    );
+
+#endif
diff --git a/vs2013/xeniface/xeniface.vcxproj b/vs2013/xeniface/xeniface.vcxproj
index fea2ad1..14f1338 100644
--- a/vs2013/xeniface/xeniface.vcxproj
+++ b/vs2013/xeniface/xeniface.vcxproj
@@ -131,6 +131,10 @@
     <ClCompile Include="../../src/xeniface/fdo.c" />
     <ClCompile Include="../../src/xeniface/registry.c" />
     <ClCompile Include="../../src\xeniface/thread.c" />
+    <ClCompile Include="..\..\src\xeniface\ioctl_evtchn.c" />
+    <ClCompile Include="..\..\src\xeniface\ioctl_gnttab.c" />
+    <ClCompile Include="..\..\src\xeniface\ioctl_store.c" />
+    <ClCompile Include="..\..\src\xeniface\irp_queue.c" />
   </ItemGroup>
   <ItemGroup>
     <Mofcomp Include="../../src/xeniface/wmi.mof">
-- 
1.8.1.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 Wed Oct 07 04:49:02 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 07 Oct 2015 04:49:02 +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 1Zjgf0-0007Vf-6p; Wed, 07 Oct 2015 04:49:02 +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 1Zjgey-0007VV-CS
	for win-pv-devel@lists.xenproject.org; Wed, 07 Oct 2015 04:49:00 +0000
Received: from [85.158.137.68] by server-7.bemta-3.messagelabs.com id
	85/B2-16965-B34A4165; Wed, 07 Oct 2015 04:48:59 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-10.tower-31.messagelabs.com!1444193338!50921829!1
X-Originating-IP: [66.111.4.28]
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 10481 invoked from network); 7 Oct 2015 04:48:59 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-10.tower-31.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Oct 2015 04:48:59 -0000
Received: from compute6.internal (compute6.nyi.internal [10.202.2.46])
	by mailout.nyi.internal (Postfix) with ESMTP id 6D03E20A4C
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:48:58 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute6.internal (MEProxy); Wed, 07 Oct 2015 00:48:58 -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=Z4ieUVR609YG/wu9Vk1oPCwxYCc=; b=j+cidd
	uVVTpY3Usk6qqJCuJyp2BvvWiEMB7P0VV4ezxbWVz3KMr9VRW/gN8/scREntGk64
	xLwUatdKZsevxp1SiVoDus0Kevnk2Xw7Px8Ba4iIEWCTWqH0cKScifHwSWrb1QJT
	g0AaQdLUEfTFhb01+f05eu7nRDKa6tI3c8958=
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=Z4ieUVR609YG/wu9Vk1oPCwxYCc=; b=JmrDZ
	RW+O2Py1HKaUZwSL4aNZ659iO9gLxa1PVsn16M0L2q+4ivxPpfcyAfkyAXBpXIZl
	3Bfk1zeDeHv5lDbuemiOMd0x7fdN4qP6/Dv8A4OTNEhESni+IzJHRQQiVN4Ibssd
	bvrkbi1ue9fHIZqG16BEhlVYH0nJNGM981rbUM=
X-Sasl-enc: 7s6UiloFSbF5BIlebU5i9+PYoS9aJTj6lrYen2nVRu+j 1444193338
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id E94F868023B
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:48:57 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <5614A43D.6060003@invisiblethingslab.com>
Date: Wed, 7 Oct 2015 06:49:01 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 5/5] Bind to the latest XENBUS revision
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

Revision 0x0800000B or later is needed for STORE interface version 2 and
GNTTAB interface version 2.

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 src/xeniface.inf | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/xeniface.inf b/src/xeniface.inf
index b3112b9..df0abf3 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_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_IFACE&REV_08000009
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_IFACE&REV_08000009
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_IFACE&REV_08000009
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_IFACE&REV_0800000B
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_IFACE&REV_0800000B
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_IFACE&REV_0800000B
 
 [XenIface_Device.NT$ARCH$]
 CopyFiles=XenIface_Device.NT.Copy, ServiceDestDir.NT.Copy
-- 
1.8.1.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 Wed Oct 07 04:49:02 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 07 Oct 2015 04:49:02 +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 1Zjgf0-0007Vf-6p; Wed, 07 Oct 2015 04:49:02 +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 1Zjgey-0007VV-CS
	for win-pv-devel@lists.xenproject.org; Wed, 07 Oct 2015 04:49:00 +0000
Received: from [85.158.137.68] by server-7.bemta-3.messagelabs.com id
	85/B2-16965-B34A4165; Wed, 07 Oct 2015 04:48:59 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-10.tower-31.messagelabs.com!1444193338!50921829!1
X-Originating-IP: [66.111.4.28]
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 10481 invoked from network); 7 Oct 2015 04:48:59 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-10.tower-31.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Oct 2015 04:48:59 -0000
Received: from compute6.internal (compute6.nyi.internal [10.202.2.46])
	by mailout.nyi.internal (Postfix) with ESMTP id 6D03E20A4C
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:48:58 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute6.internal (MEProxy); Wed, 07 Oct 2015 00:48:58 -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=Z4ieUVR609YG/wu9Vk1oPCwxYCc=; b=j+cidd
	uVVTpY3Usk6qqJCuJyp2BvvWiEMB7P0VV4ezxbWVz3KMr9VRW/gN8/scREntGk64
	xLwUatdKZsevxp1SiVoDus0Kevnk2Xw7Px8Ba4iIEWCTWqH0cKScifHwSWrb1QJT
	g0AaQdLUEfTFhb01+f05eu7nRDKa6tI3c8958=
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=Z4ieUVR609YG/wu9Vk1oPCwxYCc=; b=JmrDZ
	RW+O2Py1HKaUZwSL4aNZ659iO9gLxa1PVsn16M0L2q+4ivxPpfcyAfkyAXBpXIZl
	3Bfk1zeDeHv5lDbuemiOMd0x7fdN4qP6/Dv8A4OTNEhESni+IzJHRQQiVN4Ibssd
	bvrkbi1ue9fHIZqG16BEhlVYH0nJNGM981rbUM=
X-Sasl-enc: 7s6UiloFSbF5BIlebU5i9+PYoS9aJTj6lrYen2nVRu+j 1444193338
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id E94F868023B
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  7 Oct 2015 00:48:57 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <5614A43D.6060003@invisiblethingslab.com>
Date: Wed, 7 Oct 2015 06:49:01 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 5/5] Bind to the latest XENBUS revision
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

Revision 0x0800000B or later is needed for STORE interface version 2 and
GNTTAB interface version 2.

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 src/xeniface.inf | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/xeniface.inf b/src/xeniface.inf
index b3112b9..df0abf3 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_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_IFACE&REV_08000009
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_IFACE&REV_08000009
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_IFACE&REV_08000009
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_IFACE&REV_0800000B
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_IFACE&REV_0800000B
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_IFACE&REV_0800000B
 
 [XenIface_Device.NT$ARCH$]
 CopyFiles=XenIface_Device.NT.Copy, ServiceDestDir.NT.Copy
-- 
1.8.1.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 Thu Oct 08 09:00:53 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 08 Oct 2015 09:00: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 1Zk74G-00088u-Cj; Thu, 08 Oct 2015 09:00:52 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7160137aa=Paul.Durrant@citrix.com>)
	id 1Zk74F-00088p-8F
	for win-pv-devel@lists.xenproject.org; Thu, 08 Oct 2015 09:00:51 +0000
Received: from [85.158.137.68] by server-5.bemta-3.messagelabs.com id
	70/0E-01748-2C036165; Thu, 08 Oct 2015 09:00:50 +0000
X-Env-Sender: prvs=7160137aa=Paul.Durrant@citrix.com
X-Msg-Ref: server-15.tower-31.messagelabs.com!1444294844!51269757!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 18542 invoked from network); 8 Oct 2015 09:00:45 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-15.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Oct 2015 09:00:45 -0000
X-IronPort-AV: E=Sophos;i="5.17,654,1437436800"; 
   d="scan'208";a="4746535"
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] [PATCH 0/5] Add new IOCTLs to XENIFACE
Thread-Index: AQHRALt5qg48L0qi00aI+wfuhUi8mJ5hTIcg
Date: Thu, 8 Oct 2015 09:00:28 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F606BCA@AMSPEX01CL01.citrite.net>
References: <5614A3F7.10809@invisiblethingslab.com>
In-Reply-To: <5614A3F7.10809@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] [PATCH 0/5] Add new IOCTLs to XENIFACE
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
MDcgT2N0b2JlciAyMDE1IDA1OjQ4DQo+IFRvOiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVj
dC5vcmcNCj4gU3ViamVjdDogW3dpbi1wdi1kZXZlbF0gW1BBVENIIDAvNV0gQWRkIG5ldyBJT0NU
THMgdG8gWEVOSUZBQ0UNCj4gDQo+IFRoaXMgcGF0Y2ggc2VyaWVzIGltcGxlbWVudHMgbmV3IElP
Q1RMcyBuZWVkZWQgZm9yIGxpYnZjaGFuLiBVc2VyIG1vZGUNCj4gY29kZSB3aWxsIGNvbWUgbmV4
dC4gU29tZSBub3RlczoNCj4NCg0KQ29vbC4gVGhhbmtzIGZvciBwb3N0aW5nLi4uIEknbGwgcmV2
aWV3IGFzIHNvb24gYXMgSSBjYW4uDQogDQo+IC0gQWxsIG5ldyBJT0NUTHMgaGF2ZSB0aGVpciBp
bnB1dCBhbmQgb3V0cHV0IGRhdGEgZm9ybWF0IGRlZmluZWQgYXMNCj4gc3RydWN0cy4gSSBrZXB0
IHRoZW0gc2VwYXJhdGUgZm9yIGFsbCBJT0NUTHMgZXZlbiBpZiB0aGUgY29udGVudHMgaXMgdGhl
DQo+IHNhbWUuIE5vdCBzdXJlIGlmIHRoYXQncyBuZWVkZWQgYnV0IEkgZmVlbCBpdCdzIGEgZ29v
ZCBpZGVhIC0tIGlmIG9uZQ0KPiBJT0NUTCBjaGFuZ2VzIGl0cyBkYXRhIGZvcm1hdCwgb3RoZXJz
IHdvbid0IGJlIGFmZmVjdGVkLg0KPiANCg0KSSB0aGluayB0aGF0J3MgYSBnb29kIGRlY2lzaW9u
LiBJdCdzIHRoZSBtb2RlbCBJIHRlbmQgdG8gcHJlZmVyLg0KDQo+IC0gR3JhbnQvbWFwIElPQ1RM
cyBhcmUgcGVuZGVkIGZvcmV2ZXIsIGEgc2VwYXJhdGUgSU9DVEwgaXMgdXNlZCB0byBnZXQNCj4g
dGhlaXIgYWN0dWFsIHJlc3VsdC4gVW5tYXBwaW5nIG1lbW9yeSBmcm9tIHVzZXIgbW9kZSBuZWVk
cyB0byBiZSBkb25lDQo+IGJlbG93IERJU1BBVENIX0xFVkVMIGFuZCBpbiBjb250ZXh0IG9mIHRo
ZSBzYW1lIHByb2Nlc3MsIGJ1dCBjYW5jZWwNCj4gcm91dGluZXMgYXJlIG5vdCBndWFyYW50ZWVk
IHRvIGJlIGVpdGhlci4gVGVzdHMgc2hvd2VkIHRoYXQgdGhleSB3ZXJlDQo+IGFsd2F5cyBjYWxs
ZWQgYXQgQVBDX0xFVkVMIGFuZCBpbiB0aGUgY29ycmVjdCBjb250ZXh0LCBidXQgdG8gYmUgc2Fm
ZSBJDQo+IHF1ZXVlIGEgd29yayBpdGVtIHRvIGV4ZWN1dGUgYXQgUEFTU0lWRSBhbmQgdXNlIEtl
U3RhY2tBdHRhY2hQcm9jZXNzIHRvDQo+IGNoYW5nZSB0aGUgYWRkcmVzcyBzcGFjZS4NCj4gDQoN
CkNhbiB5b3Ugbm90IGRpcmVjdGx5IEtlU3RhY2tBdHRhY2hQcm9jZXNzKCkgaW4gdGhlIGNhbmNl
bGxhdGlvbiByb3V0aW5lPw0KDQo+IC0gSXMgdGhlcmUgYSBwYXJ0aWN1bGFyIHJlYXNvbiBmb3Ig
aGVhZGVyIGZpbGVzIG5vdCBiZWluZyBpbmNsdWRlZCBpbiBWUw0KPiBwcm9qZWN0cz8gVGhhdCB3
b3VsZCBoZWxwIHdpdGggbmF2aWdhdGluZyB0aGUgY29kZS4NCj4gDQoNCk5vLCBub25lIGF0IGFs
bC4gSSBkb24ndCB1c2UgVmlzdWFsIFN0dWRpbyBmb3IgZWRpdGluZyBzbyBpZiBhZGRpbmcgdGhl
IGhlYWRlciBmaWxlcyBpbnRvIHRoZSBwcm9qZWN0cyB3b3VsZCBoZWxwIHBsZWFzZSBmZWVsIGZy
ZWUuDQoNCj4gLSBJIG9ubHkgdXBkYXRlZCB0aGUgVlMyMDEzIHByb2plY3QsIGRvbid0IGhhdmUg
VlMyMDEyIGF0IGhhbmQgYnV0IGl0J3MNCj4gcHJvYmFibHkgZWFzeSB0byBkbyBieSBoYW5kLg0K
DQpZZXMsIHRoZSB0cmFuc2xhdGlvbiBpcyBub3QgZ2VuZXJhbGx5IGhhcmQgdG8gZG8sIHBsdXMg
dGhlIHZjeHByb2ogZmlsZXMgdGhhdCBWUyB3cml0ZXMgYXJlIHVzdWFsbHkgc28gYmFkIHRoZXkg
bmVlZCB0byBiZSBoYW5kIGVkaXRlZCBhZnRlcndhcmRzIGFueXdheS4NCg0KICBQYXVsDQoNCj4g
DQo+IC0gRmVlbCBmcmVlIHRvIGNoYW5nZSBuYW1lcy9mb3JtYXR0aW5nIGlmL3doZXJlIG5lZWRl
ZCA6KQ0KPiANCj4gLS0NCj4gUmFmYcWCIFdvamR5xYJhDQo+IFF1YmVzIFRvb2xzIGZvciBXaW5k
b3dzIGRldmVsb3Blcg0KPiBodHRwczovL3d3dy5xdWJlcy1vcy5vcmcvDQo+IA0KPiBfX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KPiB3aW4tcHYtZGV2ZWwg
bWFpbGluZyBsaXN0DQo+IHdpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZw0KPiBodHRw
Oi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1k
ZXZlbA0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18Kd2lu
LXB2LWRldmVsIG1haWxpbmcgbGlzdAp3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcK
aHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4vbWFpbG1hbi9saXN0aW5mby93aW4t
cHYtZGV2ZWw=

From win-pv-devel-bounces@lists.xenproject.org Thu Oct 08 09:00:53 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 08 Oct 2015 09:00: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 1Zk74G-00088u-Cj; Thu, 08 Oct 2015 09:00:52 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7160137aa=Paul.Durrant@citrix.com>)
	id 1Zk74F-00088p-8F
	for win-pv-devel@lists.xenproject.org; Thu, 08 Oct 2015 09:00:51 +0000
Received: from [85.158.137.68] by server-5.bemta-3.messagelabs.com id
	70/0E-01748-2C036165; Thu, 08 Oct 2015 09:00:50 +0000
X-Env-Sender: prvs=7160137aa=Paul.Durrant@citrix.com
X-Msg-Ref: server-15.tower-31.messagelabs.com!1444294844!51269757!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 18542 invoked from network); 8 Oct 2015 09:00:45 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-15.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Oct 2015 09:00:45 -0000
X-IronPort-AV: E=Sophos;i="5.17,654,1437436800"; 
   d="scan'208";a="4746535"
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] [PATCH 0/5] Add new IOCTLs to XENIFACE
Thread-Index: AQHRALt5qg48L0qi00aI+wfuhUi8mJ5hTIcg
Date: Thu, 8 Oct 2015 09:00:28 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F606BCA@AMSPEX01CL01.citrite.net>
References: <5614A3F7.10809@invisiblethingslab.com>
In-Reply-To: <5614A3F7.10809@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] [PATCH 0/5] Add new IOCTLs to XENIFACE
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
MDcgT2N0b2JlciAyMDE1IDA1OjQ4DQo+IFRvOiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVj
dC5vcmcNCj4gU3ViamVjdDogW3dpbi1wdi1kZXZlbF0gW1BBVENIIDAvNV0gQWRkIG5ldyBJT0NU
THMgdG8gWEVOSUZBQ0UNCj4gDQo+IFRoaXMgcGF0Y2ggc2VyaWVzIGltcGxlbWVudHMgbmV3IElP
Q1RMcyBuZWVkZWQgZm9yIGxpYnZjaGFuLiBVc2VyIG1vZGUNCj4gY29kZSB3aWxsIGNvbWUgbmV4
dC4gU29tZSBub3RlczoNCj4NCg0KQ29vbC4gVGhhbmtzIGZvciBwb3N0aW5nLi4uIEknbGwgcmV2
aWV3IGFzIHNvb24gYXMgSSBjYW4uDQogDQo+IC0gQWxsIG5ldyBJT0NUTHMgaGF2ZSB0aGVpciBp
bnB1dCBhbmQgb3V0cHV0IGRhdGEgZm9ybWF0IGRlZmluZWQgYXMNCj4gc3RydWN0cy4gSSBrZXB0
IHRoZW0gc2VwYXJhdGUgZm9yIGFsbCBJT0NUTHMgZXZlbiBpZiB0aGUgY29udGVudHMgaXMgdGhl
DQo+IHNhbWUuIE5vdCBzdXJlIGlmIHRoYXQncyBuZWVkZWQgYnV0IEkgZmVlbCBpdCdzIGEgZ29v
ZCBpZGVhIC0tIGlmIG9uZQ0KPiBJT0NUTCBjaGFuZ2VzIGl0cyBkYXRhIGZvcm1hdCwgb3RoZXJz
IHdvbid0IGJlIGFmZmVjdGVkLg0KPiANCg0KSSB0aGluayB0aGF0J3MgYSBnb29kIGRlY2lzaW9u
LiBJdCdzIHRoZSBtb2RlbCBJIHRlbmQgdG8gcHJlZmVyLg0KDQo+IC0gR3JhbnQvbWFwIElPQ1RM
cyBhcmUgcGVuZGVkIGZvcmV2ZXIsIGEgc2VwYXJhdGUgSU9DVEwgaXMgdXNlZCB0byBnZXQNCj4g
dGhlaXIgYWN0dWFsIHJlc3VsdC4gVW5tYXBwaW5nIG1lbW9yeSBmcm9tIHVzZXIgbW9kZSBuZWVk
cyB0byBiZSBkb25lDQo+IGJlbG93IERJU1BBVENIX0xFVkVMIGFuZCBpbiBjb250ZXh0IG9mIHRo
ZSBzYW1lIHByb2Nlc3MsIGJ1dCBjYW5jZWwNCj4gcm91dGluZXMgYXJlIG5vdCBndWFyYW50ZWVk
IHRvIGJlIGVpdGhlci4gVGVzdHMgc2hvd2VkIHRoYXQgdGhleSB3ZXJlDQo+IGFsd2F5cyBjYWxs
ZWQgYXQgQVBDX0xFVkVMIGFuZCBpbiB0aGUgY29ycmVjdCBjb250ZXh0LCBidXQgdG8gYmUgc2Fm
ZSBJDQo+IHF1ZXVlIGEgd29yayBpdGVtIHRvIGV4ZWN1dGUgYXQgUEFTU0lWRSBhbmQgdXNlIEtl
U3RhY2tBdHRhY2hQcm9jZXNzIHRvDQo+IGNoYW5nZSB0aGUgYWRkcmVzcyBzcGFjZS4NCj4gDQoN
CkNhbiB5b3Ugbm90IGRpcmVjdGx5IEtlU3RhY2tBdHRhY2hQcm9jZXNzKCkgaW4gdGhlIGNhbmNl
bGxhdGlvbiByb3V0aW5lPw0KDQo+IC0gSXMgdGhlcmUgYSBwYXJ0aWN1bGFyIHJlYXNvbiBmb3Ig
aGVhZGVyIGZpbGVzIG5vdCBiZWluZyBpbmNsdWRlZCBpbiBWUw0KPiBwcm9qZWN0cz8gVGhhdCB3
b3VsZCBoZWxwIHdpdGggbmF2aWdhdGluZyB0aGUgY29kZS4NCj4gDQoNCk5vLCBub25lIGF0IGFs
bC4gSSBkb24ndCB1c2UgVmlzdWFsIFN0dWRpbyBmb3IgZWRpdGluZyBzbyBpZiBhZGRpbmcgdGhl
IGhlYWRlciBmaWxlcyBpbnRvIHRoZSBwcm9qZWN0cyB3b3VsZCBoZWxwIHBsZWFzZSBmZWVsIGZy
ZWUuDQoNCj4gLSBJIG9ubHkgdXBkYXRlZCB0aGUgVlMyMDEzIHByb2plY3QsIGRvbid0IGhhdmUg
VlMyMDEyIGF0IGhhbmQgYnV0IGl0J3MNCj4gcHJvYmFibHkgZWFzeSB0byBkbyBieSBoYW5kLg0K
DQpZZXMsIHRoZSB0cmFuc2xhdGlvbiBpcyBub3QgZ2VuZXJhbGx5IGhhcmQgdG8gZG8sIHBsdXMg
dGhlIHZjeHByb2ogZmlsZXMgdGhhdCBWUyB3cml0ZXMgYXJlIHVzdWFsbHkgc28gYmFkIHRoZXkg
bmVlZCB0byBiZSBoYW5kIGVkaXRlZCBhZnRlcndhcmRzIGFueXdheS4NCg0KICBQYXVsDQoNCj4g
DQo+IC0gRmVlbCBmcmVlIHRvIGNoYW5nZSBuYW1lcy9mb3JtYXR0aW5nIGlmL3doZXJlIG5lZWRl
ZCA6KQ0KPiANCj4gLS0NCj4gUmFmYcWCIFdvamR5xYJhDQo+IFF1YmVzIFRvb2xzIGZvciBXaW5k
b3dzIGRldmVsb3Blcg0KPiBodHRwczovL3d3dy5xdWJlcy1vcy5vcmcvDQo+IA0KPiBfX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KPiB3aW4tcHYtZGV2ZWwg
bWFpbGluZyBsaXN0DQo+IHdpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZw0KPiBodHRw
Oi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1k
ZXZlbA0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18Kd2lu
LXB2LWRldmVsIG1haWxpbmcgbGlzdAp3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcK
aHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4vbWFpbG1hbi9saXN0aW5mby93aW4t
cHYtZGV2ZWw=

From win-pv-devel-bounces@lists.xenproject.org Thu Oct 08 13:33:37 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 08 Oct 2015 13:33: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 1ZkBKB-0005X7-Uk; Thu, 08 Oct 2015 13:33:35 +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 1ZkBKB-0005X2-0r
	for win-pv-devel@lists.xenproject.org; Thu, 08 Oct 2015 13:33:35 +0000
Received: from [85.158.137.68] by server-1.bemta-3.messagelabs.com id
	59/AD-01421-EA076165; Thu, 08 Oct 2015 13:33:34 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-2.tower-31.messagelabs.com!1444311208!20342958!1
X-Originating-IP: [66.111.4.29]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjkgPT4gNjQ0MA==\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25588 invoked from network); 8 Oct 2015 13:33:29 -0000
Received: from out5-smtp.messagingengine.com (HELO
	out5-smtp.messagingengine.com) (66.111.4.29)
	by server-2.tower-31.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 8 Oct 2015 13:33:29 -0000
Received: from compute6.internal (compute6.nyi.internal [10.202.2.46])
	by mailout.nyi.internal (Postfix) with ESMTP id 215D720351
	for <win-pv-devel@lists.xenproject.org>;
	Thu,  8 Oct 2015 09:33:28 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute6.internal (MEProxy); Thu, 08 Oct 2015 09:33:28 -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=TZhMG2Dil6SMYYsq
	OoEU0lpII+Q=; b=JJ8FKAFFElwCz3OjU/yOIQSdzIeOEPhQ05vEXpNn2dif5x2J
	GFUWW4aealgYfK1T/dyO7cy64ZOZkaTXI9BCilE7Rcfi4i9Wx6EGC33dV2K4UkWD
	IdKXfdadKwvz64iXcubFBD7KyxZS375mI2C/HKGgFHTvtMWcUGUkoTWHHMw=
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=TZhMG2Dil6SMYYs
	qOoEU0lpII+Q=; b=dnhIuK//igTL3DClGOx3nssU+8iWHaIK8mxsucdAVrjnEQz
	yBnh8P4FKmoE+Qlp6bD3igRFPkH7FKyexSBuhaEoHj5DCUkvMXXfTlXAf5KFC+Yd
	U8Tii9HLs3wQ/lnJoxBL6w0k1V/nFPRELM1Pz1hrazaZC/ZccoTyjZ0g4OxU=
X-Sasl-enc: t+NZvRaBKxMmEllG04HtFgfnHVwFkucj65cWwcakPq5q 1444311207
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 64550680194;
	Thu,  8 Oct 2015 09:33:27 -0400 (EDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <5614A3F7.10809@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F606BCA@AMSPEX01CL01.citrite.net>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1110
Message-ID: <561670A6.70807@invisiblethingslab.com>
Date: Thu, 8 Oct 2015 15:33:26 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F606BCA@AMSPEX01CL01.citrite.net>
Content-Length: 4430
Subject: Re: [win-pv-devel] [PATCH 0/5] Add new IOCTLs to XENIFACE
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

T24gMjAxNS0xMC0wOCAxMTowMCwgUGF1bCBEdXJyYW50IHdyb3RlOgo+PiAtLS0tLU9yaWdpbmFs
IE1lc3NhZ2UtLS0tLQo+PiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNlc0BsaXN0cy54ZW5wcm9q
ZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0KPj4gYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0
Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGEKPj4gU2VudDogMDcgT2N0b2JlciAyMDE1
IDA1OjQ4Cj4+IFRvOiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKPj4gU3ViamVj
dDogW3dpbi1wdi1kZXZlbF0gW1BBVENIIDAvNV0gQWRkIG5ldyBJT0NUTHMgdG8gWEVOSUZBQ0UK
Pj4KPj4gVGhpcyBwYXRjaCBzZXJpZXMgaW1wbGVtZW50cyBuZXcgSU9DVExzIG5lZWRlZCBmb3Ig
bGlidmNoYW4uIFVzZXIgbW9kZQo+PiBjb2RlIHdpbGwgY29tZSBuZXh0LiBTb21lIG5vdGVzOgo+
Pgo+IAo+IENvb2wuIFRoYW5rcyBmb3IgcG9zdGluZy4uLiBJJ2xsIHJldmlldyBhcyBzb29uIGFz
IEkgY2FuLgo+ICAKPj4gLSBBbGwgbmV3IElPQ1RMcyBoYXZlIHRoZWlyIGlucHV0IGFuZCBvdXRw
dXQgZGF0YSBmb3JtYXQgZGVmaW5lZCBhcwo+PiBzdHJ1Y3RzLiBJIGtlcHQgdGhlbSBzZXBhcmF0
ZSBmb3IgYWxsIElPQ1RMcyBldmVuIGlmIHRoZSBjb250ZW50cyBpcyB0aGUKPj4gc2FtZS4gTm90
IHN1cmUgaWYgdGhhdCdzIG5lZWRlZCBidXQgSSBmZWVsIGl0J3MgYSBnb29kIGlkZWEgLS0gaWYg
b25lCj4+IElPQ1RMIGNoYW5nZXMgaXRzIGRhdGEgZm9ybWF0LCBvdGhlcnMgd29uJ3QgYmUgYWZm
ZWN0ZWQuCj4+Cj4gCj4gSSB0aGluayB0aGF0J3MgYSBnb29kIGRlY2lzaW9uLiBJdCdzIHRoZSBt
b2RlbCBJIHRlbmQgdG8gcHJlZmVyLgo+IAo+PiAtIEdyYW50L21hcCBJT0NUTHMgYXJlIHBlbmRl
ZCBmb3JldmVyLCBhIHNlcGFyYXRlIElPQ1RMIGlzIHVzZWQgdG8gZ2V0Cj4+IHRoZWlyIGFjdHVh
bCByZXN1bHQuIFVubWFwcGluZyBtZW1vcnkgZnJvbSB1c2VyIG1vZGUgbmVlZHMgdG8gYmUgZG9u
ZQo+PiBiZWxvdyBESVNQQVRDSF9MRVZFTCBhbmQgaW4gY29udGV4dCBvZiB0aGUgc2FtZSBwcm9j
ZXNzLCBidXQgY2FuY2VsCj4+IHJvdXRpbmVzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBlaXRo
ZXIuIFRlc3RzIHNob3dlZCB0aGF0IHRoZXkgd2VyZQo+PiBhbHdheXMgY2FsbGVkIGF0IEFQQ19M
RVZFTCBhbmQgaW4gdGhlIGNvcnJlY3QgY29udGV4dCwgYnV0IHRvIGJlIHNhZmUgSQo+PiBxdWV1
ZSBhIHdvcmsgaXRlbSB0byBleGVjdXRlIGF0IFBBU1NJVkUgYW5kIHVzZSBLZVN0YWNrQXR0YWNo
UHJvY2VzcyB0bwo+PiBjaGFuZ2UgdGhlIGFkZHJlc3Mgc3BhY2UuCj4+Cj4gCj4gQ2FuIHlvdSBu
b3QgZGlyZWN0bHkgS2VTdGFja0F0dGFjaFByb2Nlc3MoKSBpbiB0aGUgY2FuY2VsbGF0aW9uIHJv
dXRpbmU/CgpNU0ROIHNheXMgdGhhdCBLZVN0YWNrQXR0YWNoUHJvY2VzcygpIG5lZWRzIHRvIGJl
IGNhbGxlZCBiZWxvdyBESVNQQVRDSAoodW5kZXJzdGFuZGFibGUgc2luY2UgaXQgbWVzc2VzIHdp
dGggdXNlciBtb2RlKS4gSSB3b25kZXIgdGhvdWdoIGlmIEknbQp3cm9uZyB0aGlua2luZyB0aGF0
IG15IENzcUNvbXBsZXRlQ2FuY2VsZWRJcnAoKSBmdW5jdGlvbiBpcyBub3QKZ3VhcmFudGVlZCB0
byBiZSBiZWxvdyBESVNQQVRDSC4gTVNETiBkb2Vzbid0IGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUK
SVJRTCBidXQgc2F5cyB0aGlzIGFib3V0IGNhbmNlbC1zYWZlIElSUCBxdWV1ZXMgKHdoYXQgSSdt
IHVzaW5nKToKClRoZSBkcml2ZXIgaXMgaW5zdWxhdGVkIGZyb20gYWxsIElSUCBjYW5jZWxsYXRp
b24gaGFuZGxpbmcuIFRoZSBzeXN0ZW0KcHJvdmlkZXMgYSBDYW5jZWwgcm91dGluZSBmb3IgSVJQ
cyBpbiB0aGUgcXVldWUuIFRoaXMgcm91dGluZSBjYWxscwpDc3FSZW1vdmVJcnAgdG8gcmVtb3Zl
IHRoZSBJUlAgZnJvbSB0aGUgcXVldWUsIGFuZApDc3FDb21wbGV0ZUNhbmNlbGVkSXJwIHRvIGNv
bXBsZXRlIHRoZSBJUlAgY2FuY2VsbGF0aW9uLgoKVGhlbiBkZXNjcmlwdGlvbiBmb3IgdGhlIGdl
bmVyaWMgQ2FuY2VsIHJvdXRpbmUgc2F5czoKClRoZSBDYW5jZWwgcm91dGluZSBleGVjdXRlcyBp
biBhbiBhcmJpdHJhcnkgdGhyZWFkIGNvbnRleHQgYXQgSVJRTCA9CkRJU1BBVENIX0xFVkVMIHVu
dGlsIGl0IGNhbGxzIElvUmVsZWFzZUNhbmNlbFNwaW5Mb2NrLCB3aGljaCBjaGFuZ2VzIHRoZQpJ
UlFMIHRvIGEgY2FsbGVyLXN1cHBsaWVkIHZhbHVlLgoKLi4ud2VsbCwgaXQncyBzdGlsbCAiY2Fs
bGVyLXN1cHBsaWVkIiBzbyBJIGRvbid0IHRoaW5rIHdlIGNhbiBzYWZlbHkKYXNzdW1lIG15IENz
cUNvbXBsZXRlQ2FuY2VsZWRJcnAoKSB3aWxsIGFsd2F5cyBiZSBiZWxvdyBESVNQQVRDSF9MRVZF
TC4KCj4gCj4+IC0gSXMgdGhlcmUgYSBwYXJ0aWN1bGFyIHJlYXNvbiBmb3IgaGVhZGVyIGZpbGVz
IG5vdCBiZWluZyBpbmNsdWRlZCBpbiBWUwo+PiBwcm9qZWN0cz8gVGhhdCB3b3VsZCBoZWxwIHdp
dGggbmF2aWdhdGluZyB0aGUgY29kZS4KPj4KPiAKPiBObywgbm9uZSBhdCBhbGwuIEkgZG9uJ3Qg
dXNlIFZpc3VhbCBTdHVkaW8gZm9yIGVkaXRpbmcgc28gaWYgYWRkaW5nIHRoZSBoZWFkZXIgZmls
ZXMgaW50byB0aGUgcHJvamVjdHMgd291bGQgaGVscCBwbGVhc2UgZmVlbCBmcmVlLgo+IAo+PiAt
IEkgb25seSB1cGRhdGVkIHRoZSBWUzIwMTMgcHJvamVjdCwgZG9uJ3QgaGF2ZSBWUzIwMTIgYXQg
aGFuZCBidXQgaXQncwo+PiBwcm9iYWJseSBlYXN5IHRvIGRvIGJ5IGhhbmQuCj4gCj4gWWVzLCB0
aGUgdHJhbnNsYXRpb24gaXMgbm90IGdlbmVyYWxseSBoYXJkIHRvIGRvLCBwbHVzIHRoZSB2Y3hw
cm9qIGZpbGVzIHRoYXQgVlMgd3JpdGVzIGFyZSB1c3VhbGx5IHNvIGJhZCB0aGV5IG5lZWQgdG8g
YmUgaGFuZCBlZGl0ZWQgYWZ0ZXJ3YXJkcyBhbnl3YXkuCj4gCj4gICBQYXVsCj4gCj4+Cj4+IC0g
RmVlbCBmcmVlIHRvIGNoYW5nZSBuYW1lcy9mb3JtYXR0aW5nIGlmL3doZXJlIG5lZWRlZCA6KQo+
PgoKLS0gClJhZmHFgiBXb2pkecWCYQpRdWJlcyBUb29scyBmb3IgV2luZG93cyBkZXZlbG9wZXIK
aHR0cHM6Ly93d3cucXViZXMtb3Mub3JnLwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX18Kd2luLXB2LWRldmVsIG1haWxpbmcgbGlzdAp3aW4tcHYtZGV2ZWxA
bGlzdHMueGVucHJvamVjdC5vcmcKaHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4v
bWFpbG1hbi9saXN0aW5mby93aW4tcHYtZGV2ZWw=

From win-pv-devel-bounces@lists.xenproject.org Thu Oct 08 13:33:37 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 08 Oct 2015 13:33: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 1ZkBKB-0005X7-Uk; Thu, 08 Oct 2015 13:33:35 +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 1ZkBKB-0005X2-0r
	for win-pv-devel@lists.xenproject.org; Thu, 08 Oct 2015 13:33:35 +0000
Received: from [85.158.137.68] by server-1.bemta-3.messagelabs.com id
	59/AD-01421-EA076165; Thu, 08 Oct 2015 13:33:34 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-2.tower-31.messagelabs.com!1444311208!20342958!1
X-Originating-IP: [66.111.4.29]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjkgPT4gNjQ0MA==\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25588 invoked from network); 8 Oct 2015 13:33:29 -0000
Received: from out5-smtp.messagingengine.com (HELO
	out5-smtp.messagingengine.com) (66.111.4.29)
	by server-2.tower-31.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 8 Oct 2015 13:33:29 -0000
Received: from compute6.internal (compute6.nyi.internal [10.202.2.46])
	by mailout.nyi.internal (Postfix) with ESMTP id 215D720351
	for <win-pv-devel@lists.xenproject.org>;
	Thu,  8 Oct 2015 09:33:28 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute6.internal (MEProxy); Thu, 08 Oct 2015 09:33:28 -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=TZhMG2Dil6SMYYsq
	OoEU0lpII+Q=; b=JJ8FKAFFElwCz3OjU/yOIQSdzIeOEPhQ05vEXpNn2dif5x2J
	GFUWW4aealgYfK1T/dyO7cy64ZOZkaTXI9BCilE7Rcfi4i9Wx6EGC33dV2K4UkWD
	IdKXfdadKwvz64iXcubFBD7KyxZS375mI2C/HKGgFHTvtMWcUGUkoTWHHMw=
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=TZhMG2Dil6SMYYs
	qOoEU0lpII+Q=; b=dnhIuK//igTL3DClGOx3nssU+8iWHaIK8mxsucdAVrjnEQz
	yBnh8P4FKmoE+Qlp6bD3igRFPkH7FKyexSBuhaEoHj5DCUkvMXXfTlXAf5KFC+Yd
	U8Tii9HLs3wQ/lnJoxBL6w0k1V/nFPRELM1Pz1hrazaZC/ZccoTyjZ0g4OxU=
X-Sasl-enc: t+NZvRaBKxMmEllG04HtFgfnHVwFkucj65cWwcakPq5q 1444311207
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 64550680194;
	Thu,  8 Oct 2015 09:33:27 -0400 (EDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <5614A3F7.10809@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F606BCA@AMSPEX01CL01.citrite.net>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1110
Message-ID: <561670A6.70807@invisiblethingslab.com>
Date: Thu, 8 Oct 2015 15:33:26 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F606BCA@AMSPEX01CL01.citrite.net>
Content-Length: 4430
Subject: Re: [win-pv-devel] [PATCH 0/5] Add new IOCTLs to XENIFACE
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

T24gMjAxNS0xMC0wOCAxMTowMCwgUGF1bCBEdXJyYW50IHdyb3RlOgo+PiAtLS0tLU9yaWdpbmFs
IE1lc3NhZ2UtLS0tLQo+PiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNlc0BsaXN0cy54ZW5wcm9q
ZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0KPj4gYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0
Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGEKPj4gU2VudDogMDcgT2N0b2JlciAyMDE1
IDA1OjQ4Cj4+IFRvOiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKPj4gU3ViamVj
dDogW3dpbi1wdi1kZXZlbF0gW1BBVENIIDAvNV0gQWRkIG5ldyBJT0NUTHMgdG8gWEVOSUZBQ0UK
Pj4KPj4gVGhpcyBwYXRjaCBzZXJpZXMgaW1wbGVtZW50cyBuZXcgSU9DVExzIG5lZWRlZCBmb3Ig
bGlidmNoYW4uIFVzZXIgbW9kZQo+PiBjb2RlIHdpbGwgY29tZSBuZXh0LiBTb21lIG5vdGVzOgo+
Pgo+IAo+IENvb2wuIFRoYW5rcyBmb3IgcG9zdGluZy4uLiBJJ2xsIHJldmlldyBhcyBzb29uIGFz
IEkgY2FuLgo+ICAKPj4gLSBBbGwgbmV3IElPQ1RMcyBoYXZlIHRoZWlyIGlucHV0IGFuZCBvdXRw
dXQgZGF0YSBmb3JtYXQgZGVmaW5lZCBhcwo+PiBzdHJ1Y3RzLiBJIGtlcHQgdGhlbSBzZXBhcmF0
ZSBmb3IgYWxsIElPQ1RMcyBldmVuIGlmIHRoZSBjb250ZW50cyBpcyB0aGUKPj4gc2FtZS4gTm90
IHN1cmUgaWYgdGhhdCdzIG5lZWRlZCBidXQgSSBmZWVsIGl0J3MgYSBnb29kIGlkZWEgLS0gaWYg
b25lCj4+IElPQ1RMIGNoYW5nZXMgaXRzIGRhdGEgZm9ybWF0LCBvdGhlcnMgd29uJ3QgYmUgYWZm
ZWN0ZWQuCj4+Cj4gCj4gSSB0aGluayB0aGF0J3MgYSBnb29kIGRlY2lzaW9uLiBJdCdzIHRoZSBt
b2RlbCBJIHRlbmQgdG8gcHJlZmVyLgo+IAo+PiAtIEdyYW50L21hcCBJT0NUTHMgYXJlIHBlbmRl
ZCBmb3JldmVyLCBhIHNlcGFyYXRlIElPQ1RMIGlzIHVzZWQgdG8gZ2V0Cj4+IHRoZWlyIGFjdHVh
bCByZXN1bHQuIFVubWFwcGluZyBtZW1vcnkgZnJvbSB1c2VyIG1vZGUgbmVlZHMgdG8gYmUgZG9u
ZQo+PiBiZWxvdyBESVNQQVRDSF9MRVZFTCBhbmQgaW4gY29udGV4dCBvZiB0aGUgc2FtZSBwcm9j
ZXNzLCBidXQgY2FuY2VsCj4+IHJvdXRpbmVzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBlaXRo
ZXIuIFRlc3RzIHNob3dlZCB0aGF0IHRoZXkgd2VyZQo+PiBhbHdheXMgY2FsbGVkIGF0IEFQQ19M
RVZFTCBhbmQgaW4gdGhlIGNvcnJlY3QgY29udGV4dCwgYnV0IHRvIGJlIHNhZmUgSQo+PiBxdWV1
ZSBhIHdvcmsgaXRlbSB0byBleGVjdXRlIGF0IFBBU1NJVkUgYW5kIHVzZSBLZVN0YWNrQXR0YWNo
UHJvY2VzcyB0bwo+PiBjaGFuZ2UgdGhlIGFkZHJlc3Mgc3BhY2UuCj4+Cj4gCj4gQ2FuIHlvdSBu
b3QgZGlyZWN0bHkgS2VTdGFja0F0dGFjaFByb2Nlc3MoKSBpbiB0aGUgY2FuY2VsbGF0aW9uIHJv
dXRpbmU/CgpNU0ROIHNheXMgdGhhdCBLZVN0YWNrQXR0YWNoUHJvY2VzcygpIG5lZWRzIHRvIGJl
IGNhbGxlZCBiZWxvdyBESVNQQVRDSAoodW5kZXJzdGFuZGFibGUgc2luY2UgaXQgbWVzc2VzIHdp
dGggdXNlciBtb2RlKS4gSSB3b25kZXIgdGhvdWdoIGlmIEknbQp3cm9uZyB0aGlua2luZyB0aGF0
IG15IENzcUNvbXBsZXRlQ2FuY2VsZWRJcnAoKSBmdW5jdGlvbiBpcyBub3QKZ3VhcmFudGVlZCB0
byBiZSBiZWxvdyBESVNQQVRDSC4gTVNETiBkb2Vzbid0IGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUK
SVJRTCBidXQgc2F5cyB0aGlzIGFib3V0IGNhbmNlbC1zYWZlIElSUCBxdWV1ZXMgKHdoYXQgSSdt
IHVzaW5nKToKClRoZSBkcml2ZXIgaXMgaW5zdWxhdGVkIGZyb20gYWxsIElSUCBjYW5jZWxsYXRp
b24gaGFuZGxpbmcuIFRoZSBzeXN0ZW0KcHJvdmlkZXMgYSBDYW5jZWwgcm91dGluZSBmb3IgSVJQ
cyBpbiB0aGUgcXVldWUuIFRoaXMgcm91dGluZSBjYWxscwpDc3FSZW1vdmVJcnAgdG8gcmVtb3Zl
IHRoZSBJUlAgZnJvbSB0aGUgcXVldWUsIGFuZApDc3FDb21wbGV0ZUNhbmNlbGVkSXJwIHRvIGNv
bXBsZXRlIHRoZSBJUlAgY2FuY2VsbGF0aW9uLgoKVGhlbiBkZXNjcmlwdGlvbiBmb3IgdGhlIGdl
bmVyaWMgQ2FuY2VsIHJvdXRpbmUgc2F5czoKClRoZSBDYW5jZWwgcm91dGluZSBleGVjdXRlcyBp
biBhbiBhcmJpdHJhcnkgdGhyZWFkIGNvbnRleHQgYXQgSVJRTCA9CkRJU1BBVENIX0xFVkVMIHVu
dGlsIGl0IGNhbGxzIElvUmVsZWFzZUNhbmNlbFNwaW5Mb2NrLCB3aGljaCBjaGFuZ2VzIHRoZQpJ
UlFMIHRvIGEgY2FsbGVyLXN1cHBsaWVkIHZhbHVlLgoKLi4ud2VsbCwgaXQncyBzdGlsbCAiY2Fs
bGVyLXN1cHBsaWVkIiBzbyBJIGRvbid0IHRoaW5rIHdlIGNhbiBzYWZlbHkKYXNzdW1lIG15IENz
cUNvbXBsZXRlQ2FuY2VsZWRJcnAoKSB3aWxsIGFsd2F5cyBiZSBiZWxvdyBESVNQQVRDSF9MRVZF
TC4KCj4gCj4+IC0gSXMgdGhlcmUgYSBwYXJ0aWN1bGFyIHJlYXNvbiBmb3IgaGVhZGVyIGZpbGVz
IG5vdCBiZWluZyBpbmNsdWRlZCBpbiBWUwo+PiBwcm9qZWN0cz8gVGhhdCB3b3VsZCBoZWxwIHdp
dGggbmF2aWdhdGluZyB0aGUgY29kZS4KPj4KPiAKPiBObywgbm9uZSBhdCBhbGwuIEkgZG9uJ3Qg
dXNlIFZpc3VhbCBTdHVkaW8gZm9yIGVkaXRpbmcgc28gaWYgYWRkaW5nIHRoZSBoZWFkZXIgZmls
ZXMgaW50byB0aGUgcHJvamVjdHMgd291bGQgaGVscCBwbGVhc2UgZmVlbCBmcmVlLgo+IAo+PiAt
IEkgb25seSB1cGRhdGVkIHRoZSBWUzIwMTMgcHJvamVjdCwgZG9uJ3QgaGF2ZSBWUzIwMTIgYXQg
aGFuZCBidXQgaXQncwo+PiBwcm9iYWJseSBlYXN5IHRvIGRvIGJ5IGhhbmQuCj4gCj4gWWVzLCB0
aGUgdHJhbnNsYXRpb24gaXMgbm90IGdlbmVyYWxseSBoYXJkIHRvIGRvLCBwbHVzIHRoZSB2Y3hw
cm9qIGZpbGVzIHRoYXQgVlMgd3JpdGVzIGFyZSB1c3VhbGx5IHNvIGJhZCB0aGV5IG5lZWQgdG8g
YmUgaGFuZCBlZGl0ZWQgYWZ0ZXJ3YXJkcyBhbnl3YXkuCj4gCj4gICBQYXVsCj4gCj4+Cj4+IC0g
RmVlbCBmcmVlIHRvIGNoYW5nZSBuYW1lcy9mb3JtYXR0aW5nIGlmL3doZXJlIG5lZWRlZCA6KQo+
PgoKLS0gClJhZmHFgiBXb2pkecWCYQpRdWJlcyBUb29scyBmb3IgV2luZG93cyBkZXZlbG9wZXIK
aHR0cHM6Ly93d3cucXViZXMtb3Mub3JnLwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX18Kd2luLXB2LWRldmVsIG1haWxpbmcgbGlzdAp3aW4tcHYtZGV2ZWxA
bGlzdHMueGVucHJvamVjdC5vcmcKaHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4v
bWFpbG1hbi9saXN0aW5mby93aW4tcHYtZGV2ZWw=

From win-pv-devel-bounces@lists.xenproject.org Thu Oct 08 14:06:32 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 08 Oct 2015 14:06: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 1ZkBq3-0000AC-Lr; Thu, 08 Oct 2015 14:06:31 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7160137aa=Paul.Durrant@citrix.com>)
	id 1ZkBq2-0000A6-PX
	for win-pv-devel@lists.xenproject.org; Thu, 08 Oct 2015 14:06:31 +0000
Received: from [85.158.137.68] by server-11.bemta-3.messagelabs.com id
	A2/1A-32641-56876165; Thu, 08 Oct 2015 14:06:29 +0000
X-Env-Sender: prvs=7160137aa=Paul.Durrant@citrix.com
X-Msg-Ref: server-5.tower-31.messagelabs.com!1444313188!51609512!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 18461 invoked from network); 8 Oct 2015 14:06:29 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-5.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Oct 2015 14:06:29 -0000
X-IronPort-AV: E=Sophos;i="5.17,654,1437436800"; 
   d="scan'208";a="4771901"
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] [PATCH 0/5] Add new IOCTLs to XENIFACE
Thread-Index: AQHRALt5qg48L0qi00aI+wfuhUi8mJ5hTIcggAAsTQCAAClBsA==
Date: Thu, 8 Oct 2015 14:05:59 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F607690@AMSPEX01CL01.citrite.net>
References: <5614A3F7.10809@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F606BCA@AMSPEX01CL01.citrite.net>
	<561670A6.70807@invisiblethingslab.com>
In-Reply-To: <561670A6.70807@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] [PATCH 0/5] Add new IOCTLs to XENIFACE
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+IFNlbnQ6IDA4IE9jdG9iZXIgMjAx
NSAxNDozMw0KPiBUbzogUGF1bCBEdXJyYW50OyB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVj
dC5vcmcNCj4gU3ViamVjdDogUmU6IFt3aW4tcHYtZGV2ZWxdIFtQQVRDSCAwLzVdIEFkZCBuZXcg
SU9DVExzIHRvIFhFTklGQUNFDQo+IA0KPiBPbiAyMDE1LTEwLTA4IDExOjAwLCBQYXVsIER1cnJh
bnQgd3JvdGU6DQo+ID4+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+ID4+IEZyb206IHdp
bi1wdi1kZXZlbC1ib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnIFttYWlsdG86d2luLXB2LWRl
dmVsLQ0KPiA+PiBib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnXSBPbiBCZWhhbGYgT2YgUmFm
YWwgV29qZHlsYQ0KPiA+PiBTZW50OiAwNyBPY3RvYmVyIDIwMTUgMDU6NDgNCj4gPj4gVG86IHdp
bi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZw0KPiA+PiBTdWJqZWN0OiBbd2luLXB2LWRl
dmVsXSBbUEFUQ0ggMC81XSBBZGQgbmV3IElPQ1RMcyB0byBYRU5JRkFDRQ0KPiA+Pg0KPiA+PiBU
aGlzIHBhdGNoIHNlcmllcyBpbXBsZW1lbnRzIG5ldyBJT0NUTHMgbmVlZGVkIGZvciBsaWJ2Y2hh
bi4gVXNlciBtb2RlDQo+ID4+IGNvZGUgd2lsbCBjb21lIG5leHQuIFNvbWUgbm90ZXM6DQo+ID4+
DQo+ID4NCj4gPiBDb29sLiBUaGFua3MgZm9yIHBvc3RpbmcuLi4gSSdsbCByZXZpZXcgYXMgc29v
biBhcyBJIGNhbi4NCj4gPg0KPiA+PiAtIEFsbCBuZXcgSU9DVExzIGhhdmUgdGhlaXIgaW5wdXQg
YW5kIG91dHB1dCBkYXRhIGZvcm1hdCBkZWZpbmVkIGFzDQo+ID4+IHN0cnVjdHMuIEkga2VwdCB0
aGVtIHNlcGFyYXRlIGZvciBhbGwgSU9DVExzIGV2ZW4gaWYgdGhlIGNvbnRlbnRzIGlzIHRoZQ0K
PiA+PiBzYW1lLiBOb3Qgc3VyZSBpZiB0aGF0J3MgbmVlZGVkIGJ1dCBJIGZlZWwgaXQncyBhIGdv
b2QgaWRlYSAtLSBpZiBvbmUNCj4gPj4gSU9DVEwgY2hhbmdlcyBpdHMgZGF0YSBmb3JtYXQsIG90
aGVycyB3b24ndCBiZSBhZmZlY3RlZC4NCj4gPj4NCj4gPg0KPiA+IEkgdGhpbmsgdGhhdCdzIGEg
Z29vZCBkZWNpc2lvbi4gSXQncyB0aGUgbW9kZWwgSSB0ZW5kIHRvIHByZWZlci4NCj4gPg0KPiA+
PiAtIEdyYW50L21hcCBJT0NUTHMgYXJlIHBlbmRlZCBmb3JldmVyLCBhIHNlcGFyYXRlIElPQ1RM
IGlzIHVzZWQgdG8gZ2V0DQo+ID4+IHRoZWlyIGFjdHVhbCByZXN1bHQuIFVubWFwcGluZyBtZW1v
cnkgZnJvbSB1c2VyIG1vZGUgbmVlZHMgdG8gYmUNCj4gZG9uZQ0KPiA+PiBiZWxvdyBESVNQQVRD
SF9MRVZFTCBhbmQgaW4gY29udGV4dCBvZiB0aGUgc2FtZSBwcm9jZXNzLCBidXQgY2FuY2VsDQo+
ID4+IHJvdXRpbmVzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBlaXRoZXIuIFRlc3RzIHNob3dl
ZCB0aGF0IHRoZXkgd2VyZQ0KPiA+PiBhbHdheXMgY2FsbGVkIGF0IEFQQ19MRVZFTCBhbmQgaW4g
dGhlIGNvcnJlY3QgY29udGV4dCwgYnV0IHRvIGJlIHNhZmUgSQ0KPiA+PiBxdWV1ZSBhIHdvcmsg
aXRlbSB0byBleGVjdXRlIGF0IFBBU1NJVkUgYW5kIHVzZSBLZVN0YWNrQXR0YWNoUHJvY2Vzcw0K
PiB0bw0KPiA+PiBjaGFuZ2UgdGhlIGFkZHJlc3Mgc3BhY2UuDQo+ID4+DQo+ID4NCj4gPiBDYW4g
eW91IG5vdCBkaXJlY3RseSBLZVN0YWNrQXR0YWNoUHJvY2VzcygpIGluIHRoZSBjYW5jZWxsYXRp
b24gcm91dGluZT8NCj4gDQo+IE1TRE4gc2F5cyB0aGF0IEtlU3RhY2tBdHRhY2hQcm9jZXNzKCkg
bmVlZHMgdG8gYmUgY2FsbGVkIGJlbG93IERJU1BBVENIDQo+ICh1bmRlcnN0YW5kYWJsZSBzaW5j
ZSBpdCBtZXNzZXMgd2l0aCB1c2VyIG1vZGUpLiBJIHdvbmRlciB0aG91Z2ggaWYgSSdtDQo+IHdy
b25nIHRoaW5raW5nIHRoYXQgbXkgQ3NxQ29tcGxldGVDYW5jZWxlZElycCgpIGZ1bmN0aW9uIGlz
IG5vdA0KPiBndWFyYW50ZWVkIHRvIGJlIGJlbG93IERJU1BBVENILiBNU0ROIGRvZXNuJ3QgZXhw
bGljaXRseSBzcGVjaWZ5IHRoZQ0KPiBJUlFMIGJ1dCBzYXlzIHRoaXMgYWJvdXQgY2FuY2VsLXNh
ZmUgSVJQIHF1ZXVlcyAod2hhdCBJJ20gdXNpbmcpOg0KPiANCj4gVGhlIGRyaXZlciBpcyBpbnN1
bGF0ZWQgZnJvbSBhbGwgSVJQIGNhbmNlbGxhdGlvbiBoYW5kbGluZy4gVGhlIHN5c3RlbQ0KPiBw
cm92aWRlcyBhIENhbmNlbCByb3V0aW5lIGZvciBJUlBzIGluIHRoZSBxdWV1ZS4gVGhpcyByb3V0
aW5lIGNhbGxzDQo+IENzcVJlbW92ZUlycCB0byByZW1vdmUgdGhlIElSUCBmcm9tIHRoZSBxdWV1
ZSwgYW5kDQo+IENzcUNvbXBsZXRlQ2FuY2VsZWRJcnAgdG8gY29tcGxldGUgdGhlIElSUCBjYW5j
ZWxsYXRpb24uDQo+IA0KPiBUaGVuIGRlc2NyaXB0aW9uIGZvciB0aGUgZ2VuZXJpYyBDYW5jZWwg
cm91dGluZSBzYXlzOg0KPiANCj4gVGhlIENhbmNlbCByb3V0aW5lIGV4ZWN1dGVzIGluIGFuIGFy
Yml0cmFyeSB0aHJlYWQgY29udGV4dCBhdCBJUlFMID0NCj4gRElTUEFUQ0hfTEVWRUwgdW50aWwg
aXQgY2FsbHMgSW9SZWxlYXNlQ2FuY2VsU3BpbkxvY2ssIHdoaWNoIGNoYW5nZXMgdGhlDQo+IElS
UUwgdG8gYSBjYWxsZXItc3VwcGxpZWQgdmFsdWUuDQo+IA0KPiAuLi53ZWxsLCBpdCdzIHN0aWxs
ICJjYWxsZXItc3VwcGxpZWQiIHNvIEkgZG9uJ3QgdGhpbmsgd2UgY2FuIHNhZmVseQ0KPiBhc3N1
bWUgbXkgQ3NxQ29tcGxldGVDYW5jZWxlZElycCgpIHdpbGwgYWx3YXlzIGJlIGJlbG93DQo+IERJ
U1BBVENIX0xFVkVMLg0KPiANCg0KRGFtbiwgZm9yIHNvbWUgcmVhc29uIEkgdGhvdWdodCBjYW5j
ZWxhdGlvbnMgY2FtZSBpbiBhdCBBUENfTEVWRUwuIExvb2tzIGxpa2Ugd29yayBpdGVtcyBvciB5
b3VyIG93biBjb21wbGV0aW9uIHRocmVhZCAoYmxvY2tlZCBvbiBpcnAgY2FuY2VsYXRpb24pIGFy
ZSBwcm9iYWJseSB0aGUgb25seSB3YXkgdG8gZ28gdGhlbi4NCg0KICBQYXVsDQoNCj4gPg0KPiA+
PiAtIElzIHRoZXJlIGEgcGFydGljdWxhciByZWFzb24gZm9yIGhlYWRlciBmaWxlcyBub3QgYmVp
bmcgaW5jbHVkZWQgaW4gVlMNCj4gPj4gcHJvamVjdHM/IFRoYXQgd291bGQgaGVscCB3aXRoIG5h
dmlnYXRpbmcgdGhlIGNvZGUuDQo+ID4+DQo+ID4NCj4gPiBObywgbm9uZSBhdCBhbGwuIEkgZG9u
J3QgdXNlIFZpc3VhbCBTdHVkaW8gZm9yIGVkaXRpbmcgc28gaWYgYWRkaW5nIHRoZSBoZWFkZXIN
Cj4gZmlsZXMgaW50byB0aGUgcHJvamVjdHMgd291bGQgaGVscCBwbGVhc2UgZmVlbCBmcmVlLg0K
PiA+DQo+ID4+IC0gSSBvbmx5IHVwZGF0ZWQgdGhlIFZTMjAxMyBwcm9qZWN0LCBkb24ndCBoYXZl
IFZTMjAxMiBhdCBoYW5kIGJ1dCBpdCdzDQo+ID4+IHByb2JhYmx5IGVhc3kgdG8gZG8gYnkgaGFu
ZC4NCj4gPg0KPiA+IFllcywgdGhlIHRyYW5zbGF0aW9uIGlzIG5vdCBnZW5lcmFsbHkgaGFyZCB0
byBkbywgcGx1cyB0aGUgdmN4cHJvaiBmaWxlcyB0aGF0IFZTDQo+IHdyaXRlcyBhcmUgdXN1YWxs
eSBzbyBiYWQgdGhleSBuZWVkIHRvIGJlIGhhbmQgZWRpdGVkIGFmdGVyd2FyZHMgYW55d2F5Lg0K
PiA+DQo+ID4gICBQYXVsDQo+ID4NCj4gPj4NCj4gPj4gLSBGZWVsIGZyZWUgdG8gY2hhbmdlIG5h
bWVzL2Zvcm1hdHRpbmcgaWYvd2hlcmUgbmVlZGVkIDopDQo+ID4+DQo+IA0KPiAtLQ0KPiBSYWZh
xYIgV29qZHnFgmENCj4gUXViZXMgVG9vbHMgZm9yIFdpbmRvd3MgZGV2ZWxvcGVyDQo+IGh0dHBz
Oi8vd3d3LnF1YmVzLW9zLm9yZy8NCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fCndpbi1wdi1kZXZlbCBtYWlsaW5nIGxpc3QKd2luLXB2LWRldmVsQGxpc3Rz
LnhlbnByb2plY3Qub3JnCmh0dHA6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmluL21haWxt
YW4vbGlzdGluZm8vd2luLXB2LWRldmVs

From win-pv-devel-bounces@lists.xenproject.org Thu Oct 08 14:06:32 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 08 Oct 2015 14:06: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 1ZkBq3-0000AC-Lr; Thu, 08 Oct 2015 14:06:31 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7160137aa=Paul.Durrant@citrix.com>)
	id 1ZkBq2-0000A6-PX
	for win-pv-devel@lists.xenproject.org; Thu, 08 Oct 2015 14:06:31 +0000
Received: from [85.158.137.68] by server-11.bemta-3.messagelabs.com id
	A2/1A-32641-56876165; Thu, 08 Oct 2015 14:06:29 +0000
X-Env-Sender: prvs=7160137aa=Paul.Durrant@citrix.com
X-Msg-Ref: server-5.tower-31.messagelabs.com!1444313188!51609512!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 18461 invoked from network); 8 Oct 2015 14:06:29 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-5.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Oct 2015 14:06:29 -0000
X-IronPort-AV: E=Sophos;i="5.17,654,1437436800"; 
   d="scan'208";a="4771901"
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] [PATCH 0/5] Add new IOCTLs to XENIFACE
Thread-Index: AQHRALt5qg48L0qi00aI+wfuhUi8mJ5hTIcggAAsTQCAAClBsA==
Date: Thu, 8 Oct 2015 14:05:59 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F607690@AMSPEX01CL01.citrite.net>
References: <5614A3F7.10809@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F606BCA@AMSPEX01CL01.citrite.net>
	<561670A6.70807@invisiblethingslab.com>
In-Reply-To: <561670A6.70807@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] [PATCH 0/5] Add new IOCTLs to XENIFACE
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+IFNlbnQ6IDA4IE9jdG9iZXIgMjAx
NSAxNDozMw0KPiBUbzogUGF1bCBEdXJyYW50OyB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVj
dC5vcmcNCj4gU3ViamVjdDogUmU6IFt3aW4tcHYtZGV2ZWxdIFtQQVRDSCAwLzVdIEFkZCBuZXcg
SU9DVExzIHRvIFhFTklGQUNFDQo+IA0KPiBPbiAyMDE1LTEwLTA4IDExOjAwLCBQYXVsIER1cnJh
bnQgd3JvdGU6DQo+ID4+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+ID4+IEZyb206IHdp
bi1wdi1kZXZlbC1ib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnIFttYWlsdG86d2luLXB2LWRl
dmVsLQ0KPiA+PiBib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnXSBPbiBCZWhhbGYgT2YgUmFm
YWwgV29qZHlsYQ0KPiA+PiBTZW50OiAwNyBPY3RvYmVyIDIwMTUgMDU6NDgNCj4gPj4gVG86IHdp
bi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZw0KPiA+PiBTdWJqZWN0OiBbd2luLXB2LWRl
dmVsXSBbUEFUQ0ggMC81XSBBZGQgbmV3IElPQ1RMcyB0byBYRU5JRkFDRQ0KPiA+Pg0KPiA+PiBU
aGlzIHBhdGNoIHNlcmllcyBpbXBsZW1lbnRzIG5ldyBJT0NUTHMgbmVlZGVkIGZvciBsaWJ2Y2hh
bi4gVXNlciBtb2RlDQo+ID4+IGNvZGUgd2lsbCBjb21lIG5leHQuIFNvbWUgbm90ZXM6DQo+ID4+
DQo+ID4NCj4gPiBDb29sLiBUaGFua3MgZm9yIHBvc3RpbmcuLi4gSSdsbCByZXZpZXcgYXMgc29v
biBhcyBJIGNhbi4NCj4gPg0KPiA+PiAtIEFsbCBuZXcgSU9DVExzIGhhdmUgdGhlaXIgaW5wdXQg
YW5kIG91dHB1dCBkYXRhIGZvcm1hdCBkZWZpbmVkIGFzDQo+ID4+IHN0cnVjdHMuIEkga2VwdCB0
aGVtIHNlcGFyYXRlIGZvciBhbGwgSU9DVExzIGV2ZW4gaWYgdGhlIGNvbnRlbnRzIGlzIHRoZQ0K
PiA+PiBzYW1lLiBOb3Qgc3VyZSBpZiB0aGF0J3MgbmVlZGVkIGJ1dCBJIGZlZWwgaXQncyBhIGdv
b2QgaWRlYSAtLSBpZiBvbmUNCj4gPj4gSU9DVEwgY2hhbmdlcyBpdHMgZGF0YSBmb3JtYXQsIG90
aGVycyB3b24ndCBiZSBhZmZlY3RlZC4NCj4gPj4NCj4gPg0KPiA+IEkgdGhpbmsgdGhhdCdzIGEg
Z29vZCBkZWNpc2lvbi4gSXQncyB0aGUgbW9kZWwgSSB0ZW5kIHRvIHByZWZlci4NCj4gPg0KPiA+
PiAtIEdyYW50L21hcCBJT0NUTHMgYXJlIHBlbmRlZCBmb3JldmVyLCBhIHNlcGFyYXRlIElPQ1RM
IGlzIHVzZWQgdG8gZ2V0DQo+ID4+IHRoZWlyIGFjdHVhbCByZXN1bHQuIFVubWFwcGluZyBtZW1v
cnkgZnJvbSB1c2VyIG1vZGUgbmVlZHMgdG8gYmUNCj4gZG9uZQ0KPiA+PiBiZWxvdyBESVNQQVRD
SF9MRVZFTCBhbmQgaW4gY29udGV4dCBvZiB0aGUgc2FtZSBwcm9jZXNzLCBidXQgY2FuY2VsDQo+
ID4+IHJvdXRpbmVzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBlaXRoZXIuIFRlc3RzIHNob3dl
ZCB0aGF0IHRoZXkgd2VyZQ0KPiA+PiBhbHdheXMgY2FsbGVkIGF0IEFQQ19MRVZFTCBhbmQgaW4g
dGhlIGNvcnJlY3QgY29udGV4dCwgYnV0IHRvIGJlIHNhZmUgSQ0KPiA+PiBxdWV1ZSBhIHdvcmsg
aXRlbSB0byBleGVjdXRlIGF0IFBBU1NJVkUgYW5kIHVzZSBLZVN0YWNrQXR0YWNoUHJvY2Vzcw0K
PiB0bw0KPiA+PiBjaGFuZ2UgdGhlIGFkZHJlc3Mgc3BhY2UuDQo+ID4+DQo+ID4NCj4gPiBDYW4g
eW91IG5vdCBkaXJlY3RseSBLZVN0YWNrQXR0YWNoUHJvY2VzcygpIGluIHRoZSBjYW5jZWxsYXRp
b24gcm91dGluZT8NCj4gDQo+IE1TRE4gc2F5cyB0aGF0IEtlU3RhY2tBdHRhY2hQcm9jZXNzKCkg
bmVlZHMgdG8gYmUgY2FsbGVkIGJlbG93IERJU1BBVENIDQo+ICh1bmRlcnN0YW5kYWJsZSBzaW5j
ZSBpdCBtZXNzZXMgd2l0aCB1c2VyIG1vZGUpLiBJIHdvbmRlciB0aG91Z2ggaWYgSSdtDQo+IHdy
b25nIHRoaW5raW5nIHRoYXQgbXkgQ3NxQ29tcGxldGVDYW5jZWxlZElycCgpIGZ1bmN0aW9uIGlz
IG5vdA0KPiBndWFyYW50ZWVkIHRvIGJlIGJlbG93IERJU1BBVENILiBNU0ROIGRvZXNuJ3QgZXhw
bGljaXRseSBzcGVjaWZ5IHRoZQ0KPiBJUlFMIGJ1dCBzYXlzIHRoaXMgYWJvdXQgY2FuY2VsLXNh
ZmUgSVJQIHF1ZXVlcyAod2hhdCBJJ20gdXNpbmcpOg0KPiANCj4gVGhlIGRyaXZlciBpcyBpbnN1
bGF0ZWQgZnJvbSBhbGwgSVJQIGNhbmNlbGxhdGlvbiBoYW5kbGluZy4gVGhlIHN5c3RlbQ0KPiBw
cm92aWRlcyBhIENhbmNlbCByb3V0aW5lIGZvciBJUlBzIGluIHRoZSBxdWV1ZS4gVGhpcyByb3V0
aW5lIGNhbGxzDQo+IENzcVJlbW92ZUlycCB0byByZW1vdmUgdGhlIElSUCBmcm9tIHRoZSBxdWV1
ZSwgYW5kDQo+IENzcUNvbXBsZXRlQ2FuY2VsZWRJcnAgdG8gY29tcGxldGUgdGhlIElSUCBjYW5j
ZWxsYXRpb24uDQo+IA0KPiBUaGVuIGRlc2NyaXB0aW9uIGZvciB0aGUgZ2VuZXJpYyBDYW5jZWwg
cm91dGluZSBzYXlzOg0KPiANCj4gVGhlIENhbmNlbCByb3V0aW5lIGV4ZWN1dGVzIGluIGFuIGFy
Yml0cmFyeSB0aHJlYWQgY29udGV4dCBhdCBJUlFMID0NCj4gRElTUEFUQ0hfTEVWRUwgdW50aWwg
aXQgY2FsbHMgSW9SZWxlYXNlQ2FuY2VsU3BpbkxvY2ssIHdoaWNoIGNoYW5nZXMgdGhlDQo+IElS
UUwgdG8gYSBjYWxsZXItc3VwcGxpZWQgdmFsdWUuDQo+IA0KPiAuLi53ZWxsLCBpdCdzIHN0aWxs
ICJjYWxsZXItc3VwcGxpZWQiIHNvIEkgZG9uJ3QgdGhpbmsgd2UgY2FuIHNhZmVseQ0KPiBhc3N1
bWUgbXkgQ3NxQ29tcGxldGVDYW5jZWxlZElycCgpIHdpbGwgYWx3YXlzIGJlIGJlbG93DQo+IERJ
U1BBVENIX0xFVkVMLg0KPiANCg0KRGFtbiwgZm9yIHNvbWUgcmVhc29uIEkgdGhvdWdodCBjYW5j
ZWxhdGlvbnMgY2FtZSBpbiBhdCBBUENfTEVWRUwuIExvb2tzIGxpa2Ugd29yayBpdGVtcyBvciB5
b3VyIG93biBjb21wbGV0aW9uIHRocmVhZCAoYmxvY2tlZCBvbiBpcnAgY2FuY2VsYXRpb24pIGFy
ZSBwcm9iYWJseSB0aGUgb25seSB3YXkgdG8gZ28gdGhlbi4NCg0KICBQYXVsDQoNCj4gPg0KPiA+
PiAtIElzIHRoZXJlIGEgcGFydGljdWxhciByZWFzb24gZm9yIGhlYWRlciBmaWxlcyBub3QgYmVp
bmcgaW5jbHVkZWQgaW4gVlMNCj4gPj4gcHJvamVjdHM/IFRoYXQgd291bGQgaGVscCB3aXRoIG5h
dmlnYXRpbmcgdGhlIGNvZGUuDQo+ID4+DQo+ID4NCj4gPiBObywgbm9uZSBhdCBhbGwuIEkgZG9u
J3QgdXNlIFZpc3VhbCBTdHVkaW8gZm9yIGVkaXRpbmcgc28gaWYgYWRkaW5nIHRoZSBoZWFkZXIN
Cj4gZmlsZXMgaW50byB0aGUgcHJvamVjdHMgd291bGQgaGVscCBwbGVhc2UgZmVlbCBmcmVlLg0K
PiA+DQo+ID4+IC0gSSBvbmx5IHVwZGF0ZWQgdGhlIFZTMjAxMyBwcm9qZWN0LCBkb24ndCBoYXZl
IFZTMjAxMiBhdCBoYW5kIGJ1dCBpdCdzDQo+ID4+IHByb2JhYmx5IGVhc3kgdG8gZG8gYnkgaGFu
ZC4NCj4gPg0KPiA+IFllcywgdGhlIHRyYW5zbGF0aW9uIGlzIG5vdCBnZW5lcmFsbHkgaGFyZCB0
byBkbywgcGx1cyB0aGUgdmN4cHJvaiBmaWxlcyB0aGF0IFZTDQo+IHdyaXRlcyBhcmUgdXN1YWxs
eSBzbyBiYWQgdGhleSBuZWVkIHRvIGJlIGhhbmQgZWRpdGVkIGFmdGVyd2FyZHMgYW55d2F5Lg0K
PiA+DQo+ID4gICBQYXVsDQo+ID4NCj4gPj4NCj4gPj4gLSBGZWVsIGZyZWUgdG8gY2hhbmdlIG5h
bWVzL2Zvcm1hdHRpbmcgaWYvd2hlcmUgbmVlZGVkIDopDQo+ID4+DQo+IA0KPiAtLQ0KPiBSYWZh
xYIgV29qZHnFgmENCj4gUXViZXMgVG9vbHMgZm9yIFdpbmRvd3MgZGV2ZWxvcGVyDQo+IGh0dHBz
Oi8vd3d3LnF1YmVzLW9zLm9yZy8NCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fCndpbi1wdi1kZXZlbCBtYWlsaW5nIGxpc3QKd2luLXB2LWRldmVsQGxpc3Rz
LnhlbnByb2plY3Qub3JnCmh0dHA6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmluL21haWxt
YW4vbGlzdGluZm8vd2luLXB2LWRldmVs

From win-pv-devel-bounces@lists.xenproject.org Mon Oct 12 08:05:25 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 12 Oct 2015 08:05:25 +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 1ZlY6m-0002l4-RK; Mon, 12 Oct 2015 08:05:24 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabio.fantoni@m2r.biz>) id 1ZlY6l-0002ki-52
	for win-pv-devel@lists.xenproject.org; Mon, 12 Oct 2015 08:05:23 +0000
Received: from [85.158.137.68] by server-13.bemta-3.messagelabs.com id
	E5/1D-00536-2C96B165; Mon, 12 Oct 2015 08:05:22 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-12.tower-31.messagelabs.com!1444637119!15451340!1
X-Originating-IP: [209.85.212.182]
X-SpamReason: No, hits=0.6 required=7.0 tests=BODY_RANDOM_LONG,
	HTML_50_60,HTML_MESSAGE
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23470 invoked from network); 12 Oct 2015 08:05:19 -0000
Received: from mail-wi0-f182.google.com (HELO mail-wi0-f182.google.com)
	(209.85.212.182)
	by server-12.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Oct 2015 08:05:19 -0000
Received: by wicge5 with SMTP id ge5so7074928wic.0
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 12 Oct 2015 01:05:18 -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:cc:from:message-id:date
	:user-agent:mime-version:in-reply-to:content-type;
	bh=ML7Uf9qGx0rh3sAFs3WDS2dQDtFvuHPTwI+NfTmWC4E=;
	b=YspFHjzLx5X5vHy8UtYQGwkAduw3kOQxbJQC6IcycApyQYio3JVv3QxKU6BPHl/hE3
	8aHij/1+dPrL7g4KPIARIraaD3RphED5+CsDHdWn+JD7xWnaXoR3aBkNlqQK4PPgnaUI
	gTG7dphZNHM1Vv5F3u9+QgsikuFsH8rXRBiabnTZiAkHQ9Xd+1RmdYZxKpYc9EUUo8Rq
	X3Ef/Lt+NNEmp7AgnKCn/I0CI1+y0COoXSvibAywJ06Acfpl1R378t8gw0GmAuHpBZic
	HztUh1WvYw0H5lWgtGpFQsYKuAf1SXrPwiEMQy2SonVu6xAMaHZNfg+wH0zbfJ5rgRXM
	YyEw==
X-Gm-Message-State: ALoCoQmRy1P1HUm98GLTjx9cX7Rs41UG/kZbRt1VCEvmqXVpowf6QQqU7M0RLrdDMtQi6+rZw5ZZ
X-Received: by 10.194.238.228 with SMTP id vn4mr28560870wjc.13.1444637118613; 
	Mon, 12 Oct 2015 01:05:18 -0700 (PDT)
Received: from [192.168.178.23] ([95.233.12.243])
	by smtp.googlemail.com with ESMTPSA id
	o3sm9794651wif.22.2015.10.12.01.05.17
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 12 Oct 2015 01:05:17 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>
References: <55D5D908.1040506@m2r.biz>
	<sleacjrdcrrvsxgctwyek24q.1440085065667@email.android.com>
	<55D6DB89.9020307@m2r.biz>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <561B69BC.2090008@m2r.biz>
Date: Mon, 12 Oct 2015 10:05:16 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <55D6DB89.9020307@m2r.biz>
Cc: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] Signing new winpv 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>
Content-Type: multipart/mixed; boundary="===============6279021758353756801=="
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.
--===============6279021758353756801==
Content-Type: multipart/alternative;
 boundary="------------060902030700060203020902"

This is a multi-part message in MIME format.
--------------060902030700060203020902
Content-Type: text/plain; charset=windows-1252; format=flowed
Content-Transfer-Encoding: 7bit

Il 21/08/2015 10:04, Fabio Fantoni ha scritto:
> Il 20/08/2015 17:37, Paul Durrant ha scritto:
>> You need to run
>>
>> bcdedit /set testsigning on
>>
>> before installing test signed drivers on even 32 bit win 10. I have 
>> done it and been testing on win 10 for a while.
>>
>>   Paul
>
> Thanks for your reply.
> Sorry if I don't explain good for my bad english, I obviously I 
> already activated testsigning before installed the pv drivers, and 
> they was working before windows upgrade, but not after.
> The old cases was on updating windows 10 preview builds and I do not 
> give importance but latest was updating windows 10 stable builds, 
> before windows with pv drivers full working, after installing windows 
> update and rebooting not (seems that disabled testsigning mode).
> Same updates on windows 10 domUs with signed gplpv instead still 
> booted correctly.
> All domUs are windows 10 pro 64 bit.
> This happen 7 times with preview build (if I remember good) and 2 
> times with stable builds for now.

Any news on signed drivers?
Actually the automatic build only with new commit in master branch and 
keep only the latest build, is possible to improve it please?
For example I think is good build also latest commit of staging-8.1 
branch and all tags (keeeping all rc and stable build in this case).
This will be easier and faster test also rc builds and any commit for 
next stable versions.

Thanks for any reply and sorry for my bad english.

>
>>
>> -------- Original message --------
>> From: Fabio Fantoni
>> Date:20/08/2015 14:43 (GMT+00:00)
>> To: win-pv-devel@lists.xenproject.org
>> Subject: [win-pv-devel] Signing new winpv drivers
>>
>> I found a important problem on windows 10 domUs:
>> on "major updates", some preview builds and in latest days also in
>> "stable" versions, windows was unable to boot because can't load
>> unsigned winpv drivers (more exacly give blue screen on xenbus).
>> F8 is not working, boot fix from W10 iso doesn't solve the problem and
>> trying to disable xen_platform_pci in domUs configuration also fails.
>> Seems that W10 on some updates disables the testsigning and make domUs
>> unable to boot again.
>> The only good solution I suppose is to use signed winpv drivers.
>> Anyone has found a workaround for this?
>>
>> Based on this Paul Durrant reply seems that there will be no signed
>> build of xen project drivers:
>> http://lists.xen.org/archives/html/xen-devel/2015-08/msg00133.html
>> xenserver drivers installer is signed but don't support other versions
>> apart xenserver itself, so I suppose there will be no chance of "advance
>> install selection" but only base components and xenlite agent instead of
>> full xenserver things, is it right?
>>
>> Is there anyone with ev microsoft certificate (including addition thing
>> required for windows 10) that planning to do a public release of signed
>> build for stable versions of new winpv drivers?
>>
>> Is there a possibility to sign rc and stable of xen project builds
>> taking a certificate for xen project for example with a crowdfunding?
>>
>> 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
>


--------------060902030700060203020902
Content-Type: text/html; charset=windows-1252
Content-Length: 7051
Content-Transfer-Encoding: quoted-printable

<html>
  <head>
    <meta content=3D"text/html; charset=3Dwindows-1252"
      http-equiv=3D"Content-Type">
  </head>
  <body text=3D"#000000" bgcolor=3D"#FFFFFF">
    <div class=3D"moz-cite-prefix">Il 21/08/2015 10:04, Fabio Fantoni ha
      scritto:<br>
    </div>
    <blockquote cite=3D"mid:55D6DB89.9020307@m2r.biz" type=3D"cite">
      <meta content=3D"text/html; charset=3Dwindows-1252"
        http-equiv=3D"Content-Type">
      <div class=3D"moz-cite-prefix">Il 20/08/2015 17:37, Paul Durrant ha
        scritto:<br>
      </div>
      <blockquote
        cite=3D"mid:sleacjrdcrrvsxgctwyek24q.1440085065667@email.android.com"
        type=3D"cite">
        <meta http-equiv=3D"Content-Type" content=3D"text/html;
          charset=3Dwindows-1252">
        <meta name=3D"Generator" content=3D"Microsoft Exchange Server">
        <!-- converted from text -->
        <style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style>
        <div>
          <div>You need to run</div>
          <div><br>
          </div>
          <div>bcdedit /set testsigning on</div>
          <div><br>
          </div>
          <div>before installing test signed drivers on even 32 bit win
            10. I have done it and been testing on win 10 for a while.=A0</div>
          <div><br>
          </div>
          <div>=A0 Paul</div>
        </div>
      </blockquote>
      <br>
      Thanks for your reply.<br>
      Sorry if I don't explain good for my bad english, I <span
        id=3D"result_box" class=3D"short_text" lang=3D"en"><span class=3D"hps">obviously</span>
        <span class=3D"hps">I already activated testsigning before
          installed the pv drivers, and they was working before windows
          upgrade, but not after.<br>
          The old cases was on updating windows 10 preview builds </span></span><span
        id=3D"result_box" class=3D"short_text" lang=3D"en"><span class=3D"hps">and</span>
        <span class=3D"hps">I do not give</span> <span class=3D"hps">importance

          but latest was updating windows 10 stable builds, before
          windows with pv drivers full working, after installing windows
          update and rebooting not (seems that disabled testsigning
          mode).<br>
          Same updates on windows 10 domUs with signed gplpv instead
          still booted correctly.<br>
          All domUs are windows 10 pro 64 bit.<br>
          This happen 7 times with preview build (if I remember good)
          and 2 times with stable builds for now.<br>
        </span></span></blockquote>
    <br>
    Any news on signed drivers=3F<br>
    Actually the automatic build only with new commit in master branch
    and keep only the latest build, is possible to improve it please=3F<br>
    For example I think is good build also latest commit of staging-8.1
    branch and all tags (keeeping all rc and stable build in this case).<br>
    This will be easier and faster test also rc builds and any commit
    for next stable versions.<br>
    <br>
    Thanks for any reply and sorry for my bad english.<br>
    <br>
    <blockquote cite=3D"mid:55D6DB89.9020307@m2r.biz" type=3D"cite"><span
        id=3D"result_box" class=3D"short_text" lang=3D"en"><span class=3D"hps">
          <br>
        </span></span>
      <blockquote
        cite=3D"mid:sleacjrdcrrvsxgctwyek24q.1440085065667@email.android.com"
        type=3D"cite">
        <div> <br>
          <div>-------- Original message --------</div>
          <div>From: Fabio Fantoni </div>
          <div>Date:20/08/2015 14:43 (GMT+00:00) </div>
          <div>To: <a moz-do-not-send=3D"true"
              class=3D"moz-txt-link-abbreviated"
              href=3D"mailto:win-pv-devel@lists.xenproject.org">win-pv-devel@lists.xenproject.org</a>
          </div>
          <div>Subject: [win-pv-devel] Signing new winpv drivers </div>
          <div><br>
          </div>
        </div>
        <font size=3D"2"><span style=3D"font-size:10pt;">
            <div class=3D"PlainText">I found a important problem on
              windows 10 domUs:<br>
              on "major updates", some preview builds and in latest days
              also in <br>
              "stable" versions, windows was unable to boot because
              can't load <br>
              unsigned winpv drivers (more exacly give blue screen on
              xenbus).<br>
              F8 is not working, boot fix from W10 iso doesn't solve the
              problem and <br>
              trying to disable xen_platform_pci in domUs configuration
              also fails.<br>
              Seems that W10 on some updates disables the testsigning
              and make domUs <br>
              unable to boot again.<br>
              The only good solution I suppose is to use signed winpv
              drivers.<br>
              Anyone has found a workaround for this=3F<br>
              <br>
              Based on this Paul Durrant reply seems that there will be
              no signed <br>
              build of xen project drivers:<br>
              <a moz-do-not-send=3D"true"
href=3D"http://lists.xen.org/archives/html/xen-devel/2015-08/msg00133.html">http://lists.xen.org/archives/html/xen-devel/2015-08/msg00133.html</a><br>
              xenserver drivers installer is signed but don't support
              other versions <br>
              apart xenserver itself, so I suppose there will be no
              chance of "advance <br>
              install selection" but only base components and xenlite
              agent instead of <br>
              full xenserver things, is it right=3F<br>
              <br>
              Is there anyone with ev microsoft certificate (including
              addition thing <br>
              required for windows 10) that planning to do a public
              release of signed <br>
              build for stable versions of new winpv drivers=3F<br>
              <br>
              Is there a possibility to sign rc and stable of xen
              project builds <br>
              taking a certificate for xen project for example with a
              crowdfunding=3F<br>
              <br>
              Thanks for any reply and sorry for my bad english.<br>
              <br>
              <br>
              _______________________________________________<br>
              win-pv-devel mailing list<br>
              <a moz-do-not-send=3D"true" class=3D"moz-txt-link-abbreviated"
                href=3D"mailto:win-pv-devel@lists.xenproject.org">win-pv-devel@lists.xenproject.org</a><br>
              <a moz-do-not-send=3D"true"
                href=3D"http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel">http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel</a><br>
            </div>
          </span></font> </blockquote>
      <br>
    </blockquote>
    <br>
  </body>
</html>

--------------060902030700060203020902--


--===============6279021758353756801==
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
--===============6279021758353756801==--


From win-pv-devel-bounces@lists.xenproject.org Mon Oct 12 08:05:25 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 12 Oct 2015 08:05:25 +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 1ZlY6m-0002l4-RK; Mon, 12 Oct 2015 08:05:24 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabio.fantoni@m2r.biz>) id 1ZlY6l-0002ki-52
	for win-pv-devel@lists.xenproject.org; Mon, 12 Oct 2015 08:05:23 +0000
Received: from [85.158.137.68] by server-13.bemta-3.messagelabs.com id
	E5/1D-00536-2C96B165; Mon, 12 Oct 2015 08:05:22 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-12.tower-31.messagelabs.com!1444637119!15451340!1
X-Originating-IP: [209.85.212.182]
X-SpamReason: No, hits=0.6 required=7.0 tests=BODY_RANDOM_LONG,
	HTML_50_60,HTML_MESSAGE
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23470 invoked from network); 12 Oct 2015 08:05:19 -0000
Received: from mail-wi0-f182.google.com (HELO mail-wi0-f182.google.com)
	(209.85.212.182)
	by server-12.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Oct 2015 08:05:19 -0000
Received: by wicge5 with SMTP id ge5so7074928wic.0
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 12 Oct 2015 01:05:18 -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:cc:from:message-id:date
	:user-agent:mime-version:in-reply-to:content-type;
	bh=ML7Uf9qGx0rh3sAFs3WDS2dQDtFvuHPTwI+NfTmWC4E=;
	b=YspFHjzLx5X5vHy8UtYQGwkAduw3kOQxbJQC6IcycApyQYio3JVv3QxKU6BPHl/hE3
	8aHij/1+dPrL7g4KPIARIraaD3RphED5+CsDHdWn+JD7xWnaXoR3aBkNlqQK4PPgnaUI
	gTG7dphZNHM1Vv5F3u9+QgsikuFsH8rXRBiabnTZiAkHQ9Xd+1RmdYZxKpYc9EUUo8Rq
	X3Ef/Lt+NNEmp7AgnKCn/I0CI1+y0COoXSvibAywJ06Acfpl1R378t8gw0GmAuHpBZic
	HztUh1WvYw0H5lWgtGpFQsYKuAf1SXrPwiEMQy2SonVu6xAMaHZNfg+wH0zbfJ5rgRXM
	YyEw==
X-Gm-Message-State: ALoCoQmRy1P1HUm98GLTjx9cX7Rs41UG/kZbRt1VCEvmqXVpowf6QQqU7M0RLrdDMtQi6+rZw5ZZ
X-Received: by 10.194.238.228 with SMTP id vn4mr28560870wjc.13.1444637118613; 
	Mon, 12 Oct 2015 01:05:18 -0700 (PDT)
Received: from [192.168.178.23] ([95.233.12.243])
	by smtp.googlemail.com with ESMTPSA id
	o3sm9794651wif.22.2015.10.12.01.05.17
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 12 Oct 2015 01:05:17 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>
References: <55D5D908.1040506@m2r.biz>
	<sleacjrdcrrvsxgctwyek24q.1440085065667@email.android.com>
	<55D6DB89.9020307@m2r.biz>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <561B69BC.2090008@m2r.biz>
Date: Mon, 12 Oct 2015 10:05:16 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <55D6DB89.9020307@m2r.biz>
Cc: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] Signing new winpv 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>
Content-Type: multipart/mixed; boundary="===============6279021758353756801=="
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.
--===============6279021758353756801==
Content-Type: multipart/alternative;
 boundary="------------060902030700060203020902"

This is a multi-part message in MIME format.
--------------060902030700060203020902
Content-Type: text/plain; charset=windows-1252; format=flowed
Content-Transfer-Encoding: 7bit

Il 21/08/2015 10:04, Fabio Fantoni ha scritto:
> Il 20/08/2015 17:37, Paul Durrant ha scritto:
>> You need to run
>>
>> bcdedit /set testsigning on
>>
>> before installing test signed drivers on even 32 bit win 10. I have 
>> done it and been testing on win 10 for a while.
>>
>>   Paul
>
> Thanks for your reply.
> Sorry if I don't explain good for my bad english, I obviously I 
> already activated testsigning before installed the pv drivers, and 
> they was working before windows upgrade, but not after.
> The old cases was on updating windows 10 preview builds and I do not 
> give importance but latest was updating windows 10 stable builds, 
> before windows with pv drivers full working, after installing windows 
> update and rebooting not (seems that disabled testsigning mode).
> Same updates on windows 10 domUs with signed gplpv instead still 
> booted correctly.
> All domUs are windows 10 pro 64 bit.
> This happen 7 times with preview build (if I remember good) and 2 
> times with stable builds for now.

Any news on signed drivers?
Actually the automatic build only with new commit in master branch and 
keep only the latest build, is possible to improve it please?
For example I think is good build also latest commit of staging-8.1 
branch and all tags (keeeping all rc and stable build in this case).
This will be easier and faster test also rc builds and any commit for 
next stable versions.

Thanks for any reply and sorry for my bad english.

>
>>
>> -------- Original message --------
>> From: Fabio Fantoni
>> Date:20/08/2015 14:43 (GMT+00:00)
>> To: win-pv-devel@lists.xenproject.org
>> Subject: [win-pv-devel] Signing new winpv drivers
>>
>> I found a important problem on windows 10 domUs:
>> on "major updates", some preview builds and in latest days also in
>> "stable" versions, windows was unable to boot because can't load
>> unsigned winpv drivers (more exacly give blue screen on xenbus).
>> F8 is not working, boot fix from W10 iso doesn't solve the problem and
>> trying to disable xen_platform_pci in domUs configuration also fails.
>> Seems that W10 on some updates disables the testsigning and make domUs
>> unable to boot again.
>> The only good solution I suppose is to use signed winpv drivers.
>> Anyone has found a workaround for this?
>>
>> Based on this Paul Durrant reply seems that there will be no signed
>> build of xen project drivers:
>> http://lists.xen.org/archives/html/xen-devel/2015-08/msg00133.html
>> xenserver drivers installer is signed but don't support other versions
>> apart xenserver itself, so I suppose there will be no chance of "advance
>> install selection" but only base components and xenlite agent instead of
>> full xenserver things, is it right?
>>
>> Is there anyone with ev microsoft certificate (including addition thing
>> required for windows 10) that planning to do a public release of signed
>> build for stable versions of new winpv drivers?
>>
>> Is there a possibility to sign rc and stable of xen project builds
>> taking a certificate for xen project for example with a crowdfunding?
>>
>> 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
>


--------------060902030700060203020902
Content-Type: text/html; charset=windows-1252
Content-Length: 7051
Content-Transfer-Encoding: quoted-printable

<html>
  <head>
    <meta content=3D"text/html; charset=3Dwindows-1252"
      http-equiv=3D"Content-Type">
  </head>
  <body text=3D"#000000" bgcolor=3D"#FFFFFF">
    <div class=3D"moz-cite-prefix">Il 21/08/2015 10:04, Fabio Fantoni ha
      scritto:<br>
    </div>
    <blockquote cite=3D"mid:55D6DB89.9020307@m2r.biz" type=3D"cite">
      <meta content=3D"text/html; charset=3Dwindows-1252"
        http-equiv=3D"Content-Type">
      <div class=3D"moz-cite-prefix">Il 20/08/2015 17:37, Paul Durrant ha
        scritto:<br>
      </div>
      <blockquote
        cite=3D"mid:sleacjrdcrrvsxgctwyek24q.1440085065667@email.android.com"
        type=3D"cite">
        <meta http-equiv=3D"Content-Type" content=3D"text/html;
          charset=3Dwindows-1252">
        <meta name=3D"Generator" content=3D"Microsoft Exchange Server">
        <!-- converted from text -->
        <style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style>
        <div>
          <div>You need to run</div>
          <div><br>
          </div>
          <div>bcdedit /set testsigning on</div>
          <div><br>
          </div>
          <div>before installing test signed drivers on even 32 bit win
            10. I have done it and been testing on win 10 for a while.=A0</div>
          <div><br>
          </div>
          <div>=A0 Paul</div>
        </div>
      </blockquote>
      <br>
      Thanks for your reply.<br>
      Sorry if I don't explain good for my bad english, I <span
        id=3D"result_box" class=3D"short_text" lang=3D"en"><span class=3D"hps">obviously</span>
        <span class=3D"hps">I already activated testsigning before
          installed the pv drivers, and they was working before windows
          upgrade, but not after.<br>
          The old cases was on updating windows 10 preview builds </span></span><span
        id=3D"result_box" class=3D"short_text" lang=3D"en"><span class=3D"hps">and</span>
        <span class=3D"hps">I do not give</span> <span class=3D"hps">importance

          but latest was updating windows 10 stable builds, before
          windows with pv drivers full working, after installing windows
          update and rebooting not (seems that disabled testsigning
          mode).<br>
          Same updates on windows 10 domUs with signed gplpv instead
          still booted correctly.<br>
          All domUs are windows 10 pro 64 bit.<br>
          This happen 7 times with preview build (if I remember good)
          and 2 times with stable builds for now.<br>
        </span></span></blockquote>
    <br>
    Any news on signed drivers=3F<br>
    Actually the automatic build only with new commit in master branch
    and keep only the latest build, is possible to improve it please=3F<br>
    For example I think is good build also latest commit of staging-8.1
    branch and all tags (keeeping all rc and stable build in this case).<br>
    This will be easier and faster test also rc builds and any commit
    for next stable versions.<br>
    <br>
    Thanks for any reply and sorry for my bad english.<br>
    <br>
    <blockquote cite=3D"mid:55D6DB89.9020307@m2r.biz" type=3D"cite"><span
        id=3D"result_box" class=3D"short_text" lang=3D"en"><span class=3D"hps">
          <br>
        </span></span>
      <blockquote
        cite=3D"mid:sleacjrdcrrvsxgctwyek24q.1440085065667@email.android.com"
        type=3D"cite">
        <div> <br>
          <div>-------- Original message --------</div>
          <div>From: Fabio Fantoni </div>
          <div>Date:20/08/2015 14:43 (GMT+00:00) </div>
          <div>To: <a moz-do-not-send=3D"true"
              class=3D"moz-txt-link-abbreviated"
              href=3D"mailto:win-pv-devel@lists.xenproject.org">win-pv-devel@lists.xenproject.org</a>
          </div>
          <div>Subject: [win-pv-devel] Signing new winpv drivers </div>
          <div><br>
          </div>
        </div>
        <font size=3D"2"><span style=3D"font-size:10pt;">
            <div class=3D"PlainText">I found a important problem on
              windows 10 domUs:<br>
              on "major updates", some preview builds and in latest days
              also in <br>
              "stable" versions, windows was unable to boot because
              can't load <br>
              unsigned winpv drivers (more exacly give blue screen on
              xenbus).<br>
              F8 is not working, boot fix from W10 iso doesn't solve the
              problem and <br>
              trying to disable xen_platform_pci in domUs configuration
              also fails.<br>
              Seems that W10 on some updates disables the testsigning
              and make domUs <br>
              unable to boot again.<br>
              The only good solution I suppose is to use signed winpv
              drivers.<br>
              Anyone has found a workaround for this=3F<br>
              <br>
              Based on this Paul Durrant reply seems that there will be
              no signed <br>
              build of xen project drivers:<br>
              <a moz-do-not-send=3D"true"
href=3D"http://lists.xen.org/archives/html/xen-devel/2015-08/msg00133.html">http://lists.xen.org/archives/html/xen-devel/2015-08/msg00133.html</a><br>
              xenserver drivers installer is signed but don't support
              other versions <br>
              apart xenserver itself, so I suppose there will be no
              chance of "advance <br>
              install selection" but only base components and xenlite
              agent instead of <br>
              full xenserver things, is it right=3F<br>
              <br>
              Is there anyone with ev microsoft certificate (including
              addition thing <br>
              required for windows 10) that planning to do a public
              release of signed <br>
              build for stable versions of new winpv drivers=3F<br>
              <br>
              Is there a possibility to sign rc and stable of xen
              project builds <br>
              taking a certificate for xen project for example with a
              crowdfunding=3F<br>
              <br>
              Thanks for any reply and sorry for my bad english.<br>
              <br>
              <br>
              _______________________________________________<br>
              win-pv-devel mailing list<br>
              <a moz-do-not-send=3D"true" class=3D"moz-txt-link-abbreviated"
                href=3D"mailto:win-pv-devel@lists.xenproject.org">win-pv-devel@lists.xenproject.org</a><br>
              <a moz-do-not-send=3D"true"
                href=3D"http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel">http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel</a><br>
            </div>
          </span></font> </blockquote>
      <br>
    </blockquote>
    <br>
  </body>
</html>

--------------060902030700060203020902--


--===============6279021758353756801==
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
--===============6279021758353756801==--


From win-pv-devel-bounces@lists.xenproject.org Mon Oct 12 08:19:21 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 12 Oct 2015 08:19:21 +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 1ZlYKG-00048a-U1; Mon, 12 Oct 2015 08:19:20 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7203db9da=Paul.Durrant@citrix.com>)
	id 1ZlYKF-00048U-S7
	for win-pv-devel@lists.xenproject.org; Mon, 12 Oct 2015 08:19:19 +0000
Received: from [193.109.254.147] by server-1.bemta-14.messagelabs.com id
	5B/B1-28791-60D6B165; Mon, 12 Oct 2015 08:19:18 +0000
X-Env-Sender: prvs=7203db9da=Paul.Durrant@citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1444637956!54988249!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 6466 invoked from network); 12 Oct 2015 08:19:16 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Oct 2015 08:19:16 -0000
X-IronPort-AV: E=Sophos;i="5.17,671,1437436800"; 
   d="scan'208";a="4984464"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Fabio Fantoni <fabio.fantoni@m2r.biz>
Thread-Topic: [win-pv-devel] Signing new winpv drivers
Thread-Index: AQHQ204xV7V7/m4HJ0ijzg2wZdxHsp4VBb23gADyHICAUbl4AIAAJC2g
Date: Mon, 12 Oct 2015 08:19:14 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F60B2DF@AMSPEX01CL01.citrite.net>
References: <55D5D908.1040506@m2r.biz>
	<sleacjrdcrrvsxgctwyek24q.1440085065667@email.android.com>
	<55D6DB89.9020307@m2r.biz> <561B69BC.2090008@m2r.biz>
In-Reply-To: <561B69BC.2090008@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
Cc: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] Signing new winpv 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>
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

De-htmling...

-----
[snip]

Any news on signed drivers?
Actually the automatic build only with new commit in master branch and keep only the latest build, is possible to improve it please?
For example I think is good build also latest commit of staging-8.1 branch and all tags (keeeping all rc and stable build in this case).
This will be easier and faster test also rc builds and any commit for next stable versions.
-----

No news on XenProject driver signing. There should be some signed Citrix branded drivers soon though and these should work on any Xen platform, not just XenServer.

  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 Oct 12 08:19:21 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 12 Oct 2015 08:19:21 +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 1ZlYKG-00048a-U1; Mon, 12 Oct 2015 08:19:20 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7203db9da=Paul.Durrant@citrix.com>)
	id 1ZlYKF-00048U-S7
	for win-pv-devel@lists.xenproject.org; Mon, 12 Oct 2015 08:19:19 +0000
Received: from [193.109.254.147] by server-1.bemta-14.messagelabs.com id
	5B/B1-28791-60D6B165; Mon, 12 Oct 2015 08:19:18 +0000
X-Env-Sender: prvs=7203db9da=Paul.Durrant@citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1444637956!54988249!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 6466 invoked from network); 12 Oct 2015 08:19:16 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Oct 2015 08:19:16 -0000
X-IronPort-AV: E=Sophos;i="5.17,671,1437436800"; 
   d="scan'208";a="4984464"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Fabio Fantoni <fabio.fantoni@m2r.biz>
Thread-Topic: [win-pv-devel] Signing new winpv drivers
Thread-Index: AQHQ204xV7V7/m4HJ0ijzg2wZdxHsp4VBb23gADyHICAUbl4AIAAJC2g
Date: Mon, 12 Oct 2015 08:19:14 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F60B2DF@AMSPEX01CL01.citrite.net>
References: <55D5D908.1040506@m2r.biz>
	<sleacjrdcrrvsxgctwyek24q.1440085065667@email.android.com>
	<55D6DB89.9020307@m2r.biz> <561B69BC.2090008@m2r.biz>
In-Reply-To: <561B69BC.2090008@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
Cc: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] Signing new winpv 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>
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

De-htmling...

-----
[snip]

Any news on signed drivers?
Actually the automatic build only with new commit in master branch and keep only the latest build, is possible to improve it please?
For example I think is good build also latest commit of staging-8.1 branch and all tags (keeeping all rc and stable build in this case).
This will be easier and faster test also rc builds and any commit for next stable versions.
-----

No news on XenProject driver signing. There should be some signed Citrix branded drivers soon though and these should work on any Xen platform, not just XenServer.

  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 Oct 12 10:26:24 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 12 Oct 2015 10:26: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 1ZlaJD-0000Tr-EQ; Mon, 12 Oct 2015 10:26:23 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabio.fantoni@m2r.biz>) id 1ZlaJA-0000Te-On
	for win-pv-devel@lists.xenproject.org; Mon, 12 Oct 2015 10:26:21 +0000
Received: from [85.158.137.68] by server-4.bemta-3.messagelabs.com id
	2F/78-09570-BCA8B165; Mon, 12 Oct 2015 10:26:19 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-2.tower-31.messagelabs.com!1444645576!21218183!1
X-Originating-IP: [209.85.212.181]
X-SpamReason: No, hits=2.5 required=7.0 tests=BODY_RANDOM_LONG,LONGWORDS,
	UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13124 invoked from network); 12 Oct 2015 10:26:17 -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;
	12 Oct 2015 10:26:17 -0000
Received: by wicgb1 with SMTP id gb1so44571867wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 12 Oct 2015 03:26:16 -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:from:subject:cc:message-id:date:user-agent
	:mime-version:content-type;
	bh=tzIPvREL67N1nMEtt12ZJmt9gkjhPD87Qvo89V8Bvpw=;
	b=U7PXccmFgTp3QuYz6NaO3RqvpD0p3IhP8H9ATCAWpse+hZw8mf7Ih6wzSIKP3ev/rq
	ikxNT8z1UCEKMeeBumJKXkIlWbdXAqTRv9TBBtZ8ga2KHrfYndGYaVudY6iAgtzcVeBC
	QG26mXYdTzjE20jj7El3fqExn9SMJbgNb+Nef7TDXFIwlF29MeBRxxp3+t9+aQZr8oRU
	amBSaNiazQDSs6GAWrPvq7rJy7zYMBvx9+GhpexOr51QKOXR4Q91lawTm/618/bvARoP
	da2opikS2sgOVgUsOyMuXe4f5UrYKZiJ69oN0RRvTaroKk1MV2nTpLMx5nBZA+qKfMhY
	mAaw==
X-Gm-Message-State: ALoCoQlf3chx5IPs4RnzyRZ0p7uBKa4OdWpRvQlNZExpYXy27Jbkyfd3atuUZj0fruFqWpF9GENC
X-Received: by 10.194.9.97 with SMTP id y1mr34517640wja.84.1444645576612;
	Mon, 12 Oct 2015 03:26:16 -0700 (PDT)
Received: from [192.168.178.23] ([95.233.12.243])
	by smtp.googlemail.com with ESMTPSA id
	iw8sm18971466wjb.5.2015.10.12.03.26.10
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 12 Oct 2015 03:26:15 -0700 (PDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <561B8AC1.9010900@m2r.biz>
Date: Mon, 12 Oct 2015 12:26:09 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------020500030504080903090602"
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] Network and disk pv not working on windows 10 pro 64
 bit with latest winpv build and xen 4.6.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>
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.
--------------020500030504080903090602
Content-Type: text/plain; charset=iso-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

Dom0: Jessie (debian 8) 64 bit, kernel 3.16 from official repository, 
xen 4.6.0, other installation details here:
./configure --prefix=/usr --disable-blktap1 --disable-qemu-traditional 
--disable-rombios --with-system-seabios=/usr/share/seabios/bios-256k.bin 
--with-extra-qemuu-configure-args="--enable-spice --enable-usb-redir" 
--disable-blktap2 --enable-systemd
xen services enabled with:
systemctl enable xenstored.service
systemctl enable xenconsoled.service
systemctl enable xen-init-dom0.service
systemctl enable xen-qemu-dom0-disk-backend.service
systemctl enable xendomains.service

domU xl cfg:
http://lists.xen.org/archives/html/xen-devel/2015-10/txtsAaP2yM2Vx.txt

Still use emualted disk and network and xen pv network is unable to 
start for code 10 error (from windows devices manager). (see also 
screenshot in attachment)

In attachment full qemu log with xen_platform trace.

If you need more information and/or test tell me and I'l post them.

Thanks for any reply and sorry for my bad english.

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

main_channel_link: add main channel client
main_channel_handle_parsed: net test: latency 7.238000 ms, bitrate 879725085 bps (838.971219 Mbps)
inputs_connect: inputs channel client create
red_dispatcher_set_cursor_peer: 
xen_platform_log xen platform: XEN|DllInitialize: 8.2.0 (80) (17.09.2015)
xen_platform_log xen platform: XEN|AcpiFindRsdp: 0x00000000000F65D0
xen_platform_log xen platform: XEN|SystemGetStartOptions:  TESTSIGNING  NOEXECUTE=OPTIN
xen_platform_log xen platform: XEN|SystemGetVersionInformation: KERNEL: 10.0 (BUILD 10240) PLATFORM WIN32_NT (x64)
xen_platform_log xen platform: XEN|SystemGetVersionInformation: SUITES:
xen_platform_log xen platform: XEN|SystemGetVersionInformation: - TERMINAL
xen_platform_log xen platform: XEN|SystemGetVersionInformation: - SINGLEUSERTS
xen_platform_log xen platform: XEN|SystemGetVersionInformation: TYPE: WORKSTATION
xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[0] 00000000.00001000 - 00000000.0009efff
xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[1] 00000000.00100000 - 00000000.00101fff
xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[2] 00000000.00103000 - 00000000.efffefff
xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[3] 00000001.00000000 - 00000001.07ffffff
xen_platform_log xen platform: XEN|AcpiGetXsdt: 0x00000000FC00A010
xen_platform_log xen platform: XEN|SystemProcessorInformation: ====> (0:0)
xen_platform_log xen platform: XEN|SystemProcessorInformation: Manufacturer: GenuineIntel
xen_platform_log xen platform: XEN|SystemProcessorInformation: APIC ID: 00
xen_platform_log xen platform: XEN|SystemProcessorInformation: PROCESSOR ID: 00
xen_platform_log xen platform: XEN|SystemProcessorInformation: <==== (0:0)
xen_platform_log xen platform: XEN|SystemProcessorInformation: ====> (0:1)
xen_platform_log xen platform: XEN|SystemProcessorInformation: Manufacturer: GenuineIntel
xen_platform_log xen platform: XEN|SystemProcessorInformation: APIC ID: 02
xen_platform_log xen platform: XEN|SystemProcessorInformation: PROCESSOR ID: 01
xen_platform_log xen platform: XEN|SystemProcessorInformation: <==== (0:1)
xen_platform_log xen platform: XEN: HYPERCALL PAGE 0 @ 00000001.04934000
xen_platform_log xen platform: XENFILT|DriverEntry: 8.2.0 (80) (17.09.2015)
xen_platform_log xen platform: XEN: 4.6.0 (__XEN_INTERFACE_VERSION__ = 00040600)
xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE000F75E8C60 (ACPI\PNP0A03\0)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75CB860 (PCI\VEN_8086&DEV_1237&SUBSYS_11001AF4&REV_02\00)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75FFB20 (PCI\VEN_8086&DEV_7000&SUBSYS_11001AF4&REV_00\08)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75D4C60 (PCI\VEN_8086&DEV_7010&SUBSYS_11001AF4&REV_00\09)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75D3C60 (PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75D2C60 (PCI\VEN_8086&DEV_2668&SUBSYS_11001AF4&REV_01\18)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75D2880 (PCI\VEN_1AF4&DEV_1003&SUBSYS_00031AF4&REV_00\20)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75D19F0 (PCI\VEN_1B36&DEV_0100&SUBSYS_11001AF4&REV_04\28)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75D0B30 (PCI\VEN_10EC&DEV_8139&SUBSYS_11001AF4&REV_20\30)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75CFC60 (PCI\VEN_8086&DEV_2934&SUBSYS_11001AF4&REV_03\E8)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75CEC60 (PCI\VEN_8086&DEV_2935&SUBSYS_11001AF4&REV_03\E9)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75CCC60 (PCI\VEN_8086&DEV_2936&SUBSYS_11001AF4&REV_03\EA)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75CC880 (PCI\VEN_8086&DEV_293A&SUBSYS_11001AF4&REV_03\EF)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75CA9F0 (ACPI\PNP0103\0)
xen_platform_log xen platform: XENFILT|DriverSetFilterState: PENDING
xen_platform_log xen platform: XENFILT|DriverSetFilterState: DISABLED
xen_platform_log xen platform: XENBUS|DriverEntry: 8.2.0 (80) (17.09.2015)
xen_platform_log xen platform: XENFILT|PdoQueryInterface: PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10: PVDEVICE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENFILT|PvdeviceSetActive: PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10
xen_platform_log xen platform: XENBUS|FdoSetFriendlyName: Xen PV Bus (0001)
xen_platform_log xen platform: XENBUS|FdoCreate: FFFFE000F75F4480 (XP0001 XENBUS) [ACTIVE]
xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFE000F75F2C78: Shared LevelSensitive CPU 0:0 VECTOR b1
xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFE000F7587E98: DeviceExclusive Latched CPU 0:0 VECTOR 50
xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFE000F7587A68: DeviceExclusive Latched CPU 0:1 VECTOR 50
xen_platform_log xen platform: XENBUS|FdoScan: ====>
xen_platform_log xen platform: XENBUS|FdoCreateIoSpace: 00000000.f8000000 - 00000000.f8ffffff
xen_platform_log xen platform: XENBUS|FdoSuspend: ====>
xen_platform_log xen platform: XEN|HvmSetParam: fail1 (c0000022)
xen_platform_log xen platform: XENBUS|FdoBalloon: ====>
xen_platform_log xen platform: SHARED_INFO: MAP XENMAPSPACE_shared_info @ 00000000.f8000000
xen_platform_log xen platform: EVTCHN_FIFO: CONTROLBLOCK[0] @ 00000000.00eb3000
xen_platform_log xen platform: EVTCHN_FIFO: CONTROLBLOCK[1] @ 00000000.010b4000
xen_platform_log xen platform: XENBUS|EvtchnAbiAcquire: FIFO
xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CPU 0:0 (Vector = 80)
xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CPU 0:1 (Vector = 80)
xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CALLBACK VIA (Vector = 24)
xen_platform_log xen platform: STORE: PAGE @ 00000000.feffc000
xen_platform_log xen platform: STORE: EVTCHN 1
xen_platform_log xen platform: EVTCHN_FIFO: EVENTARRAY[0] @ 00000000.010b5000
xen_platform_log xen platform: XENBUS|EvtchnFifoExpand: added ports [00000000 - 000003ff]
xen_platform_log xen platform: XENBUS|PdoCreate: FFFFE000F75F0BB0 (VBD)
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 08000009 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000A -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000B -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v2 RANGE_SET v1 CACHE v1 GNTTAB v2 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoCreate: FFFFE000F75F0890 (VIF)
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 08000009 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000A -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000B -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v2 RANGE_SET v1 CACHE v1 GNTTAB v2 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoCreate: FFFFE000F75EFD40 (IFACE)
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 08000009 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000A -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000B -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v2 RANGE_SET v1 CACHE v1 GNTTAB v2 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE000F75DEC60 (PCIIDE\IDEChannel\0)
xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE000F75DDC60 (PCIIDE\IDEChannel\1)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75DD880 (IDE\DiskQEMU_HARDDISK___________________________2.2.1___\0.0.0)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75D8C60 (IDE\CdRomQEMU_QEMU_DVD-ROM_______________________2.2.____\0.1.0)
main_channel_handle_parsed: agent start
xen_platform_log xen platform: XENVBD|DriverEntry:8.2.0.35 (9/9/2015)
xen_platform_log xen platform: XENVBD|__DriverParseParameterKey:DriverParameters: 
xen_platform_log xen platform: XENDISK|DriverEntry:XENDISK 8.2.0 (35) (09.09.2015)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: BUS_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENDISK|FdoCreate:FFFFE000F9083DF0
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000F9063050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000F9063050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000F9063050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000F9063050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000F9063050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: BUS_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000F9063050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000F9063050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: BUS_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Version = 0
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Master = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: ScatterGather = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DemandMode = FALSE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: AutoInitialize = FALSE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Dma32BitAddresses = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: IgnoreCount = FALSE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Dma64BitAddresses = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: BusNumber = 00000000
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaChannel = ffffffff
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: InterfaceType = Internal
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaWidth = 8Bits
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaSpeed = Compatible
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: MaximumLength = 000b0000
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaPort = ffffffff
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000F9063050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENBUS|DmaGetAdapter: no interception
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: STORE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: EVTCHN_INTERFACE (VERSION 4)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: GNTTAB_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: SUSPEND_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: DEBUG_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: UNPLUG_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: EMULATED_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENFILT|PdoQueryInterface: PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10: EMULATED_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|UnplugRequest: DISKS (MAKE)
xen_platform_log xen platform: XEN|UnplugIncrementValue: DISKS 1
xen_platform_log xen platform: XENVBD|__FdoSetDevicePowerState:POWER D3 to D0
xen_platform_log xen platform: XENVBD|__FdoD3ToD0:D3->D0
xen_platform_log xen platform: XENVBD|FdoDispatchPnp:14:QUERY_PNP_DEVICE_STATE -> c00000bb
xen_platform_log xen platform: XENVBD|__FdoIsPdoUnplugged:Target[0] : (vbd/768) Emulated PRESENT
xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] : Creating (Emulated)
xen_platform_log xen platform: XENVBD|PdoSetDevicePowerState:Target[0] : POWER D3 to D0
xen_platform_log xen platform: XENVBD|PdoD3ToD0:Target[0] : D3->D0 (Emulated)
xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] : Created (Emulated)
xen_platform_log xen platform: XENVBD|FdoLogTargets:QUERY_RELATIONS ===>
xen_platform_log xen platform: XENVBD|FdoLogTargets:QUERY_RELATIONS : Target[0] = 0xFFFFE000F83F5020 (present)
xen_platform_log xen platform: XENVBD|FdoLogTargets:QUERY_RELATIONS <===
xen_platform_log xen platform: XENVBD|__ValidateSrbForPdo:Target[0] : Disk is Emulated (a0:SCSIOP_REPORT_LUNS)
xen_platform_log xen platform: XENVBD|__ValidateSrbForPdo:Target[0] : Disk is Emulated (12:SCSIOP_INQUIRY)
xen_platform_log xen platform: XENIFACE|DriverEntry: 8.2.0.21 (9/9/2015)
xen_platform_log xen platform: XENIFACE|ThreadCreate: Create thread FFFFF80113847E8C FFFFE000F8833090
xen_platform_log xen platform: XENIFACE|ThreadCreate: Create thread FFFFF80113846DD4 FFFFE000F88330A0
xen_platform_log xen platform: XENBUS|PdoQueryInterface: IFACE: SUSPEND_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: IFACE: SHARED_INFO_INTERFACE (VERSION 2)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: IFACE: STORE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENIFACE|FdoInitialiseXSRegistryEntries: no such xenstore key
xen_platform_log xen platform: XENIFACE|FdoInitialiseXSRegistryEntries: Failed to initialise registry (c0000022)
xen_platform_log xen platform: XENIFACE|ThreadCreate: Create thread FFFFF80113847968 FFFFE000F88332B8
xen_platform_log xen platform: XENIFACE|FdoCreate: FFFFE000F9045040 (IFACE)
xen_platform_log xen platform: XENIFACE|WmiInit: DRV: XenIface WMI Initialisation
xen_platform_log xen platform: XENVIF|DriverEntry: XENVIF 8.2.0 (49) (24.09.2015)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: BUS_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: DEBUG_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: SUSPEND_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: EVTCHN_INTERFACE (VERSION 4)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: STORE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: RANGE_SET_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: CACHE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: GNTTAB_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: UNPLUG_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENVIF|FdoCreate: FFFFE000F6A6B4C0 (XP0001 XENVIF)
xen_platform_log xen platform: XENVIF|__PdoSetPermanentAddress: 0: 00:16:3e:fe:7a:b9
xen_platform_log xen platform: XENVIF|__PdoSetContainerID: 0 {ca136717-12c6-5b65-881e-334b6ab03532}
xen_platform_log xen platform: XENVIF|FrontendSetMaxQueues: device/vif/0: 2
xen_platform_log xen platform: XENVIF|PdoCreate: FFFFE000F9095510 (0)
xen_platform_log xen platform: XENVIF|PdoDumpRevisions: 08000002 -> CACHE v1 VIF v2
xen_platform_log xen platform: XENVIF|PdoDumpRevisions: 08000003 -> CACHE v1 VIF v3
xen_platform_log xen platform: XENNET|DriverEntry: XENNET 8.2.0 (31) (17.09.2015)
xen_platform_log xen platform: XENBUS|UnplugRequest: NICS (MAKE)
xen_platform_log xen platform: XEN|UnplugIncrementValue: NICS 1
xen_platform_log xen platform: XENVIF|PdoSetFriendlyName: Xen PV Network Device #0
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail8
xen_platform_log xen platform: XENVIF|SettingsSave: FROM Ethernet (Realtek RTL8139C+ Fast Ethernet NIC)
xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses: Version4: ADDRESSES NOT FOUND
xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses: Version6: ADDRESSES NOT FOUND
xen_platform_log xen platform: XENVIF|DriverRequestReboot: <===>
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail7
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail6
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail5
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail4
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail3
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail2
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1 (c0000001)
xen_platform_log xen platform: XENNET|DriverUnload: XENNET 8.2.0 (31) (17.09.2015)
xen_platform_log xen platform: XENNET|DriverEntry: XENNET 8.2.0 (31) (17.09.2015)
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1 (c0000001)
xen_platform_log xen platform: XENNET|DriverUnload: XENNET 8.2.0 (31) (17.09.2015)
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Guest agent lite main loop starting
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Set time to XenTime
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: hosttimeIsUTC: Open Registry Key
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Time is now  2015.10.12 11:49:21.200
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Set time to 2015.10.12 11:49:30.541
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: About to add feature shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Establish watch control/shutdown
xen_platform_log xen platform: XENIFACE|StartWatch: Start Watch FFFFE000F8B9B9A0
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: About to advertise features
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: WmiSessionSetEntry:MethodExec Failed
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: WmiSessionSetEntry:SessionStart Failed
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: WmiSessionSetEntry:SetVValue Failed
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: WmiSessionSetEntry:SetVPath Failed 
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Failed to advertise shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: About to kick xapi 
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: win agent going to sleep
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: win agent woke up for 3
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Fire 000000F2356E4FA0
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: fire feature shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Check if we need to shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: No need to shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: fired feature shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: win agent going to sleep

--------------020500030504080903090602
Content-Type: image/jpeg;
 name="devices_screen.JPG"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="devices_screen.JPG"

/9j/4AAQSkZJRgABAQEAYABgAAD/4RB6RXhpZgAATU0AKgAAAAgABAE7AAIAAAAETTJSAIdp
AAQAAAABAAAISpydAAEAAAAIAAAQauocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6hwABwAA
CAwAAAhcAAAAABzqAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAABNADIAUgAAAP/hClxodHRwOi8vbnMuYWRvYmUuY29tL3hh
cC8xLjAvADw/eHBhY2tldCBiZWdpbj0n77u/JyBpZD0nVzVNME1wQ2VoaUh6cmVTek5UY3pr
YzlkJz8+DQo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIj48cmRmOlJERiB4
bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMi
PjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1h
ZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50
cy8xLjEvIi8+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEz
ZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2Rj
L2VsZW1lbnRzLzEuMS8iPjxkYzpjcmVhdG9yPjxyZGY6U2VxIHhtbG5zOnJkZj0iaHR0cDov
L3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpsaT5NMlI8L3Jk
ZjpsaT48L3JkZjpTZXE+DQoJCQk8L2RjOmNyZWF0b3I+PC9yZGY6RGVzY3JpcHRpb24+PC9y
ZGY6UkRGPjwveDp4bXBtZXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSd3Jz8+/9sAQwAHBQUGBQQHBgUGCAcH
CAoRCwoJCQoVDxAMERgVGhkYFRgXGx4nIRsdJR0XGCIuIiUoKSssKxogLzMvKjInKisq/9sA
QwEHCAgKCQoUCwsUKhwYHCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioq/8AAEQgDAAQAAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAAB
AgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGh
CCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVm
Z2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfI
ycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAAB
AgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRC
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
FFIAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigArOrRrOoAK+Ufj7/yVm4/687f/wBFivq6vlH4
+/8AJWLj/rzt/wD0WK68LvL0/VHLiNo+v6M82WngU0U6u5HKxMUYp1JjiiwhMUYpcUGiwAKO
1ApSOKYhtFHNLSGJiiiigA7UlO7e2aTFACUUuKSkAlHailxQUFGKM0ZoFqFBXiiigNRu2jFO
xzQRSsO43FFGaXdxQMY1HpTsZo20gGkVveAx/wAV3pf/AF1P/oJrDxW94F/5HvS/+up/9BNC
+JCl8LPtbwr/AMido3/XhB/6LWtWsrwr/wAido3/AF4Qf+i1rVryT0wooooAKKKKAKOm6Lpu
j+f/AGXZxWv2iQyy+WuN7Hv/APWq9RWF4z/tz/hFbv8A4RfZ/aG35d33tvfb/telABqfiyx0
q8SKc5iDbZZt3CH2HfHf09zxW3HIk0SyROro4DKynIYHuDXl2gXGhXPwu1BkltpbtQq6l/bT
N8r5GQ23kDGdoXvj3rpvAg1BdNjVV0pdH8s/Z/sTTlt2R/z1H3evTvQB0Oqaxpmh2f2vWtRt
NOttwTzrudYk3HoNzEDPHSrEFxDdW8dxaypNDKoeOSNgyupGQQRwQR3rkNU1PTdA+Ix1HxRc
wWVpLpyQ6fe3jhIYpN7mZN7YVHYeUcE5YJx901keKPFb22pSLp/iJNFtBpi3ekrFBEy6tOzv
mMB1JkHyx/LEVY+bnPK0r6f15/5f1uO2tv66f5npVFeaX2u+JI9R1W/OrSW8Om6rp9qNNW3i
MbpOtuJVZypfgysVIYYPXcMAZmhXGoWUK6Tp/iq6F1c+K7q2vAY7V5beM/aZAdvlYUvsV8sC
PQbeKpK/9en+Yvs839bN/oevVVtdTsL5lFje21yWiWdRDKr5jYkK4wfukqcHocH0rgdN8Tal
c+K0tn17zb5tTuLa58PGGL/RrVN4SfhRKuQsbb2Yo3mYA5XHK6Vq2o6J4VW/0fatzH4W0lTK
/wB2BGuJleUna2AqlmyVYDGSpAIKWqv6fimyuXddv87HuVFeaeHdb1zVdW0CybxTZ3kEovJp
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
0aJpWgKhUtT5YU7HOFHXJPUZuSaNq765Lp/9nt9gl1mPVf7R85NiooRvL253+Z5iY+7t2nO7
PFdk91bpdR2zzxrcSqzxxFwHdVxuIHUgblye2R60jXdst6lm1xELqSNpEgLjeyKQCwXqQCyg
ntketF9U+3+d/wA0Q17rT/q91+pNRRRSGFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR
RRQAUUUUAFcNXc1w1AEtr/x+Q/8AXRf514H8b1z8ULk/9O1v/wCixXvlr/x+Q/8AXRf514Z8
Zo9/xMuj/wBO9v8A+ilr0sujzVJLy/VHnZhLlpxfn+jPNNlJtq80GKhaKvXdNo8pVEyqVpMV
Myc03FRY0uR4oNPxzQVpWHcZRTsUBaLBcQU6gLzS4oENIppT0p+KO1A7kJBFJipTRgGosVci
20hFSFaTbk0co+YiNIRU5Tj3ppSlysfMiHvSEVPsFNKcVPKVzIpCgdaBR3rA6BaKKBQLUcKc
OlMpRVaiFNKBSGloEIRW74HH/FcaX/11P/oJrBrf8D/8jvpf/XU/+gmn1E/hZ9o+Ff8AkTtG
/wCvCD/0WtatZXhX/kTtG/68IP8A0WtateIeuFFFFABRRRQAVheK9Tm0yzsjFKIVuLtYJJOB
tUqxGCeh3BR+NbtRXNpb3sBhvIIriI9Y5UDKfwNAHIXGo6baxLLc30mGkWMNmORmY5wOIycn
FJ4L8Ryaxqk0C3AaFIPMEZfzDjcArBtq4GRIuMfw9sVoa74E0jWNL+yW0EOmMJUl860towSV
PQgrgjk8Gqfgr4c2Xgq+uru0vp7qS6jCSeaiKODuBAUDnJbOc5yPTmW3zbaGfv8ANfoZfjp7
vXPED6Vp2i3+qf2bZNMJLR7dRb3cnELHzZU5UKx4z98VPBr0Wq+JfCetzj7Mkmi38s6Mf9Sw
a38xSf8AZIYH6V31FUrrb+t/8/wNetzyvw1ql9beJNM1u98PajYRa/LLHc3ly9v5b+ad9rwk
rPkKojG5R9/seK6HVNT03QPiMdR8UXMFlaS6ckOn3t44SGKTe5mTe2FR2HlHBOWCcfdNdnRR
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
/wD0CKqNXpv+RetP+vqf/wBAipAf/9k=
--------------020500030504080903090602
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
--------------020500030504080903090602--


From win-pv-devel-bounces@lists.xenproject.org Mon Oct 12 10:26:24 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 12 Oct 2015 10:26: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 1ZlaJD-0000Tr-EQ; Mon, 12 Oct 2015 10:26:23 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabio.fantoni@m2r.biz>) id 1ZlaJA-0000Te-On
	for win-pv-devel@lists.xenproject.org; Mon, 12 Oct 2015 10:26:21 +0000
Received: from [85.158.137.68] by server-4.bemta-3.messagelabs.com id
	2F/78-09570-BCA8B165; Mon, 12 Oct 2015 10:26:19 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-2.tower-31.messagelabs.com!1444645576!21218183!1
X-Originating-IP: [209.85.212.181]
X-SpamReason: No, hits=2.5 required=7.0 tests=BODY_RANDOM_LONG,LONGWORDS,
	UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13124 invoked from network); 12 Oct 2015 10:26:17 -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;
	12 Oct 2015 10:26:17 -0000
Received: by wicgb1 with SMTP id gb1so44571867wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 12 Oct 2015 03:26:16 -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:from:subject:cc:message-id:date:user-agent
	:mime-version:content-type;
	bh=tzIPvREL67N1nMEtt12ZJmt9gkjhPD87Qvo89V8Bvpw=;
	b=U7PXccmFgTp3QuYz6NaO3RqvpD0p3IhP8H9ATCAWpse+hZw8mf7Ih6wzSIKP3ev/rq
	ikxNT8z1UCEKMeeBumJKXkIlWbdXAqTRv9TBBtZ8ga2KHrfYndGYaVudY6iAgtzcVeBC
	QG26mXYdTzjE20jj7El3fqExn9SMJbgNb+Nef7TDXFIwlF29MeBRxxp3+t9+aQZr8oRU
	amBSaNiazQDSs6GAWrPvq7rJy7zYMBvx9+GhpexOr51QKOXR4Q91lawTm/618/bvARoP
	da2opikS2sgOVgUsOyMuXe4f5UrYKZiJ69oN0RRvTaroKk1MV2nTpLMx5nBZA+qKfMhY
	mAaw==
X-Gm-Message-State: ALoCoQlf3chx5IPs4RnzyRZ0p7uBKa4OdWpRvQlNZExpYXy27Jbkyfd3atuUZj0fruFqWpF9GENC
X-Received: by 10.194.9.97 with SMTP id y1mr34517640wja.84.1444645576612;
	Mon, 12 Oct 2015 03:26:16 -0700 (PDT)
Received: from [192.168.178.23] ([95.233.12.243])
	by smtp.googlemail.com with ESMTPSA id
	iw8sm18971466wjb.5.2015.10.12.03.26.10
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 12 Oct 2015 03:26:15 -0700 (PDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <561B8AC1.9010900@m2r.biz>
Date: Mon, 12 Oct 2015 12:26:09 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------020500030504080903090602"
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] Network and disk pv not working on windows 10 pro 64
 bit with latest winpv build and xen 4.6.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>
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.
--------------020500030504080903090602
Content-Type: text/plain; charset=iso-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

Dom0: Jessie (debian 8) 64 bit, kernel 3.16 from official repository, 
xen 4.6.0, other installation details here:
./configure --prefix=/usr --disable-blktap1 --disable-qemu-traditional 
--disable-rombios --with-system-seabios=/usr/share/seabios/bios-256k.bin 
--with-extra-qemuu-configure-args="--enable-spice --enable-usb-redir" 
--disable-blktap2 --enable-systemd
xen services enabled with:
systemctl enable xenstored.service
systemctl enable xenconsoled.service
systemctl enable xen-init-dom0.service
systemctl enable xen-qemu-dom0-disk-backend.service
systemctl enable xendomains.service

domU xl cfg:
http://lists.xen.org/archives/html/xen-devel/2015-10/txtsAaP2yM2Vx.txt

Still use emualted disk and network and xen pv network is unable to 
start for code 10 error (from windows devices manager). (see also 
screenshot in attachment)

In attachment full qemu log with xen_platform trace.

If you need more information and/or test tell me and I'l post them.

Thanks for any reply and sorry for my bad english.

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

main_channel_link: add main channel client
main_channel_handle_parsed: net test: latency 7.238000 ms, bitrate 879725085 bps (838.971219 Mbps)
inputs_connect: inputs channel client create
red_dispatcher_set_cursor_peer: 
xen_platform_log xen platform: XEN|DllInitialize: 8.2.0 (80) (17.09.2015)
xen_platform_log xen platform: XEN|AcpiFindRsdp: 0x00000000000F65D0
xen_platform_log xen platform: XEN|SystemGetStartOptions:  TESTSIGNING  NOEXECUTE=OPTIN
xen_platform_log xen platform: XEN|SystemGetVersionInformation: KERNEL: 10.0 (BUILD 10240) PLATFORM WIN32_NT (x64)
xen_platform_log xen platform: XEN|SystemGetVersionInformation: SUITES:
xen_platform_log xen platform: XEN|SystemGetVersionInformation: - TERMINAL
xen_platform_log xen platform: XEN|SystemGetVersionInformation: - SINGLEUSERTS
xen_platform_log xen platform: XEN|SystemGetVersionInformation: TYPE: WORKSTATION
xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[0] 00000000.00001000 - 00000000.0009efff
xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[1] 00000000.00100000 - 00000000.00101fff
xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[2] 00000000.00103000 - 00000000.efffefff
xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[3] 00000001.00000000 - 00000001.07ffffff
xen_platform_log xen platform: XEN|AcpiGetXsdt: 0x00000000FC00A010
xen_platform_log xen platform: XEN|SystemProcessorInformation: ====> (0:0)
xen_platform_log xen platform: XEN|SystemProcessorInformation: Manufacturer: GenuineIntel
xen_platform_log xen platform: XEN|SystemProcessorInformation: APIC ID: 00
xen_platform_log xen platform: XEN|SystemProcessorInformation: PROCESSOR ID: 00
xen_platform_log xen platform: XEN|SystemProcessorInformation: <==== (0:0)
xen_platform_log xen platform: XEN|SystemProcessorInformation: ====> (0:1)
xen_platform_log xen platform: XEN|SystemProcessorInformation: Manufacturer: GenuineIntel
xen_platform_log xen platform: XEN|SystemProcessorInformation: APIC ID: 02
xen_platform_log xen platform: XEN|SystemProcessorInformation: PROCESSOR ID: 01
xen_platform_log xen platform: XEN|SystemProcessorInformation: <==== (0:1)
xen_platform_log xen platform: XEN: HYPERCALL PAGE 0 @ 00000001.04934000
xen_platform_log xen platform: XENFILT|DriverEntry: 8.2.0 (80) (17.09.2015)
xen_platform_log xen platform: XEN: 4.6.0 (__XEN_INTERFACE_VERSION__ = 00040600)
xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE000F75E8C60 (ACPI\PNP0A03\0)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75CB860 (PCI\VEN_8086&DEV_1237&SUBSYS_11001AF4&REV_02\00)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75FFB20 (PCI\VEN_8086&DEV_7000&SUBSYS_11001AF4&REV_00\08)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75D4C60 (PCI\VEN_8086&DEV_7010&SUBSYS_11001AF4&REV_00\09)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75D3C60 (PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75D2C60 (PCI\VEN_8086&DEV_2668&SUBSYS_11001AF4&REV_01\18)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75D2880 (PCI\VEN_1AF4&DEV_1003&SUBSYS_00031AF4&REV_00\20)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75D19F0 (PCI\VEN_1B36&DEV_0100&SUBSYS_11001AF4&REV_04\28)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75D0B30 (PCI\VEN_10EC&DEV_8139&SUBSYS_11001AF4&REV_20\30)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75CFC60 (PCI\VEN_8086&DEV_2934&SUBSYS_11001AF4&REV_03\E8)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75CEC60 (PCI\VEN_8086&DEV_2935&SUBSYS_11001AF4&REV_03\E9)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75CCC60 (PCI\VEN_8086&DEV_2936&SUBSYS_11001AF4&REV_03\EA)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75CC880 (PCI\VEN_8086&DEV_293A&SUBSYS_11001AF4&REV_03\EF)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75CA9F0 (ACPI\PNP0103\0)
xen_platform_log xen platform: XENFILT|DriverSetFilterState: PENDING
xen_platform_log xen platform: XENFILT|DriverSetFilterState: DISABLED
xen_platform_log xen platform: XENBUS|DriverEntry: 8.2.0 (80) (17.09.2015)
xen_platform_log xen platform: XENFILT|PdoQueryInterface: PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10: PVDEVICE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENFILT|PvdeviceSetActive: PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10
xen_platform_log xen platform: XENBUS|FdoSetFriendlyName: Xen PV Bus (0001)
xen_platform_log xen platform: XENBUS|FdoCreate: FFFFE000F75F4480 (XP0001 XENBUS) [ACTIVE]
xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFE000F75F2C78: Shared LevelSensitive CPU 0:0 VECTOR b1
xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFE000F7587E98: DeviceExclusive Latched CPU 0:0 VECTOR 50
xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFE000F7587A68: DeviceExclusive Latched CPU 0:1 VECTOR 50
xen_platform_log xen platform: XENBUS|FdoScan: ====>
xen_platform_log xen platform: XENBUS|FdoCreateIoSpace: 00000000.f8000000 - 00000000.f8ffffff
xen_platform_log xen platform: XENBUS|FdoSuspend: ====>
xen_platform_log xen platform: XEN|HvmSetParam: fail1 (c0000022)
xen_platform_log xen platform: XENBUS|FdoBalloon: ====>
xen_platform_log xen platform: SHARED_INFO: MAP XENMAPSPACE_shared_info @ 00000000.f8000000
xen_platform_log xen platform: EVTCHN_FIFO: CONTROLBLOCK[0] @ 00000000.00eb3000
xen_platform_log xen platform: EVTCHN_FIFO: CONTROLBLOCK[1] @ 00000000.010b4000
xen_platform_log xen platform: XENBUS|EvtchnAbiAcquire: FIFO
xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CPU 0:0 (Vector = 80)
xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CPU 0:1 (Vector = 80)
xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CALLBACK VIA (Vector = 24)
xen_platform_log xen platform: STORE: PAGE @ 00000000.feffc000
xen_platform_log xen platform: STORE: EVTCHN 1
xen_platform_log xen platform: EVTCHN_FIFO: EVENTARRAY[0] @ 00000000.010b5000
xen_platform_log xen platform: XENBUS|EvtchnFifoExpand: added ports [00000000 - 000003ff]
xen_platform_log xen platform: XENBUS|PdoCreate: FFFFE000F75F0BB0 (VBD)
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 08000009 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000A -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000B -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v2 RANGE_SET v1 CACHE v1 GNTTAB v2 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoCreate: FFFFE000F75F0890 (VIF)
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 08000009 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000A -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000B -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v2 RANGE_SET v1 CACHE v1 GNTTAB v2 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoCreate: FFFFE000F75EFD40 (IFACE)
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 08000009 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000A -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000B -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v2 RANGE_SET v1 CACHE v1 GNTTAB v2 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE000F75DEC60 (PCIIDE\IDEChannel\0)
xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE000F75DDC60 (PCIIDE\IDEChannel\1)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75DD880 (IDE\DiskQEMU_HARDDISK___________________________2.2.1___\0.0.0)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000F75D8C60 (IDE\CdRomQEMU_QEMU_DVD-ROM_______________________2.2.____\0.1.0)
main_channel_handle_parsed: agent start
xen_platform_log xen platform: XENVBD|DriverEntry:8.2.0.35 (9/9/2015)
xen_platform_log xen platform: XENVBD|__DriverParseParameterKey:DriverParameters: 
xen_platform_log xen platform: XENDISK|DriverEntry:XENDISK 8.2.0 (35) (09.09.2015)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: BUS_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENDISK|FdoCreate:FFFFE000F9083DF0
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000F9063050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000F9063050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000F9063050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000F9063050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000F9063050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: BUS_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000F9063050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000F9063050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: BUS_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Version = 0
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Master = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: ScatterGather = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DemandMode = FALSE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: AutoInitialize = FALSE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Dma32BitAddresses = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: IgnoreCount = FALSE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Dma64BitAddresses = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: BusNumber = 00000000
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaChannel = ffffffff
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: InterfaceType = Internal
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaWidth = 8Bits
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaSpeed = Compatible
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: MaximumLength = 000b0000
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaPort = ffffffff
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000F9063050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENBUS|DmaGetAdapter: no interception
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: STORE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: EVTCHN_INTERFACE (VERSION 4)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: GNTTAB_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: SUSPEND_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: DEBUG_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: UNPLUG_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: EMULATED_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENFILT|PdoQueryInterface: PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10: EMULATED_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|UnplugRequest: DISKS (MAKE)
xen_platform_log xen platform: XEN|UnplugIncrementValue: DISKS 1
xen_platform_log xen platform: XENVBD|__FdoSetDevicePowerState:POWER D3 to D0
xen_platform_log xen platform: XENVBD|__FdoD3ToD0:D3->D0
xen_platform_log xen platform: XENVBD|FdoDispatchPnp:14:QUERY_PNP_DEVICE_STATE -> c00000bb
xen_platform_log xen platform: XENVBD|__FdoIsPdoUnplugged:Target[0] : (vbd/768) Emulated PRESENT
xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] : Creating (Emulated)
xen_platform_log xen platform: XENVBD|PdoSetDevicePowerState:Target[0] : POWER D3 to D0
xen_platform_log xen platform: XENVBD|PdoD3ToD0:Target[0] : D3->D0 (Emulated)
xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] : Created (Emulated)
xen_platform_log xen platform: XENVBD|FdoLogTargets:QUERY_RELATIONS ===>
xen_platform_log xen platform: XENVBD|FdoLogTargets:QUERY_RELATIONS : Target[0] = 0xFFFFE000F83F5020 (present)
xen_platform_log xen platform: XENVBD|FdoLogTargets:QUERY_RELATIONS <===
xen_platform_log xen platform: XENVBD|__ValidateSrbForPdo:Target[0] : Disk is Emulated (a0:SCSIOP_REPORT_LUNS)
xen_platform_log xen platform: XENVBD|__ValidateSrbForPdo:Target[0] : Disk is Emulated (12:SCSIOP_INQUIRY)
xen_platform_log xen platform: XENIFACE|DriverEntry: 8.2.0.21 (9/9/2015)
xen_platform_log xen platform: XENIFACE|ThreadCreate: Create thread FFFFF80113847E8C FFFFE000F8833090
xen_platform_log xen platform: XENIFACE|ThreadCreate: Create thread FFFFF80113846DD4 FFFFE000F88330A0
xen_platform_log xen platform: XENBUS|PdoQueryInterface: IFACE: SUSPEND_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: IFACE: SHARED_INFO_INTERFACE (VERSION 2)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: IFACE: STORE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENIFACE|FdoInitialiseXSRegistryEntries: no such xenstore key
xen_platform_log xen platform: XENIFACE|FdoInitialiseXSRegistryEntries: Failed to initialise registry (c0000022)
xen_platform_log xen platform: XENIFACE|ThreadCreate: Create thread FFFFF80113847968 FFFFE000F88332B8
xen_platform_log xen platform: XENIFACE|FdoCreate: FFFFE000F9045040 (IFACE)
xen_platform_log xen platform: XENIFACE|WmiInit: DRV: XenIface WMI Initialisation
xen_platform_log xen platform: XENVIF|DriverEntry: XENVIF 8.2.0 (49) (24.09.2015)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: BUS_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: DEBUG_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: SUSPEND_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: EVTCHN_INTERFACE (VERSION 4)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: STORE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: RANGE_SET_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: CACHE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: GNTTAB_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: UNPLUG_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENVIF|FdoCreate: FFFFE000F6A6B4C0 (XP0001 XENVIF)
xen_platform_log xen platform: XENVIF|__PdoSetPermanentAddress: 0: 00:16:3e:fe:7a:b9
xen_platform_log xen platform: XENVIF|__PdoSetContainerID: 0 {ca136717-12c6-5b65-881e-334b6ab03532}
xen_platform_log xen platform: XENVIF|FrontendSetMaxQueues: device/vif/0: 2
xen_platform_log xen platform: XENVIF|PdoCreate: FFFFE000F9095510 (0)
xen_platform_log xen platform: XENVIF|PdoDumpRevisions: 08000002 -> CACHE v1 VIF v2
xen_platform_log xen platform: XENVIF|PdoDumpRevisions: 08000003 -> CACHE v1 VIF v3
xen_platform_log xen platform: XENNET|DriverEntry: XENNET 8.2.0 (31) (17.09.2015)
xen_platform_log xen platform: XENBUS|UnplugRequest: NICS (MAKE)
xen_platform_log xen platform: XEN|UnplugIncrementValue: NICS 1
xen_platform_log xen platform: XENVIF|PdoSetFriendlyName: Xen PV Network Device #0
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail8
xen_platform_log xen platform: XENVIF|SettingsSave: FROM Ethernet (Realtek RTL8139C+ Fast Ethernet NIC)
xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses: Version4: ADDRESSES NOT FOUND
xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses: Version6: ADDRESSES NOT FOUND
xen_platform_log xen platform: XENVIF|DriverRequestReboot: <===>
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail7
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail6
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail5
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail4
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail3
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail2
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1 (c0000001)
xen_platform_log xen platform: XENNET|DriverUnload: XENNET 8.2.0 (31) (17.09.2015)
xen_platform_log xen platform: XENNET|DriverEntry: XENNET 8.2.0 (31) (17.09.2015)
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1 (c0000001)
xen_platform_log xen platform: XENNET|DriverUnload: XENNET 8.2.0 (31) (17.09.2015)
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Guest agent lite main loop starting
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Set time to XenTime
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: hosttimeIsUTC: Open Registry Key
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Time is now  2015.10.12 11:49:21.200
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Set time to 2015.10.12 11:49:30.541
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: About to add feature shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Establish watch control/shutdown
xen_platform_log xen platform: XENIFACE|StartWatch: Start Watch FFFFE000F8B9B9A0
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: About to advertise features
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: WmiSessionSetEntry:MethodExec Failed
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: WmiSessionSetEntry:SessionStart Failed
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: WmiSessionSetEntry:SetVValue Failed
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: WmiSessionSetEntry:SetVPath Failed 
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Failed to advertise shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: About to kick xapi 
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: win agent going to sleep
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: win agent woke up for 3
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Fire 000000F2356E4FA0
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: fire feature shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Check if we need to shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: No need to shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: fired feature shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: win agent going to sleep

--------------020500030504080903090602
Content-Type: image/jpeg;
 name="devices_screen.JPG"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="devices_screen.JPG"

/9j/4AAQSkZJRgABAQEAYABgAAD/4RB6RXhpZgAATU0AKgAAAAgABAE7AAIAAAAETTJSAIdp
AAQAAAABAAAISpydAAEAAAAIAAAQauocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6hwABwAA
CAwAAAhcAAAAABzqAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAABNADIAUgAAAP/hClxodHRwOi8vbnMuYWRvYmUuY29tL3hh
cC8xLjAvADw/eHBhY2tldCBiZWdpbj0n77u/JyBpZD0nVzVNME1wQ2VoaUh6cmVTek5UY3pr
YzlkJz8+DQo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIj48cmRmOlJERiB4
bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMi
PjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1h
ZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50
cy8xLjEvIi8+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEz
ZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2Rj
L2VsZW1lbnRzLzEuMS8iPjxkYzpjcmVhdG9yPjxyZGY6U2VxIHhtbG5zOnJkZj0iaHR0cDov
L3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpsaT5NMlI8L3Jk
ZjpsaT48L3JkZjpTZXE+DQoJCQk8L2RjOmNyZWF0b3I+PC9yZGY6RGVzY3JpcHRpb24+PC9y
ZGY6UkRGPjwveDp4bXBtZXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSd3Jz8+/9sAQwAHBQUGBQQHBgUGCAcH
CAoRCwoJCQoVDxAMERgVGhkYFRgXGx4nIRsdJR0XGCIuIiUoKSssKxogLzMvKjInKisq/9sA
QwEHCAgKCQoUCwsUKhwYHCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioq/8AAEQgDAAQAAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAAB
AgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGh
CCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVm
Z2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfI
ycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAAB
AgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRC
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
FFIAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigArOrRrOoAK+Ufj7/yVm4/687f/wBFivq6vlH4
+/8AJWLj/rzt/wD0WK68LvL0/VHLiNo+v6M82WngU0U6u5HKxMUYp1JjiiwhMUYpcUGiwAKO
1ApSOKYhtFHNLSGJiiiigA7UlO7e2aTFACUUuKSkAlHailxQUFGKM0ZoFqFBXiiigNRu2jFO
xzQRSsO43FFGaXdxQMY1HpTsZo20gGkVveAx/wAV3pf/AF1P/oJrDxW94F/5HvS/+up/9BNC
+JCl8LPtbwr/AMido3/XhB/6LWtWsrwr/wAido3/AF4Qf+i1rVryT0wooooAKKKKAKOm6Lpu
j+f/AGXZxWv2iQyy+WuN7Hv/APWq9RWF4z/tz/hFbv8A4RfZ/aG35d33tvfb/telABqfiyx0
q8SKc5iDbZZt3CH2HfHf09zxW3HIk0SyROro4DKynIYHuDXl2gXGhXPwu1BkltpbtQq6l/bT
N8r5GQ23kDGdoXvj3rpvAg1BdNjVV0pdH8s/Z/sTTlt2R/z1H3evTvQB0Oqaxpmh2f2vWtRt
NOttwTzrudYk3HoNzEDPHSrEFxDdW8dxaypNDKoeOSNgyupGQQRwQR3rkNU1PTdA+Ix1HxRc
wWVpLpyQ6fe3jhIYpN7mZN7YVHYeUcE5YJx901keKPFb22pSLp/iJNFtBpi3ekrFBEy6tOzv
mMB1JkHyx/LEVY+bnPK0r6f15/5f1uO2tv66f5npVFeaX2u+JI9R1W/OrSW8Om6rp9qNNW3i
MbpOtuJVZypfgysVIYYPXcMAZmhXGoWUK6Tp/iq6F1c+K7q2vAY7V5beM/aZAdvlYUvsV8sC
PQbeKpK/9en+Yvs839bN/oevVVtdTsL5lFje21yWiWdRDKr5jYkK4wfukqcHocH0rgdN8Tal
c+K0tn17zb5tTuLa58PGGL/RrVN4SfhRKuQsbb2Yo3mYA5XHK6Vq2o6J4VW/0fatzH4W0lTK
/wB2BGuJleUna2AqlmyVYDGSpAIKWqv6fimyuXddv87HuVFeaeHdb1zVdW0CybxTZ3kEovJp
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
0aJpWgKhUtT5YU7HOFHXJPUZuSaNq765Lp/9nt9gl1mPVf7R85NiooRvL253+Z5iY+7t2nO7
PFdk91bpdR2zzxrcSqzxxFwHdVxuIHUgblye2R60jXdst6lm1xELqSNpEgLjeyKQCwXqQCyg
ntketF9U+3+d/wA0Q17rT/q91+pNRRRSGFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR
RRQAUUUUAFcNXc1w1AEtr/x+Q/8AXRf514H8b1z8ULk/9O1v/wCixXvlr/x+Q/8AXRf514Z8
Zo9/xMuj/wBO9v8A+ilr0sujzVJLy/VHnZhLlpxfn+jPNNlJtq80GKhaKvXdNo8pVEyqVpMV
Myc03FRY0uR4oNPxzQVpWHcZRTsUBaLBcQU6gLzS4oENIppT0p+KO1A7kJBFJipTRgGosVci
20hFSFaTbk0co+YiNIRU5Tj3ppSlysfMiHvSEVPsFNKcVPKVzIpCgdaBR3rA6BaKKBQLUcKc
OlMpRVaiFNKBSGloEIRW74HH/FcaX/11P/oJrBrf8D/8jvpf/XU/+gmn1E/hZ9o+Ff8AkTtG
/wCvCD/0WtatZXhX/kTtG/68IP8A0WtateIeuFFFFABRRRQAVheK9Tm0yzsjFKIVuLtYJJOB
tUqxGCeh3BR+NbtRXNpb3sBhvIIriI9Y5UDKfwNAHIXGo6baxLLc30mGkWMNmORmY5wOIycn
FJ4L8Ryaxqk0C3AaFIPMEZfzDjcArBtq4GRIuMfw9sVoa74E0jWNL+yW0EOmMJUl860towSV
PQgrgjk8Gqfgr4c2Xgq+uru0vp7qS6jCSeaiKODuBAUDnJbOc5yPTmW3zbaGfv8ANfoZfjp7
vXPED6Vp2i3+qf2bZNMJLR7dRb3cnELHzZU5UKx4z98VPBr0Wq+JfCetzj7Mkmi38s6Mf9Sw
a38xSf8AZIYH6V31FUrrb+t/8/wNetzyvw1ql9beJNM1u98PajYRa/LLHc3ly9v5b+ad9rwk
rPkKojG5R9/seK6HVNT03QPiMdR8UXMFlaS6ckOn3t44SGKTe5mTe2FR2HlHBOWCcfdNdnRR
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
/wD0CKqNXpv+RetP+vqf/wBAipAf/9k=
--------------020500030504080903090602
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
--------------020500030504080903090602--


From win-pv-devel-bounces@lists.xenproject.org Mon Oct 12 12:15:30 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 12 Oct 2015 12:15:30 +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 1Zlc0m-0000ke-Sq; Mon, 12 Oct 2015 12:15:28 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7203db9da=Paul.Durrant@citrix.com>)
	id 1Zlc0m-0000kZ-8M
	for win-pv-devel@lists.xenproject.org; Mon, 12 Oct 2015 12:15:28 +0000
Received: from [85.158.137.68] by server-8.bemta-3.messagelabs.com id
	1B/87-31069-F54AB165; Mon, 12 Oct 2015 12:15:27 +0000
X-Env-Sender: prvs=7203db9da=Paul.Durrant@citrix.com
X-Msg-Ref: server-12.tower-31.messagelabs.com!1444652126!15554071!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 1153 invoked from network); 12 Oct 2015 12:15:27 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-12.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Oct 2015 12:15:27 -0000
X-IronPort-AV: E=Sophos;i="5.17,672,1437436800"; 
   d="scan'208";a="5001223"
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] Network and disk pv not working on windows 10
	pro 64 bit with latest winpv build and xen 4.6.0
Thread-Index: AQHRBNh9Z00iIvSIsUy7w+yOqi9SPJ5nxWbQ
Date: Mon, 12 Oct 2015 12:15:24 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F60C26F@AMSPEX01CL01.citrite.net>
References: <561B8AC1.9010900@m2r.biz>
In-Reply-To: <561B8AC1.9010900@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] Network and disk pv not working on windows 10
 pro 64 bit with latest winpv build and xen 4.6.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

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Fabio Fantoni
> Sent: 12 October 2015 11:26
> To: win-pv-devel@lists.xenproject.org
> Cc: Paul Durrant
> Subject: [win-pv-devel] Network and disk pv not working on windows 10 pro
> 64 bit with latest winpv build and xen 4.6.0
> 
> Dom0: Jessie (debian 8) 64 bit, kernel 3.16 from official repository,
> xen 4.6.0, other installation details here:
> ./configure --prefix=/usr --disable-blktap1 --disable-qemu-traditional
> --disable-rombios --with-system-seabios=/usr/share/seabios/bios-256k.bin
> --with-extra-qemuu-configure-args="--enable-spice --enable-usb-redir"
> --disable-blktap2 --enable-systemd
> xen services enabled with:
> systemctl enable xenstored.service
> systemctl enable xenconsoled.service
> systemctl enable xen-init-dom0.service
> systemctl enable xen-qemu-dom0-disk-backend.service
> systemctl enable xendomains.service
> 
> domU xl cfg:
> http://lists.xen.org/archives/html/xen-devel/2015-10/txtsAaP2yM2Vx.txt
> 
> Still use emualted disk and network and xen pv network is unable to
> start for code 10 error (from windows devices manager). (see also
> screenshot in attachment)
> 
> In attachment full qemu log with xen_platform trace.
> 

xen_platform_log xen platform: XENVIF|SettingsSave: FROM Ethernet (Realtek RTL8139C+ Fast Ethernet NIC)
xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses: Version4: ADDRESSES NOT FOUND
xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses: Version6: ADDRESSES NOT FOUND
xen_platform_log xen platform: XENVIF|DriverRequestReboot: <===>
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail7
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail6
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail5
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail4
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail3
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail2
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1 (c0000001)
xen_platform_log xen platform: XENNET|DriverUnload: XENNET 8.2.0 (31) (17.09.2015)

That means you have not rebooted to allow the emulated device to be unplugged. Other versions of Windows will prompt for the reboot but Microsoft broke the class installer in Windows 10 so it won't.

  Paul

> If you need more information and/or test tell me and I'l 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 Oct 12 12:15:30 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 12 Oct 2015 12:15:30 +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 1Zlc0m-0000ke-Sq; Mon, 12 Oct 2015 12:15:28 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7203db9da=Paul.Durrant@citrix.com>)
	id 1Zlc0m-0000kZ-8M
	for win-pv-devel@lists.xenproject.org; Mon, 12 Oct 2015 12:15:28 +0000
Received: from [85.158.137.68] by server-8.bemta-3.messagelabs.com id
	1B/87-31069-F54AB165; Mon, 12 Oct 2015 12:15:27 +0000
X-Env-Sender: prvs=7203db9da=Paul.Durrant@citrix.com
X-Msg-Ref: server-12.tower-31.messagelabs.com!1444652126!15554071!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 1153 invoked from network); 12 Oct 2015 12:15:27 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-12.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Oct 2015 12:15:27 -0000
X-IronPort-AV: E=Sophos;i="5.17,672,1437436800"; 
   d="scan'208";a="5001223"
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] Network and disk pv not working on windows 10
	pro 64 bit with latest winpv build and xen 4.6.0
Thread-Index: AQHRBNh9Z00iIvSIsUy7w+yOqi9SPJ5nxWbQ
Date: Mon, 12 Oct 2015 12:15:24 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F60C26F@AMSPEX01CL01.citrite.net>
References: <561B8AC1.9010900@m2r.biz>
In-Reply-To: <561B8AC1.9010900@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] Network and disk pv not working on windows 10
 pro 64 bit with latest winpv build and xen 4.6.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

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Fabio Fantoni
> Sent: 12 October 2015 11:26
> To: win-pv-devel@lists.xenproject.org
> Cc: Paul Durrant
> Subject: [win-pv-devel] Network and disk pv not working on windows 10 pro
> 64 bit with latest winpv build and xen 4.6.0
> 
> Dom0: Jessie (debian 8) 64 bit, kernel 3.16 from official repository,
> xen 4.6.0, other installation details here:
> ./configure --prefix=/usr --disable-blktap1 --disable-qemu-traditional
> --disable-rombios --with-system-seabios=/usr/share/seabios/bios-256k.bin
> --with-extra-qemuu-configure-args="--enable-spice --enable-usb-redir"
> --disable-blktap2 --enable-systemd
> xen services enabled with:
> systemctl enable xenstored.service
> systemctl enable xenconsoled.service
> systemctl enable xen-init-dom0.service
> systemctl enable xen-qemu-dom0-disk-backend.service
> systemctl enable xendomains.service
> 
> domU xl cfg:
> http://lists.xen.org/archives/html/xen-devel/2015-10/txtsAaP2yM2Vx.txt
> 
> Still use emualted disk and network and xen pv network is unable to
> start for code 10 error (from windows devices manager). (see also
> screenshot in attachment)
> 
> In attachment full qemu log with xen_platform trace.
> 

xen_platform_log xen platform: XENVIF|SettingsSave: FROM Ethernet (Realtek RTL8139C+ Fast Ethernet NIC)
xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses: Version4: ADDRESSES NOT FOUND
xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses: Version6: ADDRESSES NOT FOUND
xen_platform_log xen platform: XENVIF|DriverRequestReboot: <===>
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail7
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail6
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail5
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail4
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail3
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail2
xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1 (c0000001)
xen_platform_log xen platform: XENNET|DriverUnload: XENNET 8.2.0 (31) (17.09.2015)

That means you have not rebooted to allow the emulated device to be unplugged. Other versions of Windows will prompt for the reboot but Microsoft broke the class installer in Windows 10 so it won't.

  Paul

> If you need more information and/or test tell me and I'l 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 Oct 12 15:39:19 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 12 Oct 2015 15:39:19 +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 1ZlfC2-0000A7-Qk; Mon, 12 Oct 2015 15:39:18 +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 1ZlfC1-00006Z-7Y
	for win-pv-devel@lists.xenproject.org; Mon, 12 Oct 2015 15:39:17 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	32/D3-12889-424DB165; Mon, 12 Oct 2015 15:39:16 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-5.tower-27.messagelabs.com!1444664354!46370731!1
X-Originating-IP: [209.85.212.177]
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 21289 invoked from network); 12 Oct 2015 15:39:14 -0000
Received: from mail-wi0-f177.google.com (HELO mail-wi0-f177.google.com)
	(209.85.212.177)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Oct 2015 15:39:14 -0000
Received: by wicgb1 with SMTP id gb1so55293183wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 12 Oct 2015 08:39:13 -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:cc:message-id:date
	:user-agent:mime-version:in-reply-to:content-type;
	bh=aPKA5zN59SWcP53ysVRCQKFY7kZaoqucNozLsw87CWM=;
	b=N7i11oBqC77m5cb//K6LencXAXzJ3z2RGGMWtpxtLdKmZLdNxZtYMU2EPKfqxe5CCg
	WdSWng5j96KGHDuUTBGTiuyFO/abf9LOzkWU1IbFSgDd+k/Wbf2HPZnz5ySNGkZ/H//9
	1Axx0veAxUlCH1zpA2t3wDagTejbP7C0ryLZI1RCvdsAktaJmgB2QXTKM3pqtOa3x7jO
	MyAoSaSZ1rnXNO51IIkw3hS8XfhRVT4KA9ptFUYjejiA6NbDzX+KeWzvqggoyf6X/Kcd
	8554P8SyWLISgH4LPhlp3vwUh6L5DA2ZTYaW24ByCY02E0xuwevITrnFsDDMTOETJYZz
	Japw==
X-Gm-Message-State: ALoCoQk+5+7hN3RuYfXNRiPbDF/KWRvI6S2xI3jNBi101XpHAdWLiXjwgJ0KUtxDi7wHM2vLEbHJ
X-Received: by 10.194.200.195 with SMTP id ju3mr11976226wjc.26.1444664353677; 
	Mon, 12 Oct 2015 08:39:13 -0700 (PDT)
Received: from [192.168.178.23] ([95.233.12.243])
	by smtp.googlemail.com with ESMTPSA id
	fr10sm11317271wib.14.2015.10.12.08.39.11
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 12 Oct 2015 08:39:12 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <561B8AC1.9010900@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60C26F@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <561BD41E.5040302@m2r.biz>
Date: Mon, 12 Oct 2015 17:39:10 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F60C26F@AMSPEX01CL01.citrite.net>
Content-Type: multipart/mixed; boundary="------------020102060503090903020002"
Cc: Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
 pro 64 bit with latest winpv build and xen 4.6.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>
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.
--------------020102060503090903020002
Content-Type: text/plain; charset=windows-1252; format=flowed
Content-Transfer-Encoding: 7bit

Il 12/10/2015 14:15, 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: 12 October 2015 11:26
>> To: win-pv-devel@lists.xenproject.org
>> Cc: Paul Durrant
>> Subject: [win-pv-devel] Network and disk pv not working on windows 10 pro
>> 64 bit with latest winpv build and xen 4.6.0
>>
>> Dom0: Jessie (debian 8) 64 bit, kernel 3.16 from official repository,
>> xen 4.6.0, other installation details here:
>> ./configure --prefix=/usr --disable-blktap1 --disable-qemu-traditional
>> --disable-rombios --with-system-seabios=/usr/share/seabios/bios-256k.bin
>> --with-extra-qemuu-configure-args="--enable-spice --enable-usb-redir"
>> --disable-blktap2 --enable-systemd
>> xen services enabled with:
>> systemctl enable xenstored.service
>> systemctl enable xenconsoled.service
>> systemctl enable xen-init-dom0.service
>> systemctl enable xen-qemu-dom0-disk-backend.service
>> systemctl enable xendomains.service
>>
>> domU xl cfg:
>> http://lists.xen.org/archives/html/xen-devel/2015-10/txtsAaP2yM2Vx.txt
>>
>> Still use emualted disk and network and xen pv network is unable to
>> start for code 10 error (from windows devices manager). (see also
>> screenshot in attachment)
>>
>> In attachment full qemu log with xen_platform trace.
>>
> xen_platform_log xen platform: XENVIF|SettingsSave: FROM Ethernet (Realtek RTL8139C+ Fast Ethernet NIC)
> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses: Version4: ADDRESSES NOT FOUND
> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses: Version6: ADDRESSES NOT FOUND
> xen_platform_log xen platform: XENVIF|DriverRequestReboot: <===>
> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail7
> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail6
> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail5
> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail4
> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail3
> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail2
> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1 (c0000001)
> xen_platform_log xen platform: XENNET|DriverUnload: XENNET 8.2.0 (31) (17.09.2015)
>
> That means you have not rebooted to allow the emulated device to be unplugged. Other versions of Windows will prompt for the reboot but Microsoft broke the class installer in Windows 10 so it won't.
>
>    Paul

Thanks for reply.
I already did a windows reboot after pv install but after doing another 
seem ok.
Remain the dubt with ahci, I saw both emulated and pv ok in windows 
devices manager and I not understand if a changes is needed for ahci 
qemu side as Stefano Stabellini told.
Can you take a look to this new qemu log please? Is ok or with ahci disk 
is not pv correctly?

If you need more information and/or test tell me and I'l post them.

Thanks for any reply and sorry for my bad english.

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

xen_platform_log xen platform: XEN|DllInitialize: 8.2.0 (80) (17.09.2015)
xen_platform_log xen platform: XEN|AcpiFindRsdp: 0x00000000000F65D0
xen_platform_log xen platform: XEN|SystemGetStartOptions:  TESTSIGNING  NOEXECUTE=OPTIN
xen_platform_log xen platform: XEN|SystemGetVersionInformation: KERNEL: 10.0 (BUILD 10240) PLATFORM WIN32_NT (x64)
xen_platform_log xen platform: XEN|SystemGetVersionInformation: SUITES:
xen_platform_log xen platform: XEN|SystemGetVersionInformation: - TERMINAL
xen_platform_log xen platform: XEN|SystemGetVersionInformation: - SINGLEUSERTS
xen_platform_log xen platform: XEN|SystemGetVersionInformation: TYPE: WORKSTATION
xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[0] 00000000.00001000 - 00000000.0009efff
xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[1] 00000000.00100000 - 00000000.00101fff
xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[2] 00000000.00103000 - 00000000.efffcfff
xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[3] 00000001.00000000 - 00000001.07ffffff
xen_platform_log xen platform: XEN|AcpiGetXsdt: 0x00000000FC00A010
xen_platform_log xen platform: XEN|SystemProcessorInformation: ====> (0:0)
xen_platform_log xen platform: XEN|SystemProcessorInformation: Manufacturer: GenuineIntel
xen_platform_log xen platform: XEN|SystemProcessorInformation: APIC ID: 00
xen_platform_log xen platform: XEN|SystemProcessorInformation: PROCESSOR ID: 00
xen_platform_log xen platform: XEN|SystemProcessorInformation: <==== (0:0)
xen_platform_log xen platform: XEN|SystemProcessorInformation: ====> (0:1)
xen_platform_log xen platform: XEN|SystemProcessorInformation: Manufacturer: GenuineIntel
xen_platform_log xen platform: XEN|SystemProcessorInformation: APIC ID: 02
xen_platform_log xen platform: XEN|SystemProcessorInformation: PROCESSOR ID: 01
xen_platform_log xen platform: XEN|SystemProcessorInformation: <==== (0:1)
xen_platform_log xen platform: XEN: HYPERCALL PAGE 0 @ 00000001.04929000
xen_platform_log xen platform: XEN|UnplugSetRequest: DISKS
xen_platform_log xen platform: XEN|UnplugSetRequest: NICS
xen_platform_log xen platform: XENFILT|DriverEntry: 8.2.0 (80) (17.09.2015)
xen_platform_log xen platform: XEN: 4.6.0 (__XEN_INTERFACE_VERSION__ = 00040600)
xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE000928D98E0 (ACPI\PNP0A03\0)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928AEC60 (PCI\VEN_8086&DEV_1237&SUBSYS_11001AF4&REV_02\00)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928CDC60 (PCI\VEN_8086&DEV_7000&SUBSYS_11001AF4&REV_00\08)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928C0C60 (PCI\VEN_8086&DEV_7010&SUBSYS_11001AF4&REV_00\09)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928C0880 (PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928BFC60 (PCI\VEN_8086&DEV_2668&SUBSYS_11001AF4&REV_01\18)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928BF880 (PCI\VEN_1AF4&DEV_1003&SUBSYS_00031AF4&REV_00\20)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928BEB30 (PCI\VEN_1B36&DEV_0100&SUBSYS_11001AF4&REV_04\28)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928BAC60 (PCI\VEN_10EC&DEV_8139&SUBSYS_11001AF4&REV_20\30)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928B6C60 (PCI\VEN_8086&DEV_2922&SUBSYS_11001AF4&REV_02\38)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928B5C60 (PCI\VEN_8086&DEV_2934&SUBSYS_11001AF4&REV_03\E8)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928B5880 (PCI\VEN_8086&DEV_2935&SUBSYS_11001AF4&REV_03\E9)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928B49F0 (PCI\VEN_8086&DEV_2936&SUBSYS_11001AF4&REV_03\EA)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928B3B30 (PCI\VEN_8086&DEV_293A&SUBSYS_11001AF4&REV_03\EF)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928ABC60 (ACPI\PNP0103\0)
xen_platform_log xen platform: XENFILT|DriverSetFilterState: ACTIVE DEVICE PRESENT
xen_platform_log xen platform: UNPLUG: PRE-AMBLE (DRIVERS NOT BLACKLISTED)
xen_platform_log xen platform: UNPLUG: DISKS
xen_platform_log xen platform: UNPLUG: NICS
xen_platform_log xen platform: XENFILT|DriverSetFilterState: PENDING
xen_platform_log xen platform: XENFILT|PdoDestroy: FFFFE000928BAC60 (PCI\VEN_10EC&DEV_8139&SUBSYS_11001AF4&REV_20\30) (device disappeared)
xen_platform_log xen platform: XENFILT|DriverSetFilterState: DISABLED
xen_platform_log xen platform: XENBUS|DriverEntry: 8.2.0 (80) (17.09.2015)
xen_platform_log xen platform: XENFILT|PdoQueryInterface: PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10: PVDEVICE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|FdoSetFriendlyName: Xen PV Bus (0001)
xen_platform_log xen platform: XENBUS|FdoCreate: FFFFE000928D5490 (XP0001 XENBUS) [ACTIVE]
xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFE000923F2E98: Shared LevelSensitive CPU 0:0 VECTOR b1
xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFE000923F29C8: DeviceExclusive Latched CPU 0:0 VECTOR 50
xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFE000923EECA8: DeviceExclusive Latched CPU 0:1 VECTOR 50
xen_platform_log xen platform: XENBUS|FdoScan: ====>
xen_platform_log xen platform: XENBUS|FdoCreateIoSpace: 00000000.f8000000 - 00000000.f8ffffff
xen_platform_log xen platform: XENBUS|FdoSuspend: ====>
xen_platform_log xen platform: XEN|HvmSetParam: fail1 (c0000022)
xen_platform_log xen platform: XENBUS|FdoBalloon: ====>
xen_platform_log xen platform: SHARED_INFO: MAP XENMAPSPACE_shared_info @ 00000000.f8000000
xen_platform_log xen platform: EVTCHN_FIFO: CONTROLBLOCK[0] @ 00000000.00f50000
xen_platform_log xen platform: EVTCHN_FIFO: CONTROLBLOCK[1] @ 00000000.011d1000
xen_platform_log xen platform: XENBUS|EvtchnAbiAcquire: FIFO
xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CPU 0:0 (Vector = 80)
xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CPU 0:1 (Vector = 80)
xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CALLBACK VIA (Vector = 24)
xen_platform_log xen platform: STORE: PAGE @ 00000000.feffc000
xen_platform_log xen platform: STORE: EVTCHN 1
xen_platform_log xen platform: EVTCHN_FIFO: EVENTARRAY[0] @ 00000000.00952000
xen_platform_log xen platform: XENBUS|EvtchnFifoExpand: added ports [00000000 - 000003ff]
xen_platform_log xen platform: XENBUS|PdoCreate: FFFFE000928D2D40 (VBD)
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 08000009 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000A -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000B -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v2 RANGE_SET v1 CACHE v1 GNTTAB v2 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoCreate: FFFFE000928D2A20 (VIF)
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 08000009 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000A -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000B -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v2 RANGE_SET v1 CACHE v1 GNTTAB v2 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoCreate: FFFFE000928D1D40 (IFACE)
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 08000009 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000A -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000B -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v2 RANGE_SET v1 CACHE v1 GNTTAB v2 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE00092993040 (PCIIDE\IDEChannel\0)
xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE00092993430 (PCIIDE\IDEChannel\1)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE0009298E040 (IDE\CdRomQEMU_QEMU_DVD-ROM_______________________2.2.____\0.1.0)
xen_platform_log xen platform: XENVBD|DriverEntry:8.2.0.35 (9/9/2015)
xen_platform_log xen platform: XENVBD|__DriverParseParameterKey:DriverParameters: 
xen_platform_log xen platform: XENDISK|DriverEntry:XENDISK 8.2.0 (35) (09.09.2015)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: BUS_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENDISK|FdoCreate:FFFFE00092980CE0
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000929DA050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000929DA050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000929DA050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000929DA050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000929DA050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: BUS_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000929DA050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000929DA050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: BUS_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Version = 0
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Master = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: ScatterGather = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DemandMode = FALSE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: AutoInitialize = FALSE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Dma32BitAddresses = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: IgnoreCount = FALSE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Dma64BitAddresses = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: BusNumber = 00000000
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaChannel = ffffffff
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: InterfaceType = Internal
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaWidth = 8Bits
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaSpeed = Compatible
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: MaximumLength = 000b0000
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaPort = ffffffff
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000929DA050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENBUS|DmaGetAdapter: no interception
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: STORE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: EVTCHN_INTERFACE (VERSION 4)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: GNTTAB_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: SUSPEND_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: DEBUG_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: UNPLUG_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: EMULATED_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENFILT|PdoQueryInterface: PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10: EMULATED_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|UnplugRequest: DISKS (MAKE)
xen_platform_log xen platform: XEN|UnplugIncrementValue: DISKS 1
xen_platform_log xen platform: XENVBD|__FdoSetDevicePowerState:POWER D3 to D0
xen_platform_log xen platform: XENVBD|__FdoD3ToD0:D3->D0
xen_platform_log xen platform: XENVBD|__FdoIsPdoUnplugged:Target[0] : (vbd/768) Emulated NOT_PRESENT
xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] : Creating (PV)
xen_platform_log xen platform: XENVBD|PdoSetDevicePowerState:Target[0] : POWER D3 to D0
xen_platform_log xen platform: XENVBD|PdoD3ToD0:Target[0] : D3->D0 (PV)
xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] : INITIALIZED ----> ENABLED
xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] : in state CLOSED
xen_platform_log xen platform: XENVBD|FrontendWriteUsage:Target[0] : NOT_DUMP NOT_HIBER NOT_PAGE
xen_platform_log xen platform: XENVBD|PdoReadInquiryData:Target[0] : Failed to get Page80 data
xen_platform_log xen platform: XENVBD|PdoReadInquiryData:Target[0] : Failed to get Page83 data
xen_platform_log xen platform: XENVBD|PdoUpdateInquiryData:Target[0] : VDI-UUID = {00000000-0000-0000-0000-000000000000}
xen_platform_log xen platform: XENVBD|FrontendPrepare:Target[0] : BackendId 0 (/local/domain/0/backend/vbd/5/768)
xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] : in state PREPARED
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[0] @ 00000000.f8001000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00000020 - 000001ff]
xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] : 104857600 sectors of 512 bytes (512)
xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] : 50 GB (00000000) 
xen_platform_log xen platform: XENVBD|FrontendReadDiskInfo:Target[0] : Features: BARRIER FLUSH DISCARD 
xen_platform_log xen platform: XENVBD|FrontendReadDiskInfo:Target[0] : DISCARD 0/1000
xen_platform_log xen platform: XENVBD|FrontendReadFeatures:Target[0] : Features: PERSISTENT INDIRECT 
xen_platform_log xen platform: XENVBD|FrontendReadFeatures:Target[0] : INDIRECT 100
xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] : in state CONNECTED
xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] : in state ENABLED
xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] : Created (PV)
xen_platform_log xen platform: XENVBD|FdoLogTargets:ScanThread ===>
xen_platform_log xen platform: XENVBD|FdoLogTargets:ScanThread : Target[0] = 0xFFFFE000919F2290 (present)
xen_platform_log xen platform: XENVBD|FdoLogTargets:ScanThread <===
xen_platform_log xen platform: XENVBD|FdoDispatchPnp:14:QUERY_PNP_DEVICE_STATE -> c00000bb
xen_platform_log xen platform: XENVBD|__HandlePage83:Target[0] : INQUIRY Using Fake Page83 Data
xen_platform_log xen platform: XENVBD|__HandlePage80:Target[0] : INQUIRY Using Fake Page80 Data
xen_platform_log xen platform: XENDISK|PdoCreate:FFFFE000929FEDF0
xen_platform_log xen platform: XENVBD|PdoSetDeviceObject:Target[0] : Setting DeviceObject = 0xFFFFE000929FC060
xen_platform_log xen platform: XENVBD|FdoMapDeviceObjectToPdo:0xFFFFE000929FC060 --> Target 0 (000000)
xen_platform_log xen platform: XENVBD|PdoDispatchPnp:Target[0] : 13:QUERY_ID -> c00000bb
xen_platform_log xen platform: XENVBD|PdoDispatchPnp:Target[0] : 08:QUERY_INTERFACE -> c00000bb
xen_platform_log xen platform: XENVBD|PdoDispatchPnp:Target[0] : 15:QUERY_BUS_INFORMATION -> c00000bb
xen_platform_log xen platform: XENVBD|PdoDispatchPnp:Target[0] : 19:UNKNOWN -> c00000bb
xen_platform_log xen platform: XENVBD|PdoDispatchPnp:Target[0] : 18:UNKNOWN -> c00000bb
xen_platform_log xen platform: XENVBD|PdoDispatchPnp:Target[0] : 0d:FILTER_RESOURCE_REQUIREMENTS -> c00000bb
xen_platform_log xen platform: XENVBD|PdoSetDevicePnpState:Target[0] : PNP Present to Started
xen_platform_log xen platform: XENVBD|PdoDispatchPnp:Target[0] : 08:QUERY_INTERFACE -> c00000bb
xen_platform_log xen platform: XENVBD|PdoDispatchPnp:Target[0] : 08:QUERY_INTERFACE -> c00000bb
xen_platform_log xen platform: XENVBD|PdoDispatchPnp:Target[0] : 07:QUERY_DEVICE_RELATIONS -> c00000bb
xen_platform_log xen platform: XENVBD|FrontendWriteUsage:Target[0] : DUMP NOT_HIBER NOT_PAGE
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENVBD|FdoDispatchPnp:14:QUERY_PNP_DEVICE_STATE -> c00000bb
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[1] @ 00000000.f8002000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00000200 - 000003ff]
xen_platform_log xen platform: XENVIF|DriverEntry: XENVIF 8.2.0 (49) (24.09.2015)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: BUS_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: DEBUG_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: SUSPEND_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: EVTCHN_INTERFACE (VERSION 4)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: STORE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: RANGE_SET_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: CACHE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: GNTTAB_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: UNPLUG_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENVIF|FdoCreate: FFFFE00092E97780 (XP0001 XENVIF)
xen_platform_log xen platform: XENIFACE|DriverEntry: 8.2.0.21 (9/9/2015)
xen_platform_log xen platform: XENIFACE|ThreadCreate: Create thread FFFFF8015C6D7E8C FFFFE00092ECFD90
xen_platform_log xen platform: XENIFACE|ThreadCreate: Create thread FFFFF8015C6D6DD4 FFFFE00092ECFDA0
xen_platform_log xen platform: XENBUS|PdoQueryInterface: IFACE: SUSPEND_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: IFACE: SHARED_INFO_INTERFACE (VERSION 2)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: IFACE: STORE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENIFACE|FdoInitialiseXSRegistryEntries: no such xenstore key
xen_platform_log xen platform: XENIFACE|FdoInitialiseXSRegistryEntries: Failed to initialise registry (c0000022)
xen_platform_log xen platform: XENIFACE|ThreadCreate: Create thread FFFFF8015C6D7968 FFFFE00092ECFFB8
xen_platform_log xen platform: XENIFACE|FdoCreate: FFFFE00092ABF840 (IFACE)
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[2] @ 00000000.f8003000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00000400 - 000005ff]
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[3] @ 00000000.f8004000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00000600 - 000007ff]
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[4] @ 00000000.f8005000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00000800 - 000009ff]
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[5] @ 00000000.f8006000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00000a00 - 00000bff]
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[6] @ 00000000.f8007000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00000c00 - 00000dff]
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[7] @ 00000000.f8008000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00000e00 - 00000fff]
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[8] @ 00000000.f8009000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00001000 - 000011ff]
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[9] @ 00000000.f800a000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00001200 - 000013ff]
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[10] @ 00000000.f800b000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00001400 - 000015ff]
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[11] @ 00000000.f800c000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00001600 - 000017ff]
xen_platform_log xen platform: XENVIF|__PdoSetPermanentAddress: 0: 00:16:3e:fe:7a:b9
xen_platform_log xen platform: XENVIF|__PdoSetContainerID: 0 {ca136717-12c6-5b65-881e-334b6ab03532}
xen_platform_log xen platform: XENVIF|FrontendSetMaxQueues: device/vif/0: 2
xen_platform_log xen platform: XENVIF|PdoCreate: FFFFE0009325FD40 (0)
xen_platform_log xen platform: XENVIF|PdoDumpRevisions: 08000002 -> CACHE v1 VIF v2
xen_platform_log xen platform: XENVIF|PdoDumpRevisions: 08000003 -> CACHE v1 VIF v3
xen_platform_log xen platform: XENNET|DriverEntry: XENNET 8.2.0 (31) (17.09.2015)
xen_platform_log xen platform: XENIFACE|WmiInit: DRV: XenIface WMI Initialisation
xen_platform_log xen platform: XENBUS|UnplugRequest: NICS (MAKE)
xen_platform_log xen platform: XEN|UnplugIncrementValue: NICS 1
xen_platform_log xen platform: XENVIF|PdoSetFriendlyName: Xen PV Network Device #0
xen_platform_log xen platform: XENVIF|__MacSetPermanentAddress: data/vif/0: 00:16:3E:FE:7A:B9
xen_platform_log xen platform: XENVIF|__MacSetCurrentAddress: data/vif/0: 00:16:3E:FE:7A:B9
xen_platform_log xen platform: XENVIF|FrontendSetNumQueues: device/vif/0: 2
xen_platform_log xen platform: XENBUS|EvtchnBind: [9]: CPU 0:1
xen_platform_log xen platform: XENBUS|EvtchnBind: [11]: CPU 0:1
xen_platform_log xen platform: XENVIF|PdoQueryInterface: 0: VIF_INTERFACE (VERSION 3)
xen_platform_log xen platform: XENVIF|PdoQueryInterface: 0: CACHE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: CACHE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: Checksum.IPv4Receive.IpChecksum ON
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: Checksum.IPv4Receive.TcpChecksum ON
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: Checksum.IPv4Receive.UdpChecksum ON
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: Checksum.IPv6Receive.TcpChecksum ON
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: Checksum.IPv6Receive.UdpChecksum ON
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: Checksum.IPv4Transmit.IpChecksum ON
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: Checksum.IPv4Transmit.TcpChecksum ON
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: Checksum.IPv4Transmit.UdpChecksum ON
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: Checksum.IPv6Transmit.TcpChecksum ON
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: Checksum.IPv6Transmit.UdpChecksum ON
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: LsoV2.IPv4.MaxOffLoadSize = 65201
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: LsoV2.IPv6.MaxOffLoadSize = 65201
xen_platform_log xen platform: XENVIF|PdoQueryInterface: 0: BUS_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Version = 2
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Master = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: ScatterGather = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DemandMode = FALSE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: AutoInitialize = FALSE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Dma32BitAddresses = FALSE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: IgnoreCount = FALSE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Dma64BitAddresses = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: BusNumber = 00000000
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaChannel = 00000000
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: InterfaceType = Internal
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaWidth = 8Bits
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaSpeed = Compatible
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: MaximumLength = 00020000
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaPort = 00000000
xen_platform_log xen platform: XENBUS|DmaGetAdapter: no interception
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[12] @ 00000000.f800d000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00001800 - 000019ff]
xen_platform_log xen platform: XENNET|AdapterMediaStateChange: LINK: UP: SPEED=1000000000 DUPLEX=FULL
xen_platform_log xen platform: XENVBD|FrontendWriteUsage:Target[0] : NOT_DUMP NOT_HIBER NOT_PAGE
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENVBD|FdoDispatchPnp:14:QUERY_PNP_DEVICE_STATE -> c00000bb
xen_platform_log xen platform: XENVBD|FrontendWriteUsage:Target[0] : NOT_DUMP NOT_HIBER PAGE
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENVBD|FdoDispatchPnp:14:QUERY_PNP_DEVICE_STATE -> c00000bb
xen_platform_log xen platform: XENVBD|FrontendWriteUsage:Target[0] : DUMP NOT_HIBER PAGE
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENVBD|FdoDispatchPnp:14:QUERY_PNP_DEVICE_STATE -> c00000bb
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENVBD|FdoDispatchPnp:14:QUERY_PNP_DEVICE_STATE -> c00000bb
(/usr/sbin/xl:3654): SpiceWorker-Warning **: red_worker.c:163:rendering_incorrect: rendering incorrect from now on: get_drawable
(/usr/sbin/xl:3654): SpiceWorker-Warning **: red_worker.c:163:rendering_incorrect: rendering incorrect from now on: failed to get_drawable
xen_platform_log xen platform: XENNET|AdapterSetInformation: UNSUPPORTED OID 00010118
xen_platform_log xen platform: XENNET|AdapterSetInformation: UNSUPPORTED OID 00010118
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Guest agent lite main loop starting
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Set time to XenTime
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: hosttimeIsUTC: Open Registry Key
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Time is now  2015.10.12 17:16:44.604
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Set time to 2015.10.12 17:16:45.814
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: About to add feature shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Establish watch control/shutdown
main_channel_link: add main channel client
xen_platform_log xen platform: XENIFACE|StartWatch: Start Watch FFFFE00093E7ECD0
main_channel_handle_parsed: agent start
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: About to advertise features
main_channel_handle_parsed: net test: latency 8.355000 ms, bitrate 627066748 bps (598.017452 Mbps)
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: WmiSessionSetEntry:MethodExec Failed
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: WmiSessionSetEntry:SessionStart Failed
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: WmiSessionSetEntry:SetVValue Failed
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: WmiSessionSetEntry:SetVPath Failed 
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Failed to advertise shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: About to kick xapi 
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: win agent going to sleep
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: win agent woke up for 3
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Fire 00000011BE450080
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: fire feature shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Check if we need to shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: No need to shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: fired feature shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: win agent going to sleep
inputs_connect: inputs channel client create
red_dispatcher_set_cursor_peer: 
main_channel_handle_parsed: agent start

--------------020102060503090903020002
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
--------------020102060503090903020002--


From win-pv-devel-bounces@lists.xenproject.org Mon Oct 12 15:39:19 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 12 Oct 2015 15:39:19 +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 1ZlfC2-0000A7-Qk; Mon, 12 Oct 2015 15:39:18 +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 1ZlfC1-00006Z-7Y
	for win-pv-devel@lists.xenproject.org; Mon, 12 Oct 2015 15:39:17 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	32/D3-12889-424DB165; Mon, 12 Oct 2015 15:39:16 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-5.tower-27.messagelabs.com!1444664354!46370731!1
X-Originating-IP: [209.85.212.177]
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 21289 invoked from network); 12 Oct 2015 15:39:14 -0000
Received: from mail-wi0-f177.google.com (HELO mail-wi0-f177.google.com)
	(209.85.212.177)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Oct 2015 15:39:14 -0000
Received: by wicgb1 with SMTP id gb1so55293183wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 12 Oct 2015 08:39:13 -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:cc:message-id:date
	:user-agent:mime-version:in-reply-to:content-type;
	bh=aPKA5zN59SWcP53ysVRCQKFY7kZaoqucNozLsw87CWM=;
	b=N7i11oBqC77m5cb//K6LencXAXzJ3z2RGGMWtpxtLdKmZLdNxZtYMU2EPKfqxe5CCg
	WdSWng5j96KGHDuUTBGTiuyFO/abf9LOzkWU1IbFSgDd+k/Wbf2HPZnz5ySNGkZ/H//9
	1Axx0veAxUlCH1zpA2t3wDagTejbP7C0ryLZI1RCvdsAktaJmgB2QXTKM3pqtOa3x7jO
	MyAoSaSZ1rnXNO51IIkw3hS8XfhRVT4KA9ptFUYjejiA6NbDzX+KeWzvqggoyf6X/Kcd
	8554P8SyWLISgH4LPhlp3vwUh6L5DA2ZTYaW24ByCY02E0xuwevITrnFsDDMTOETJYZz
	Japw==
X-Gm-Message-State: ALoCoQk+5+7hN3RuYfXNRiPbDF/KWRvI6S2xI3jNBi101XpHAdWLiXjwgJ0KUtxDi7wHM2vLEbHJ
X-Received: by 10.194.200.195 with SMTP id ju3mr11976226wjc.26.1444664353677; 
	Mon, 12 Oct 2015 08:39:13 -0700 (PDT)
Received: from [192.168.178.23] ([95.233.12.243])
	by smtp.googlemail.com with ESMTPSA id
	fr10sm11317271wib.14.2015.10.12.08.39.11
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 12 Oct 2015 08:39:12 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <561B8AC1.9010900@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60C26F@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <561BD41E.5040302@m2r.biz>
Date: Mon, 12 Oct 2015 17:39:10 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F60C26F@AMSPEX01CL01.citrite.net>
Content-Type: multipart/mixed; boundary="------------020102060503090903020002"
Cc: Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
 pro 64 bit with latest winpv build and xen 4.6.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>
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.
--------------020102060503090903020002
Content-Type: text/plain; charset=windows-1252; format=flowed
Content-Transfer-Encoding: 7bit

Il 12/10/2015 14:15, 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: 12 October 2015 11:26
>> To: win-pv-devel@lists.xenproject.org
>> Cc: Paul Durrant
>> Subject: [win-pv-devel] Network and disk pv not working on windows 10 pro
>> 64 bit with latest winpv build and xen 4.6.0
>>
>> Dom0: Jessie (debian 8) 64 bit, kernel 3.16 from official repository,
>> xen 4.6.0, other installation details here:
>> ./configure --prefix=/usr --disable-blktap1 --disable-qemu-traditional
>> --disable-rombios --with-system-seabios=/usr/share/seabios/bios-256k.bin
>> --with-extra-qemuu-configure-args="--enable-spice --enable-usb-redir"
>> --disable-blktap2 --enable-systemd
>> xen services enabled with:
>> systemctl enable xenstored.service
>> systemctl enable xenconsoled.service
>> systemctl enable xen-init-dom0.service
>> systemctl enable xen-qemu-dom0-disk-backend.service
>> systemctl enable xendomains.service
>>
>> domU xl cfg:
>> http://lists.xen.org/archives/html/xen-devel/2015-10/txtsAaP2yM2Vx.txt
>>
>> Still use emualted disk and network and xen pv network is unable to
>> start for code 10 error (from windows devices manager). (see also
>> screenshot in attachment)
>>
>> In attachment full qemu log with xen_platform trace.
>>
> xen_platform_log xen platform: XENVIF|SettingsSave: FROM Ethernet (Realtek RTL8139C+ Fast Ethernet NIC)
> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses: Version4: ADDRESSES NOT FOUND
> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses: Version6: ADDRESSES NOT FOUND
> xen_platform_log xen platform: XENVIF|DriverRequestReboot: <===>
> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail7
> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail6
> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail5
> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail4
> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail3
> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail2
> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1 (c0000001)
> xen_platform_log xen platform: XENNET|DriverUnload: XENNET 8.2.0 (31) (17.09.2015)
>
> That means you have not rebooted to allow the emulated device to be unplugged. Other versions of Windows will prompt for the reboot but Microsoft broke the class installer in Windows 10 so it won't.
>
>    Paul

Thanks for reply.
I already did a windows reboot after pv install but after doing another 
seem ok.
Remain the dubt with ahci, I saw both emulated and pv ok in windows 
devices manager and I not understand if a changes is needed for ahci 
qemu side as Stefano Stabellini told.
Can you take a look to this new qemu log please? Is ok or with ahci disk 
is not pv correctly?

If you need more information and/or test tell me and I'l post them.

Thanks for any reply and sorry for my bad english.

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

xen_platform_log xen platform: XEN|DllInitialize: 8.2.0 (80) (17.09.2015)
xen_platform_log xen platform: XEN|AcpiFindRsdp: 0x00000000000F65D0
xen_platform_log xen platform: XEN|SystemGetStartOptions:  TESTSIGNING  NOEXECUTE=OPTIN
xen_platform_log xen platform: XEN|SystemGetVersionInformation: KERNEL: 10.0 (BUILD 10240) PLATFORM WIN32_NT (x64)
xen_platform_log xen platform: XEN|SystemGetVersionInformation: SUITES:
xen_platform_log xen platform: XEN|SystemGetVersionInformation: - TERMINAL
xen_platform_log xen platform: XEN|SystemGetVersionInformation: - SINGLEUSERTS
xen_platform_log xen platform: XEN|SystemGetVersionInformation: TYPE: WORKSTATION
xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[0] 00000000.00001000 - 00000000.0009efff
xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[1] 00000000.00100000 - 00000000.00101fff
xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[2] 00000000.00103000 - 00000000.efffcfff
xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[3] 00000001.00000000 - 00000001.07ffffff
xen_platform_log xen platform: XEN|AcpiGetXsdt: 0x00000000FC00A010
xen_platform_log xen platform: XEN|SystemProcessorInformation: ====> (0:0)
xen_platform_log xen platform: XEN|SystemProcessorInformation: Manufacturer: GenuineIntel
xen_platform_log xen platform: XEN|SystemProcessorInformation: APIC ID: 00
xen_platform_log xen platform: XEN|SystemProcessorInformation: PROCESSOR ID: 00
xen_platform_log xen platform: XEN|SystemProcessorInformation: <==== (0:0)
xen_platform_log xen platform: XEN|SystemProcessorInformation: ====> (0:1)
xen_platform_log xen platform: XEN|SystemProcessorInformation: Manufacturer: GenuineIntel
xen_platform_log xen platform: XEN|SystemProcessorInformation: APIC ID: 02
xen_platform_log xen platform: XEN|SystemProcessorInformation: PROCESSOR ID: 01
xen_platform_log xen platform: XEN|SystemProcessorInformation: <==== (0:1)
xen_platform_log xen platform: XEN: HYPERCALL PAGE 0 @ 00000001.04929000
xen_platform_log xen platform: XEN|UnplugSetRequest: DISKS
xen_platform_log xen platform: XEN|UnplugSetRequest: NICS
xen_platform_log xen platform: XENFILT|DriverEntry: 8.2.0 (80) (17.09.2015)
xen_platform_log xen platform: XEN: 4.6.0 (__XEN_INTERFACE_VERSION__ = 00040600)
xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE000928D98E0 (ACPI\PNP0A03\0)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928AEC60 (PCI\VEN_8086&DEV_1237&SUBSYS_11001AF4&REV_02\00)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928CDC60 (PCI\VEN_8086&DEV_7000&SUBSYS_11001AF4&REV_00\08)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928C0C60 (PCI\VEN_8086&DEV_7010&SUBSYS_11001AF4&REV_00\09)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928C0880 (PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928BFC60 (PCI\VEN_8086&DEV_2668&SUBSYS_11001AF4&REV_01\18)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928BF880 (PCI\VEN_1AF4&DEV_1003&SUBSYS_00031AF4&REV_00\20)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928BEB30 (PCI\VEN_1B36&DEV_0100&SUBSYS_11001AF4&REV_04\28)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928BAC60 (PCI\VEN_10EC&DEV_8139&SUBSYS_11001AF4&REV_20\30)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928B6C60 (PCI\VEN_8086&DEV_2922&SUBSYS_11001AF4&REV_02\38)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928B5C60 (PCI\VEN_8086&DEV_2934&SUBSYS_11001AF4&REV_03\E8)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928B5880 (PCI\VEN_8086&DEV_2935&SUBSYS_11001AF4&REV_03\E9)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928B49F0 (PCI\VEN_8086&DEV_2936&SUBSYS_11001AF4&REV_03\EA)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928B3B30 (PCI\VEN_8086&DEV_293A&SUBSYS_11001AF4&REV_03\EF)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE000928ABC60 (ACPI\PNP0103\0)
xen_platform_log xen platform: XENFILT|DriverSetFilterState: ACTIVE DEVICE PRESENT
xen_platform_log xen platform: UNPLUG: PRE-AMBLE (DRIVERS NOT BLACKLISTED)
xen_platform_log xen platform: UNPLUG: DISKS
xen_platform_log xen platform: UNPLUG: NICS
xen_platform_log xen platform: XENFILT|DriverSetFilterState: PENDING
xen_platform_log xen platform: XENFILT|PdoDestroy: FFFFE000928BAC60 (PCI\VEN_10EC&DEV_8139&SUBSYS_11001AF4&REV_20\30) (device disappeared)
xen_platform_log xen platform: XENFILT|DriverSetFilterState: DISABLED
xen_platform_log xen platform: XENBUS|DriverEntry: 8.2.0 (80) (17.09.2015)
xen_platform_log xen platform: XENFILT|PdoQueryInterface: PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10: PVDEVICE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|FdoSetFriendlyName: Xen PV Bus (0001)
xen_platform_log xen platform: XENBUS|FdoCreate: FFFFE000928D5490 (XP0001 XENBUS) [ACTIVE]
xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFE000923F2E98: Shared LevelSensitive CPU 0:0 VECTOR b1
xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFE000923F29C8: DeviceExclusive Latched CPU 0:0 VECTOR 50
xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFE000923EECA8: DeviceExclusive Latched CPU 0:1 VECTOR 50
xen_platform_log xen platform: XENBUS|FdoScan: ====>
xen_platform_log xen platform: XENBUS|FdoCreateIoSpace: 00000000.f8000000 - 00000000.f8ffffff
xen_platform_log xen platform: XENBUS|FdoSuspend: ====>
xen_platform_log xen platform: XEN|HvmSetParam: fail1 (c0000022)
xen_platform_log xen platform: XENBUS|FdoBalloon: ====>
xen_platform_log xen platform: SHARED_INFO: MAP XENMAPSPACE_shared_info @ 00000000.f8000000
xen_platform_log xen platform: EVTCHN_FIFO: CONTROLBLOCK[0] @ 00000000.00f50000
xen_platform_log xen platform: EVTCHN_FIFO: CONTROLBLOCK[1] @ 00000000.011d1000
xen_platform_log xen platform: XENBUS|EvtchnAbiAcquire: FIFO
xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CPU 0:0 (Vector = 80)
xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CPU 0:1 (Vector = 80)
xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CALLBACK VIA (Vector = 24)
xen_platform_log xen platform: STORE: PAGE @ 00000000.feffc000
xen_platform_log xen platform: STORE: EVTCHN 1
xen_platform_log xen platform: EVTCHN_FIFO: EVENTARRAY[0] @ 00000000.00952000
xen_platform_log xen platform: XENBUS|EvtchnFifoExpand: added ports [00000000 - 000003ff]
xen_platform_log xen platform: XENBUS|PdoCreate: FFFFE000928D2D40 (VBD)
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 08000009 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000A -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000B -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v2 RANGE_SET v1 CACHE v1 GNTTAB v2 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoCreate: FFFFE000928D2A20 (VIF)
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 08000009 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000A -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000B -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v2 RANGE_SET v1 CACHE v1 GNTTAB v2 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoCreate: FFFFE000928D1D40 (IFACE)
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 08000009 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000A -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000B -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v2 RANGE_SET v1 CACHE v1 GNTTAB v2 UNPLUG v1 EMULATED v1
xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE00092993040 (PCIIDE\IDEChannel\0)
xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE00092993430 (PCIIDE\IDEChannel\1)
xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE0009298E040 (IDE\CdRomQEMU_QEMU_DVD-ROM_______________________2.2.____\0.1.0)
xen_platform_log xen platform: XENVBD|DriverEntry:8.2.0.35 (9/9/2015)
xen_platform_log xen platform: XENVBD|__DriverParseParameterKey:DriverParameters: 
xen_platform_log xen platform: XENDISK|DriverEntry:XENDISK 8.2.0 (35) (09.09.2015)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: BUS_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENDISK|FdoCreate:FFFFE00092980CE0
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000929DA050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000929DA050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000929DA050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000929DA050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000929DA050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: BUS_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000929DA050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000929DA050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: BUS_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Version = 0
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Master = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: ScatterGather = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DemandMode = FALSE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: AutoInitialize = FALSE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Dma32BitAddresses = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: IgnoreCount = FALSE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Dma64BitAddresses = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: BusNumber = 00000000
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaChannel = ffffffff
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: InterfaceType = Internal
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaWidth = 8Bits
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaSpeed = Compatible
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: MaximumLength = 000b0000
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaPort = ffffffff
xen_platform_log xen platform: XENVBD|DispatchPnp:DeviceObject 0xFFFFE000929DA050 is not FDO (0x0000000000000000) or a PDO
xen_platform_log xen platform: XENBUS|DmaGetAdapter: no interception
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: STORE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: EVTCHN_INTERFACE (VERSION 4)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: GNTTAB_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: SUSPEND_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: DEBUG_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: UNPLUG_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VBD: EMULATED_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENFILT|PdoQueryInterface: PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10: EMULATED_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|UnplugRequest: DISKS (MAKE)
xen_platform_log xen platform: XEN|UnplugIncrementValue: DISKS 1
xen_platform_log xen platform: XENVBD|__FdoSetDevicePowerState:POWER D3 to D0
xen_platform_log xen platform: XENVBD|__FdoD3ToD0:D3->D0
xen_platform_log xen platform: XENVBD|__FdoIsPdoUnplugged:Target[0] : (vbd/768) Emulated NOT_PRESENT
xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] : Creating (PV)
xen_platform_log xen platform: XENVBD|PdoSetDevicePowerState:Target[0] : POWER D3 to D0
xen_platform_log xen platform: XENVBD|PdoD3ToD0:Target[0] : D3->D0 (PV)
xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] : INITIALIZED ----> ENABLED
xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] : in state CLOSED
xen_platform_log xen platform: XENVBD|FrontendWriteUsage:Target[0] : NOT_DUMP NOT_HIBER NOT_PAGE
xen_platform_log xen platform: XENVBD|PdoReadInquiryData:Target[0] : Failed to get Page80 data
xen_platform_log xen platform: XENVBD|PdoReadInquiryData:Target[0] : Failed to get Page83 data
xen_platform_log xen platform: XENVBD|PdoUpdateInquiryData:Target[0] : VDI-UUID = {00000000-0000-0000-0000-000000000000}
xen_platform_log xen platform: XENVBD|FrontendPrepare:Target[0] : BackendId 0 (/local/domain/0/backend/vbd/5/768)
xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] : in state PREPARED
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[0] @ 00000000.f8001000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00000020 - 000001ff]
xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] : 104857600 sectors of 512 bytes (512)
xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] : 50 GB (00000000) 
xen_platform_log xen platform: XENVBD|FrontendReadDiskInfo:Target[0] : Features: BARRIER FLUSH DISCARD 
xen_platform_log xen platform: XENVBD|FrontendReadDiskInfo:Target[0] : DISCARD 0/1000
xen_platform_log xen platform: XENVBD|FrontendReadFeatures:Target[0] : Features: PERSISTENT INDIRECT 
xen_platform_log xen platform: XENVBD|FrontendReadFeatures:Target[0] : INDIRECT 100
xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] : in state CONNECTED
xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] : in state ENABLED
xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] : Created (PV)
xen_platform_log xen platform: XENVBD|FdoLogTargets:ScanThread ===>
xen_platform_log xen platform: XENVBD|FdoLogTargets:ScanThread : Target[0] = 0xFFFFE000919F2290 (present)
xen_platform_log xen platform: XENVBD|FdoLogTargets:ScanThread <===
xen_platform_log xen platform: XENVBD|FdoDispatchPnp:14:QUERY_PNP_DEVICE_STATE -> c00000bb
xen_platform_log xen platform: XENVBD|__HandlePage83:Target[0] : INQUIRY Using Fake Page83 Data
xen_platform_log xen platform: XENVBD|__HandlePage80:Target[0] : INQUIRY Using Fake Page80 Data
xen_platform_log xen platform: XENDISK|PdoCreate:FFFFE000929FEDF0
xen_platform_log xen platform: XENVBD|PdoSetDeviceObject:Target[0] : Setting DeviceObject = 0xFFFFE000929FC060
xen_platform_log xen platform: XENVBD|FdoMapDeviceObjectToPdo:0xFFFFE000929FC060 --> Target 0 (000000)
xen_platform_log xen platform: XENVBD|PdoDispatchPnp:Target[0] : 13:QUERY_ID -> c00000bb
xen_platform_log xen platform: XENVBD|PdoDispatchPnp:Target[0] : 08:QUERY_INTERFACE -> c00000bb
xen_platform_log xen platform: XENVBD|PdoDispatchPnp:Target[0] : 15:QUERY_BUS_INFORMATION -> c00000bb
xen_platform_log xen platform: XENVBD|PdoDispatchPnp:Target[0] : 19:UNKNOWN -> c00000bb
xen_platform_log xen platform: XENVBD|PdoDispatchPnp:Target[0] : 18:UNKNOWN -> c00000bb
xen_platform_log xen platform: XENVBD|PdoDispatchPnp:Target[0] : 0d:FILTER_RESOURCE_REQUIREMENTS -> c00000bb
xen_platform_log xen platform: XENVBD|PdoSetDevicePnpState:Target[0] : PNP Present to Started
xen_platform_log xen platform: XENVBD|PdoDispatchPnp:Target[0] : 08:QUERY_INTERFACE -> c00000bb
xen_platform_log xen platform: XENVBD|PdoDispatchPnp:Target[0] : 08:QUERY_INTERFACE -> c00000bb
xen_platform_log xen platform: XENVBD|PdoDispatchPnp:Target[0] : 07:QUERY_DEVICE_RELATIONS -> c00000bb
xen_platform_log xen platform: XENVBD|FrontendWriteUsage:Target[0] : DUMP NOT_HIBER NOT_PAGE
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENVBD|FdoDispatchPnp:14:QUERY_PNP_DEVICE_STATE -> c00000bb
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[1] @ 00000000.f8002000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00000200 - 000003ff]
xen_platform_log xen platform: XENVIF|DriverEntry: XENVIF 8.2.0 (49) (24.09.2015)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: BUS_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: DEBUG_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: SUSPEND_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: EVTCHN_INTERFACE (VERSION 4)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: STORE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: RANGE_SET_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: CACHE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: GNTTAB_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: UNPLUG_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENVIF|FdoCreate: FFFFE00092E97780 (XP0001 XENVIF)
xen_platform_log xen platform: XENIFACE|DriverEntry: 8.2.0.21 (9/9/2015)
xen_platform_log xen platform: XENIFACE|ThreadCreate: Create thread FFFFF8015C6D7E8C FFFFE00092ECFD90
xen_platform_log xen platform: XENIFACE|ThreadCreate: Create thread FFFFF8015C6D6DD4 FFFFE00092ECFDA0
xen_platform_log xen platform: XENBUS|PdoQueryInterface: IFACE: SUSPEND_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: IFACE: SHARED_INFO_INTERFACE (VERSION 2)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: IFACE: STORE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENIFACE|FdoInitialiseXSRegistryEntries: no such xenstore key
xen_platform_log xen platform: XENIFACE|FdoInitialiseXSRegistryEntries: Failed to initialise registry (c0000022)
xen_platform_log xen platform: XENIFACE|ThreadCreate: Create thread FFFFF8015C6D7968 FFFFE00092ECFFB8
xen_platform_log xen platform: XENIFACE|FdoCreate: FFFFE00092ABF840 (IFACE)
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[2] @ 00000000.f8003000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00000400 - 000005ff]
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[3] @ 00000000.f8004000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00000600 - 000007ff]
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[4] @ 00000000.f8005000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00000800 - 000009ff]
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[5] @ 00000000.f8006000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00000a00 - 00000bff]
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[6] @ 00000000.f8007000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00000c00 - 00000dff]
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[7] @ 00000000.f8008000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00000e00 - 00000fff]
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[8] @ 00000000.f8009000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00001000 - 000011ff]
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[9] @ 00000000.f800a000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00001200 - 000013ff]
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[10] @ 00000000.f800b000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00001400 - 000015ff]
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[11] @ 00000000.f800c000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00001600 - 000017ff]
xen_platform_log xen platform: XENVIF|__PdoSetPermanentAddress: 0: 00:16:3e:fe:7a:b9
xen_platform_log xen platform: XENVIF|__PdoSetContainerID: 0 {ca136717-12c6-5b65-881e-334b6ab03532}
xen_platform_log xen platform: XENVIF|FrontendSetMaxQueues: device/vif/0: 2
xen_platform_log xen platform: XENVIF|PdoCreate: FFFFE0009325FD40 (0)
xen_platform_log xen platform: XENVIF|PdoDumpRevisions: 08000002 -> CACHE v1 VIF v2
xen_platform_log xen platform: XENVIF|PdoDumpRevisions: 08000003 -> CACHE v1 VIF v3
xen_platform_log xen platform: XENNET|DriverEntry: XENNET 8.2.0 (31) (17.09.2015)
xen_platform_log xen platform: XENIFACE|WmiInit: DRV: XenIface WMI Initialisation
xen_platform_log xen platform: XENBUS|UnplugRequest: NICS (MAKE)
xen_platform_log xen platform: XEN|UnplugIncrementValue: NICS 1
xen_platform_log xen platform: XENVIF|PdoSetFriendlyName: Xen PV Network Device #0
xen_platform_log xen platform: XENVIF|__MacSetPermanentAddress: data/vif/0: 00:16:3E:FE:7A:B9
xen_platform_log xen platform: XENVIF|__MacSetCurrentAddress: data/vif/0: 00:16:3E:FE:7A:B9
xen_platform_log xen platform: XENVIF|FrontendSetNumQueues: device/vif/0: 2
xen_platform_log xen platform: XENBUS|EvtchnBind: [9]: CPU 0:1
xen_platform_log xen platform: XENBUS|EvtchnBind: [11]: CPU 0:1
xen_platform_log xen platform: XENVIF|PdoQueryInterface: 0: VIF_INTERFACE (VERSION 3)
xen_platform_log xen platform: XENVIF|PdoQueryInterface: 0: CACHE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|PdoQueryInterface: VIF: CACHE_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: Checksum.IPv4Receive.IpChecksum ON
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: Checksum.IPv4Receive.TcpChecksum ON
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: Checksum.IPv4Receive.UdpChecksum ON
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: Checksum.IPv6Receive.TcpChecksum ON
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: Checksum.IPv6Receive.UdpChecksum ON
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: Checksum.IPv4Transmit.IpChecksum ON
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: Checksum.IPv4Transmit.TcpChecksum ON
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: Checksum.IPv4Transmit.UdpChecksum ON
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: Checksum.IPv6Transmit.TcpChecksum ON
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: Checksum.IPv6Transmit.UdpChecksum ON
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: LsoV2.IPv4.MaxOffLoadSize = 65201
xen_platform_log xen platform: XENNET|AdapterSetOffloadAttributes: LsoV2.IPv6.MaxOffLoadSize = 65201
xen_platform_log xen platform: XENVIF|PdoQueryInterface: 0: BUS_INTERFACE (VERSION 1)
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Version = 2
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Master = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: ScatterGather = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DemandMode = FALSE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: AutoInitialize = FALSE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Dma32BitAddresses = FALSE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: IgnoreCount = FALSE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: Dma64BitAddresses = TRUE
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: BusNumber = 00000000
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaChannel = 00000000
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: InterfaceType = Internal
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaWidth = 8Bits
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaSpeed = Compatible
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: MaximumLength = 00020000
xen_platform_log xen platform: XENBUS|DmaDumpDeviceDescription: DmaPort = 00000000
xen_platform_log xen platform: XENBUS|DmaGetAdapter: no interception
xen_platform_log xen platform: XENBUS|RangeSetPop: fail1 (c000009a)
xen_platform_log xen platform: GNTTAB: MAP XENMAPSPACE_grant_table[12] @ 00000000.f800d000
xen_platform_log xen platform: XENBUS|GnttabExpand: added references [00001800 - 000019ff]
xen_platform_log xen platform: XENNET|AdapterMediaStateChange: LINK: UP: SPEED=1000000000 DUPLEX=FULL
xen_platform_log xen platform: XENVBD|FrontendWriteUsage:Target[0] : NOT_DUMP NOT_HIBER NOT_PAGE
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENVBD|FdoDispatchPnp:14:QUERY_PNP_DEVICE_STATE -> c00000bb
xen_platform_log xen platform: XENVBD|FrontendWriteUsage:Target[0] : NOT_DUMP NOT_HIBER PAGE
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENVBD|FdoDispatchPnp:14:QUERY_PNP_DEVICE_STATE -> c00000bb
xen_platform_log xen platform: XENVBD|FrontendWriteUsage:Target[0] : DUMP NOT_HIBER PAGE
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENVBD|FdoDispatchPnp:14:QUERY_PNP_DEVICE_STATE -> c00000bb
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENBUS|FdoQueryPnpDeviceState: XP0001 XENBUS: not disableable
xen_platform_log xen platform: XENVBD|FdoDispatchPnp:14:QUERY_PNP_DEVICE_STATE -> c00000bb
(/usr/sbin/xl:3654): SpiceWorker-Warning **: red_worker.c:163:rendering_incorrect: rendering incorrect from now on: get_drawable
(/usr/sbin/xl:3654): SpiceWorker-Warning **: red_worker.c:163:rendering_incorrect: rendering incorrect from now on: failed to get_drawable
xen_platform_log xen platform: XENNET|AdapterSetInformation: UNSUPPORTED OID 00010118
xen_platform_log xen platform: XENNET|AdapterSetInformation: UNSUPPORTED OID 00010118
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Guest agent lite main loop starting
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Set time to XenTime
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: hosttimeIsUTC: Open Registry Key
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Time is now  2015.10.12 17:16:44.604
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Set time to 2015.10.12 17:16:45.814
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: About to add feature shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Establish watch control/shutdown
main_channel_link: add main channel client
xen_platform_log xen platform: XENIFACE|StartWatch: Start Watch FFFFE00093E7ECD0
main_channel_handle_parsed: agent start
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: About to advertise features
main_channel_handle_parsed: net test: latency 8.355000 ms, bitrate 627066748 bps (598.017452 Mbps)
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: WmiSessionSetEntry:MethodExec Failed
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: WmiSessionSetEntry:SessionStart Failed
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: WmiSessionSetEntry:SetVValue Failed
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: WmiSessionSetEntry:SetVPath Failed 
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Failed to advertise shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: About to kick xapi 
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: win agent going to sleep
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: win agent woke up for 3
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Fire 00000011BE450080
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: fire feature shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: Check if we need to shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: No need to shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: fired feature shutdown
xen_platform_log xen platform: XENIFACE|SessionExecuteLog: USER: win agent going to sleep
inputs_connect: inputs channel client create
red_dispatcher_set_cursor_peer: 
main_channel_handle_parsed: agent start

--------------020102060503090903020002
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
--------------020102060503090903020002--


From win-pv-devel-bounces@lists.xenproject.org Tue Oct 13 09:46:00 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 13 Oct 2015 09:46:00 +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 1Zlw9f-0005bg-8s; Tue, 13 Oct 2015 09:45:59 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72140db33=Paul.Durrant@citrix.com>)
	id 1Zlw9d-0005bb-7f
	for win-pv-devel@lists.xenproject.org; Tue, 13 Oct 2015 09:45:58 +0000
Received: from [193.109.254.147] by server-9.bemta-14.messagelabs.com id
	11/25-26043-4D2DC165; Tue, 13 Oct 2015 09:45:56 +0000
X-Env-Sender: prvs=72140db33=Paul.Durrant@citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1444729554!39198592!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 5395 invoked from network); 13 Oct 2015 09:45:55 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2015 09:45:55 -0000
X-IronPort-AV: E=Sophos;i="5.17,677,1437436800"; 
   d="scan'208";a="5085909"
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] Network and disk pv not working on windows 10
	pro 64 bit with latest winpv build and xen 4.6.0
Thread-Index: AQHRBNh9Z00iIvSIsUy7w+yOqi9SPJ5nxWbQgAAXqACAAVDwcA==
Date: Tue, 13 Oct 2015 09:45:53 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F60DDED@AMSPEX01CL01.citrite.net>
References: <561B8AC1.9010900@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60C26F@AMSPEX01CL01.citrite.net>
	<561BD41E.5040302@m2r.biz>
In-Reply-To: <561BD41E.5040302@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
Cc: Stefano Stabellini <Stefano.Stabellini@citrix.com>
Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
 pro 64 bit with latest winpv build and xen 4.6.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

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Fabio Fantoni
> Sent: 12 October 2015 16:39
> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> Cc: Stefano Stabellini
> Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
> pro 64 bit with latest winpv build and xen 4.6.0
> 
> Il 12/10/2015 14:15, 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: 12 October 2015 11:26
> >> To: win-pv-devel@lists.xenproject.org
> >> Cc: Paul Durrant
> >> Subject: [win-pv-devel] Network and disk pv not working on windows 10
> pro
> >> 64 bit with latest winpv build and xen 4.6.0
> >>
> >> Dom0: Jessie (debian 8) 64 bit, kernel 3.16 from official repository,
> >> xen 4.6.0, other installation details here:
> >> ./configure --prefix=/usr --disable-blktap1 --disable-qemu-traditional
> >> --disable-rombios --with-system-seabios=/usr/share/seabios/bios-
> 256k.bin
> >> --with-extra-qemuu-configure-args="--enable-spice --enable-usb-redir"
> >> --disable-blktap2 --enable-systemd
> >> xen services enabled with:
> >> systemctl enable xenstored.service
> >> systemctl enable xenconsoled.service
> >> systemctl enable xen-init-dom0.service
> >> systemctl enable xen-qemu-dom0-disk-backend.service
> >> systemctl enable xendomains.service
> >>
> >> domU xl cfg:
> >> http://lists.xen.org/archives/html/xen-devel/2015-10/txtsAaP2yM2Vx.txt
> >>
> >> Still use emualted disk and network and xen pv network is unable to
> >> start for code 10 error (from windows devices manager). (see also
> >> screenshot in attachment)
> >>
> >> In attachment full qemu log with xen_platform trace.
> >>
> > xen_platform_log xen platform: XENVIF|SettingsSave: FROM Ethernet
> (Realtek RTL8139C+ Fast Ethernet NIC)
> > xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
> Version4: ADDRESSES NOT FOUND
> > xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
> Version6: ADDRESSES NOT FOUND
> > xen_platform_log xen platform: XENVIF|DriverRequestReboot: <===>
> > xen_platform_log xen platform: XENVIF|PdoStartDevice: fail7
> > xen_platform_log xen platform: XENVIF|PdoStartDevice: fail6
> > xen_platform_log xen platform: XENVIF|PdoStartDevice: fail5
> > xen_platform_log xen platform: XENVIF|PdoStartDevice: fail4
> > xen_platform_log xen platform: XENVIF|PdoStartDevice: fail3
> > xen_platform_log xen platform: XENVIF|PdoStartDevice: fail2
> > xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1 (c0000001)
> > xen_platform_log xen platform: XENNET|DriverUnload: XENNET 8.2.0 (31)
> (17.09.2015)
> >
> > That means you have not rebooted to allow the emulated device to be
> unplugged. Other versions of Windows will prompt for the reboot but
> Microsoft broke the class installer in Windows 10 so it won't.
> >
> >    Paul
> 
> Thanks for reply.
> I already did a windows reboot after pv install but after doing another
> seem ok.
> Remain the dubt with ahci, I saw both emulated and pv ok in windows
> devices manager and I not understand if a changes is needed for ahci
> qemu side as Stefano Stabellini told.
> Can you take a look to this new qemu log please? Is ok or with ahci disk
> is not pv correctly?
> 

The log shows:

xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] : 104857600 sectors of 512 bytes (512)
xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] : 50 GB (00000000) 
xen_platform_log xen platform: XENVBD|FrontendReadDiskInfo:Target[0] : Features: BARRIER FLUSH DISCARD 
xen_platform_log xen platform: XENVBD|FrontendReadDiskInfo:Target[0] : DISCARD 0/1000
xen_platform_log xen platform: XENVBD|FrontendReadFeatures:Target[0] : Features: PERSISTENT INDIRECT 
xen_platform_log xen platform: XENVBD|FrontendReadFeatures:Target[0] : INDIRECT 100
xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] : in state CONNECTED
xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] : in state ENABLED
xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] : Created (PV)

That last line says you have a functioning PV disk.

  Paul

> If you need more information and/or test tell me and I'l 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 Oct 13 09:46:00 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 13 Oct 2015 09:46:00 +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 1Zlw9f-0005bg-8s; Tue, 13 Oct 2015 09:45:59 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72140db33=Paul.Durrant@citrix.com>)
	id 1Zlw9d-0005bb-7f
	for win-pv-devel@lists.xenproject.org; Tue, 13 Oct 2015 09:45:58 +0000
Received: from [193.109.254.147] by server-9.bemta-14.messagelabs.com id
	11/25-26043-4D2DC165; Tue, 13 Oct 2015 09:45:56 +0000
X-Env-Sender: prvs=72140db33=Paul.Durrant@citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1444729554!39198592!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 5395 invoked from network); 13 Oct 2015 09:45:55 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2015 09:45:55 -0000
X-IronPort-AV: E=Sophos;i="5.17,677,1437436800"; 
   d="scan'208";a="5085909"
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] Network and disk pv not working on windows 10
	pro 64 bit with latest winpv build and xen 4.6.0
Thread-Index: AQHRBNh9Z00iIvSIsUy7w+yOqi9SPJ5nxWbQgAAXqACAAVDwcA==
Date: Tue, 13 Oct 2015 09:45:53 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F60DDED@AMSPEX01CL01.citrite.net>
References: <561B8AC1.9010900@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60C26F@AMSPEX01CL01.citrite.net>
	<561BD41E.5040302@m2r.biz>
In-Reply-To: <561BD41E.5040302@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
Cc: Stefano Stabellini <Stefano.Stabellini@citrix.com>
Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
 pro 64 bit with latest winpv build and xen 4.6.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

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Fabio Fantoni
> Sent: 12 October 2015 16:39
> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> Cc: Stefano Stabellini
> Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
> pro 64 bit with latest winpv build and xen 4.6.0
> 
> Il 12/10/2015 14:15, 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: 12 October 2015 11:26
> >> To: win-pv-devel@lists.xenproject.org
> >> Cc: Paul Durrant
> >> Subject: [win-pv-devel] Network and disk pv not working on windows 10
> pro
> >> 64 bit with latest winpv build and xen 4.6.0
> >>
> >> Dom0: Jessie (debian 8) 64 bit, kernel 3.16 from official repository,
> >> xen 4.6.0, other installation details here:
> >> ./configure --prefix=/usr --disable-blktap1 --disable-qemu-traditional
> >> --disable-rombios --with-system-seabios=/usr/share/seabios/bios-
> 256k.bin
> >> --with-extra-qemuu-configure-args="--enable-spice --enable-usb-redir"
> >> --disable-blktap2 --enable-systemd
> >> xen services enabled with:
> >> systemctl enable xenstored.service
> >> systemctl enable xenconsoled.service
> >> systemctl enable xen-init-dom0.service
> >> systemctl enable xen-qemu-dom0-disk-backend.service
> >> systemctl enable xendomains.service
> >>
> >> domU xl cfg:
> >> http://lists.xen.org/archives/html/xen-devel/2015-10/txtsAaP2yM2Vx.txt
> >>
> >> Still use emualted disk and network and xen pv network is unable to
> >> start for code 10 error (from windows devices manager). (see also
> >> screenshot in attachment)
> >>
> >> In attachment full qemu log with xen_platform trace.
> >>
> > xen_platform_log xen platform: XENVIF|SettingsSave: FROM Ethernet
> (Realtek RTL8139C+ Fast Ethernet NIC)
> > xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
> Version4: ADDRESSES NOT FOUND
> > xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
> Version6: ADDRESSES NOT FOUND
> > xen_platform_log xen platform: XENVIF|DriverRequestReboot: <===>
> > xen_platform_log xen platform: XENVIF|PdoStartDevice: fail7
> > xen_platform_log xen platform: XENVIF|PdoStartDevice: fail6
> > xen_platform_log xen platform: XENVIF|PdoStartDevice: fail5
> > xen_platform_log xen platform: XENVIF|PdoStartDevice: fail4
> > xen_platform_log xen platform: XENVIF|PdoStartDevice: fail3
> > xen_platform_log xen platform: XENVIF|PdoStartDevice: fail2
> > xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1 (c0000001)
> > xen_platform_log xen platform: XENNET|DriverUnload: XENNET 8.2.0 (31)
> (17.09.2015)
> >
> > That means you have not rebooted to allow the emulated device to be
> unplugged. Other versions of Windows will prompt for the reboot but
> Microsoft broke the class installer in Windows 10 so it won't.
> >
> >    Paul
> 
> Thanks for reply.
> I already did a windows reboot after pv install but after doing another
> seem ok.
> Remain the dubt with ahci, I saw both emulated and pv ok in windows
> devices manager and I not understand if a changes is needed for ahci
> qemu side as Stefano Stabellini told.
> Can you take a look to this new qemu log please? Is ok or with ahci disk
> is not pv correctly?
> 

The log shows:

xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] : 104857600 sectors of 512 bytes (512)
xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] : 50 GB (00000000) 
xen_platform_log xen platform: XENVBD|FrontendReadDiskInfo:Target[0] : Features: BARRIER FLUSH DISCARD 
xen_platform_log xen platform: XENVBD|FrontendReadDiskInfo:Target[0] : DISCARD 0/1000
xen_platform_log xen platform: XENVBD|FrontendReadFeatures:Target[0] : Features: PERSISTENT INDIRECT 
xen_platform_log xen platform: XENVBD|FrontendReadFeatures:Target[0] : INDIRECT 100
xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] : in state CONNECTED
xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] : in state ENABLED
xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] : Created (PV)

That last line says you have a functioning PV disk.

  Paul

> If you need more information and/or test tell me and I'l 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 Oct 13 13:20:43 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 13 Oct 2015 13:20: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 1ZlzVR-0006ab-Rd; Tue, 13 Oct 2015 13:20:41 +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 1ZlzVQ-0006aH-79
	for win-pv-devel@lists.xenproject.org; Tue, 13 Oct 2015 13:20:40 +0000
Received: from [193.109.254.147] by server-8.bemta-14.messagelabs.com id
	1D/D4-19110-7250D165; Tue, 13 Oct 2015 13:20:39 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-8.tower-27.messagelabs.com!1444742437!19180645!1
X-Originating-IP: [209.85.217.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 21551 invoked from network); 13 Oct 2015 13:20:38 -0000
Received: from mail-lb0-f182.google.com (HELO mail-lb0-f182.google.com)
	(209.85.217.182)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2015 13:20:38 -0000
Received: by lbcao8 with SMTP id ao8so19670975lbc.3
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 13 Oct 2015 06:20:37 -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:cc:from:message-id:date
	:user-agent:mime-version:in-reply-to:content-type
	:content-transfer-encoding;
	bh=qQQwY6r3PJwN92oNqFpgeHlfvH3ct9Ye4BDyP+bjZ14=;
	b=jsIFBnmbnrORuvGk8PsOUU/twcAV3oEfRYQc5RRCy2hrLvs3j3vQAbAOOnwBSUTfFp
	8Tl8YcEnslLrnodLd2FWQTwnEwt/nEwQjFCA6cZ83Ichnj3Fk7dAOMphF6/JHro0w+nU
	aRASsbsKZkHqRSRIzvpzk/c97Vm9WR8FmhhRPoK7SHgWRpTwvxV5HXujexIreYLdeBbq
	9mnoyZXRIOsPP+RA2piG9u7XxO7XOuuNzjF1mDVNIJdjwpohHMJaylRfNh1jYJan8bQY
	xdjM368kA7HTtSG7zkfE2/ekn7JryRt13s4Kk5R4YCryws4zZLc4YchfnxEX4Ykujyg+
	m/Dg==
X-Gm-Message-State: ALoCoQmGHiVBSdRB9G8wTI6tvVU2VegfITJvC2SOWcFv59sMFIRwBTGmZ1XaEDe7PJg4dgjJisyV
X-Received: by 10.25.145.132 with SMTP id t126mr9955236lfd.88.1444742437361;
	Tue, 13 Oct 2015 06:20:37 -0700 (PDT)
Received: from [192.168.178.34] ([95.233.12.243])
	by smtp.googlemail.com with ESMTPSA id
	c6sm522441lbp.2.2015.10.13.06.20.35
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 13 Oct 2015 06:20:36 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <561B8AC1.9010900@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60C26F@AMSPEX01CL01.citrite.net>
	<561BD41E.5040302@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60DDED@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <561D0522.4090807@m2r.biz>
Date: Tue, 13 Oct 2015 15:20:34 +0200
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
	Thunderbird/38.2.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F60DDED@AMSPEX01CL01.citrite.net>
Cc: Stefano Stabellini <Stefano.Stabellini@citrix.com>
Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
 pro 64 bit with latest winpv build and xen 4.6.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-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/10/2015 11:45, 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: 12 October 2015 16:39
>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
>> Cc: Stefano Stabellini
>> Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
>> pro 64 bit with latest winpv build and xen 4.6.0
>>
>> Il 12/10/2015 14:15, 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: 12 October 2015 11:26
>>>> To: win-pv-devel@lists.xenproject.org
>>>> Cc: Paul Durrant
>>>> Subject: [win-pv-devel] Network and disk pv not working on windows 10
>> pro
>>>> 64 bit with latest winpv build and xen 4.6.0
>>>>
>>>> Dom0: Jessie (debian 8) 64 bit, kernel 3.16 from official repository,
>>>> xen 4.6.0, other installation details here:
>>>> ./configure --prefix=/usr --disable-blktap1 --disable-qemu-traditional
>>>> --disable-rombios --with-system-seabios=/usr/share/seabios/bios-
>> 256k.bin
>>>> --with-extra-qemuu-configure-args="--enable-spice --enable-usb-redir"
>>>> --disable-blktap2 --enable-systemd
>>>> xen services enabled with:
>>>> systemctl enable xenstored.service
>>>> systemctl enable xenconsoled.service
>>>> systemctl enable xen-init-dom0.service
>>>> systemctl enable xen-qemu-dom0-disk-backend.service
>>>> systemctl enable xendomains.service
>>>>
>>>> domU xl cfg:
>>>> http://lists.xen.org/archives/html/xen-devel/2015-10/txtsAaP2yM2Vx.txt
>>>>
>>>> Still use emualted disk and network and xen pv network is unable to
>>>> start for code 10 error (from windows devices manager). (see also
>>>> screenshot in attachment)
>>>>
>>>> In attachment full qemu log with xen_platform trace.
>>>>
>>> xen_platform_log xen platform: XENVIF|SettingsSave: FROM Ethernet
>> (Realtek RTL8139C+ Fast Ethernet NIC)
>>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
>> Version4: ADDRESSES NOT FOUND
>>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
>> Version6: ADDRESSES NOT FOUND
>>> xen_platform_log xen platform: XENVIF|DriverRequestReboot: <===>
>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail7
>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail6
>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail5
>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail4
>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail3
>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail2
>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1 (c0000001)
>>> xen_platform_log xen platform: XENNET|DriverUnload: XENNET 8.2.0 (31)
>> (17.09.2015)
>>> That means you have not rebooted to allow the emulated device to be
>> unplugged. Other versions of Windows will prompt for the reboot but
>> Microsoft broke the class installer in Windows 10 so it won't.
>>>     Paul
>> Thanks for reply.
>> I already did a windows reboot after pv install but after doing another
>> seem ok.
>> Remain the dubt with ahci, I saw both emulated and pv ok in windows
>> devices manager and I not understand if a changes is needed for ahci
>> qemu side as Stefano Stabellini told.
>> Can you take a look to this new qemu log please? Is ok or with ahci disk
>> is not pv correctly?
>>
> The log shows:
>
> xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] : 104857600 sectors of 512 bytes (512)
> xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] : 50 GB (00000000)
> xen_platform_log xen platform: XENVBD|FrontendReadDiskInfo:Target[0] : Features: BARRIER FLUSH DISCARD
> xen_platform_log xen platform: XENVBD|FrontendReadDiskInfo:Target[0] : DISCARD 0/1000
> xen_platform_log xen platform: XENVBD|FrontendReadFeatures:Target[0] : Features: PERSISTENT INDIRECT
> xen_platform_log xen platform: XENVBD|FrontendReadFeatures:Target[0] : INDIRECT 100
> xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] : in state CONNECTED
> xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] : in state ENABLED
> xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] : Created (PV)
>
> That last line says you have a functioning PV disk.
>
>    Paul

Thanks for your reply.
So with ahci even if Windows sees also emulated one in device manager 
should properly use the pv?

>
>> If you need more information and/or test tell me and I'l 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 Oct 13 13:20:43 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 13 Oct 2015 13:20: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 1ZlzVR-0006ab-Rd; Tue, 13 Oct 2015 13:20:41 +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 1ZlzVQ-0006aH-79
	for win-pv-devel@lists.xenproject.org; Tue, 13 Oct 2015 13:20:40 +0000
Received: from [193.109.254.147] by server-8.bemta-14.messagelabs.com id
	1D/D4-19110-7250D165; Tue, 13 Oct 2015 13:20:39 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-8.tower-27.messagelabs.com!1444742437!19180645!1
X-Originating-IP: [209.85.217.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 21551 invoked from network); 13 Oct 2015 13:20:38 -0000
Received: from mail-lb0-f182.google.com (HELO mail-lb0-f182.google.com)
	(209.85.217.182)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2015 13:20:38 -0000
Received: by lbcao8 with SMTP id ao8so19670975lbc.3
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 13 Oct 2015 06:20:37 -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:cc:from:message-id:date
	:user-agent:mime-version:in-reply-to:content-type
	:content-transfer-encoding;
	bh=qQQwY6r3PJwN92oNqFpgeHlfvH3ct9Ye4BDyP+bjZ14=;
	b=jsIFBnmbnrORuvGk8PsOUU/twcAV3oEfRYQc5RRCy2hrLvs3j3vQAbAOOnwBSUTfFp
	8Tl8YcEnslLrnodLd2FWQTwnEwt/nEwQjFCA6cZ83Ichnj3Fk7dAOMphF6/JHro0w+nU
	aRASsbsKZkHqRSRIzvpzk/c97Vm9WR8FmhhRPoK7SHgWRpTwvxV5HXujexIreYLdeBbq
	9mnoyZXRIOsPP+RA2piG9u7XxO7XOuuNzjF1mDVNIJdjwpohHMJaylRfNh1jYJan8bQY
	xdjM368kA7HTtSG7zkfE2/ekn7JryRt13s4Kk5R4YCryws4zZLc4YchfnxEX4Ykujyg+
	m/Dg==
X-Gm-Message-State: ALoCoQmGHiVBSdRB9G8wTI6tvVU2VegfITJvC2SOWcFv59sMFIRwBTGmZ1XaEDe7PJg4dgjJisyV
X-Received: by 10.25.145.132 with SMTP id t126mr9955236lfd.88.1444742437361;
	Tue, 13 Oct 2015 06:20:37 -0700 (PDT)
Received: from [192.168.178.34] ([95.233.12.243])
	by smtp.googlemail.com with ESMTPSA id
	c6sm522441lbp.2.2015.10.13.06.20.35
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 13 Oct 2015 06:20:36 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <561B8AC1.9010900@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60C26F@AMSPEX01CL01.citrite.net>
	<561BD41E.5040302@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60DDED@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <561D0522.4090807@m2r.biz>
Date: Tue, 13 Oct 2015 15:20:34 +0200
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
	Thunderbird/38.2.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F60DDED@AMSPEX01CL01.citrite.net>
Cc: Stefano Stabellini <Stefano.Stabellini@citrix.com>
Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
 pro 64 bit with latest winpv build and xen 4.6.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-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/10/2015 11:45, 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: 12 October 2015 16:39
>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
>> Cc: Stefano Stabellini
>> Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
>> pro 64 bit with latest winpv build and xen 4.6.0
>>
>> Il 12/10/2015 14:15, 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: 12 October 2015 11:26
>>>> To: win-pv-devel@lists.xenproject.org
>>>> Cc: Paul Durrant
>>>> Subject: [win-pv-devel] Network and disk pv not working on windows 10
>> pro
>>>> 64 bit with latest winpv build and xen 4.6.0
>>>>
>>>> Dom0: Jessie (debian 8) 64 bit, kernel 3.16 from official repository,
>>>> xen 4.6.0, other installation details here:
>>>> ./configure --prefix=/usr --disable-blktap1 --disable-qemu-traditional
>>>> --disable-rombios --with-system-seabios=/usr/share/seabios/bios-
>> 256k.bin
>>>> --with-extra-qemuu-configure-args="--enable-spice --enable-usb-redir"
>>>> --disable-blktap2 --enable-systemd
>>>> xen services enabled with:
>>>> systemctl enable xenstored.service
>>>> systemctl enable xenconsoled.service
>>>> systemctl enable xen-init-dom0.service
>>>> systemctl enable xen-qemu-dom0-disk-backend.service
>>>> systemctl enable xendomains.service
>>>>
>>>> domU xl cfg:
>>>> http://lists.xen.org/archives/html/xen-devel/2015-10/txtsAaP2yM2Vx.txt
>>>>
>>>> Still use emualted disk and network and xen pv network is unable to
>>>> start for code 10 error (from windows devices manager). (see also
>>>> screenshot in attachment)
>>>>
>>>> In attachment full qemu log with xen_platform trace.
>>>>
>>> xen_platform_log xen platform: XENVIF|SettingsSave: FROM Ethernet
>> (Realtek RTL8139C+ Fast Ethernet NIC)
>>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
>> Version4: ADDRESSES NOT FOUND
>>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
>> Version6: ADDRESSES NOT FOUND
>>> xen_platform_log xen platform: XENVIF|DriverRequestReboot: <===>
>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail7
>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail6
>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail5
>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail4
>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail3
>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail2
>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1 (c0000001)
>>> xen_platform_log xen platform: XENNET|DriverUnload: XENNET 8.2.0 (31)
>> (17.09.2015)
>>> That means you have not rebooted to allow the emulated device to be
>> unplugged. Other versions of Windows will prompt for the reboot but
>> Microsoft broke the class installer in Windows 10 so it won't.
>>>     Paul
>> Thanks for reply.
>> I already did a windows reboot after pv install but after doing another
>> seem ok.
>> Remain the dubt with ahci, I saw both emulated and pv ok in windows
>> devices manager and I not understand if a changes is needed for ahci
>> qemu side as Stefano Stabellini told.
>> Can you take a look to this new qemu log please? Is ok or with ahci disk
>> is not pv correctly?
>>
> The log shows:
>
> xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] : 104857600 sectors of 512 bytes (512)
> xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] : 50 GB (00000000)
> xen_platform_log xen platform: XENVBD|FrontendReadDiskInfo:Target[0] : Features: BARRIER FLUSH DISCARD
> xen_platform_log xen platform: XENVBD|FrontendReadDiskInfo:Target[0] : DISCARD 0/1000
> xen_platform_log xen platform: XENVBD|FrontendReadFeatures:Target[0] : Features: PERSISTENT INDIRECT
> xen_platform_log xen platform: XENVBD|FrontendReadFeatures:Target[0] : INDIRECT 100
> xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] : in state CONNECTED
> xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] : in state ENABLED
> xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] : Created (PV)
>
> That last line says you have a functioning PV disk.
>
>    Paul

Thanks for your reply.
So with ahci even if Windows sees also emulated one in device manager 
should properly use the pv?

>
>> If you need more information and/or test tell me and I'l 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 Oct 13 13:39:49 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 13 Oct 2015 13:39:49 +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 1Zlznx-0000mm-0m; Tue, 13 Oct 2015 13:39:49 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72140db33=Paul.Durrant@citrix.com>)
	id 1Zlznv-0000mQ-UP
	for win-pv-devel@lists.xenproject.org; Tue, 13 Oct 2015 13:39:48 +0000
Received: from [85.158.139.211] by server-12.bemta-5.messagelabs.com id
	74/1C-19220-3A90D165; Tue, 13 Oct 2015 13:39:47 +0000
X-Env-Sender: prvs=72140db33=Paul.Durrant@citrix.com
X-Msg-Ref: server-11.tower-206.messagelabs.com!1444743586!37848503!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=1.7 required=7.0 tests=BIZ_TLD,received_headers: 
	No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17000 invoked from network); 13 Oct 2015 13:39:46 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-11.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2015 13:39:46 -0000
X-IronPort-AV: E=Sophos;i="5.17,678,1437436800"; 
   d="scan'208";a="5108486"
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] Network and disk pv not working on windows 10
	pro 64 bit with latest winpv build and xen 4.6.0
Thread-Index: AQHRBNh9Z00iIvSIsUy7w+yOqi9SPJ5nxWbQgAAXqACAAVDwcIAAGqsAgAAln6A=
Date: Tue, 13 Oct 2015 13:39:15 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F60E611@AMSPEX01CL01.citrite.net>
References: <561B8AC1.9010900@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60C26F@AMSPEX01CL01.citrite.net>
	<561BD41E.5040302@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60DDED@AMSPEX01CL01.citrite.net>
	<561D0522.4090807@m2r.biz>
In-Reply-To: <561D0522.4090807@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
Cc: Stefano Stabellini <Stefano.Stabellini@citrix.com>
Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
 pro 64 bit with latest winpv build and xen 4.6.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

> -----Original Message-----
> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
> Sent: 13 October 2015 14:21
> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> Cc: Stefano Stabellini
> Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
> pro 64 bit with latest winpv build and xen 4.6.0
> 
> 
> 
> Il 13/10/2015 11:45, 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: 12 October 2015 16:39
> >> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> >> Cc: Stefano Stabellini
> >> Subject: Re: [win-pv-devel] Network and disk pv not working on windows
> 10
> >> pro 64 bit with latest winpv build and xen 4.6.0
> >>
> >> Il 12/10/2015 14:15, 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: 12 October 2015 11:26
> >>>> To: win-pv-devel@lists.xenproject.org
> >>>> Cc: Paul Durrant
> >>>> Subject: [win-pv-devel] Network and disk pv not working on windows
> 10
> >> pro
> >>>> 64 bit with latest winpv build and xen 4.6.0
> >>>>
> >>>> Dom0: Jessie (debian 8) 64 bit, kernel 3.16 from official repository,
> >>>> xen 4.6.0, other installation details here:
> >>>> ./configure --prefix=/usr --disable-blktap1 --disable-qemu-traditional
> >>>> --disable-rombios --with-system-seabios=/usr/share/seabios/bios-
> >> 256k.bin
> >>>> --with-extra-qemuu-configure-args="--enable-spice --enable-usb-
> redir"
> >>>> --disable-blktap2 --enable-systemd
> >>>> xen services enabled with:
> >>>> systemctl enable xenstored.service
> >>>> systemctl enable xenconsoled.service
> >>>> systemctl enable xen-init-dom0.service
> >>>> systemctl enable xen-qemu-dom0-disk-backend.service
> >>>> systemctl enable xendomains.service
> >>>>
> >>>> domU xl cfg:
> >>>> http://lists.xen.org/archives/html/xen-devel/2015-
> 10/txtsAaP2yM2Vx.txt
> >>>>
> >>>> Still use emualted disk and network and xen pv network is unable to
> >>>> start for code 10 error (from windows devices manager). (see also
> >>>> screenshot in attachment)
> >>>>
> >>>> In attachment full qemu log with xen_platform trace.
> >>>>
> >>> xen_platform_log xen platform: XENVIF|SettingsSave: FROM Ethernet
> >> (Realtek RTL8139C+ Fast Ethernet NIC)
> >>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
> >> Version4: ADDRESSES NOT FOUND
> >>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
> >> Version6: ADDRESSES NOT FOUND
> >>> xen_platform_log xen platform: XENVIF|DriverRequestReboot: <===>
> >>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail7
> >>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail6
> >>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail5
> >>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail4
> >>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail3
> >>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail2
> >>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1
> (c0000001)
> >>> xen_platform_log xen platform: XENNET|DriverUnload: XENNET 8.2.0
> (31)
> >> (17.09.2015)
> >>> That means you have not rebooted to allow the emulated device to be
> >> unplugged. Other versions of Windows will prompt for the reboot but
> >> Microsoft broke the class installer in Windows 10 so it won't.
> >>>     Paul
> >> Thanks for reply.
> >> I already did a windows reboot after pv install but after doing another
> >> seem ok.
> >> Remain the dubt with ahci, I saw both emulated and pv ok in windows
> >> devices manager and I not understand if a changes is needed for ahci
> >> qemu side as Stefano Stabellini told.
> >> Can you take a look to this new qemu log please? Is ok or with ahci disk
> >> is not pv correctly?
> >>
> > The log shows:
> >
> > xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] :
> 104857600 sectors of 512 bytes (512)
> > xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] : 50 GB
> (00000000)
> > xen_platform_log xen platform: XENVBD|FrontendReadDiskInfo:Target[0]
> : Features: BARRIER FLUSH DISCARD
> > xen_platform_log xen platform: XENVBD|FrontendReadDiskInfo:Target[0]
> : DISCARD 0/1000
> > xen_platform_log xen platform: XENVBD|FrontendReadFeatures:Target[0]
> : Features: PERSISTENT INDIRECT
> > xen_platform_log xen platform: XENVBD|FrontendReadFeatures:Target[0]
> : INDIRECT 100
> > xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] :
> in state CONNECTED
> > xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] :
> in state ENABLED
> > xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] : Created
> (PV)
> >
> > That last line says you have a functioning PV disk.
> >
> >    Paul
> 
> Thanks for your reply.
> So with ahci even if Windows sees also emulated one in device manager
> should properly use the pv?
> 

XENFILT is installed as a filter on the IDE channel class in Windows so that it can make sure that, in the event of an emulated disk being present in the VM, the PV device does not come online... otherwise you've got two disks in the VM referencing the same storage and you'll get data corruption pretty quickly.
So, if you use AHCI, I'm not convinced that:

a) The emulated device unplug code in QEMU will actually unplug the emulated AHCI disk
b) XENFILT will spot the problem

Hence, if you see any corruption of the VMs disks I would not be surprised.

  Paul

> >
> >> If you need more information and/or test tell me and I'l 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 Oct 13 13:39:49 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 13 Oct 2015 13:39:49 +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 1Zlznx-0000mm-0m; Tue, 13 Oct 2015 13:39:49 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72140db33=Paul.Durrant@citrix.com>)
	id 1Zlznv-0000mQ-UP
	for win-pv-devel@lists.xenproject.org; Tue, 13 Oct 2015 13:39:48 +0000
Received: from [85.158.139.211] by server-12.bemta-5.messagelabs.com id
	74/1C-19220-3A90D165; Tue, 13 Oct 2015 13:39:47 +0000
X-Env-Sender: prvs=72140db33=Paul.Durrant@citrix.com
X-Msg-Ref: server-11.tower-206.messagelabs.com!1444743586!37848503!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=1.7 required=7.0 tests=BIZ_TLD,received_headers: 
	No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17000 invoked from network); 13 Oct 2015 13:39:46 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-11.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2015 13:39:46 -0000
X-IronPort-AV: E=Sophos;i="5.17,678,1437436800"; 
   d="scan'208";a="5108486"
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] Network and disk pv not working on windows 10
	pro 64 bit with latest winpv build and xen 4.6.0
Thread-Index: AQHRBNh9Z00iIvSIsUy7w+yOqi9SPJ5nxWbQgAAXqACAAVDwcIAAGqsAgAAln6A=
Date: Tue, 13 Oct 2015 13:39:15 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F60E611@AMSPEX01CL01.citrite.net>
References: <561B8AC1.9010900@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60C26F@AMSPEX01CL01.citrite.net>
	<561BD41E.5040302@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60DDED@AMSPEX01CL01.citrite.net>
	<561D0522.4090807@m2r.biz>
In-Reply-To: <561D0522.4090807@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
Cc: Stefano Stabellini <Stefano.Stabellini@citrix.com>
Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
 pro 64 bit with latest winpv build and xen 4.6.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

> -----Original Message-----
> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
> Sent: 13 October 2015 14:21
> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> Cc: Stefano Stabellini
> Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
> pro 64 bit with latest winpv build and xen 4.6.0
> 
> 
> 
> Il 13/10/2015 11:45, 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: 12 October 2015 16:39
> >> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> >> Cc: Stefano Stabellini
> >> Subject: Re: [win-pv-devel] Network and disk pv not working on windows
> 10
> >> pro 64 bit with latest winpv build and xen 4.6.0
> >>
> >> Il 12/10/2015 14:15, 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: 12 October 2015 11:26
> >>>> To: win-pv-devel@lists.xenproject.org
> >>>> Cc: Paul Durrant
> >>>> Subject: [win-pv-devel] Network and disk pv not working on windows
> 10
> >> pro
> >>>> 64 bit with latest winpv build and xen 4.6.0
> >>>>
> >>>> Dom0: Jessie (debian 8) 64 bit, kernel 3.16 from official repository,
> >>>> xen 4.6.0, other installation details here:
> >>>> ./configure --prefix=/usr --disable-blktap1 --disable-qemu-traditional
> >>>> --disable-rombios --with-system-seabios=/usr/share/seabios/bios-
> >> 256k.bin
> >>>> --with-extra-qemuu-configure-args="--enable-spice --enable-usb-
> redir"
> >>>> --disable-blktap2 --enable-systemd
> >>>> xen services enabled with:
> >>>> systemctl enable xenstored.service
> >>>> systemctl enable xenconsoled.service
> >>>> systemctl enable xen-init-dom0.service
> >>>> systemctl enable xen-qemu-dom0-disk-backend.service
> >>>> systemctl enable xendomains.service
> >>>>
> >>>> domU xl cfg:
> >>>> http://lists.xen.org/archives/html/xen-devel/2015-
> 10/txtsAaP2yM2Vx.txt
> >>>>
> >>>> Still use emualted disk and network and xen pv network is unable to
> >>>> start for code 10 error (from windows devices manager). (see also
> >>>> screenshot in attachment)
> >>>>
> >>>> In attachment full qemu log with xen_platform trace.
> >>>>
> >>> xen_platform_log xen platform: XENVIF|SettingsSave: FROM Ethernet
> >> (Realtek RTL8139C+ Fast Ethernet NIC)
> >>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
> >> Version4: ADDRESSES NOT FOUND
> >>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
> >> Version6: ADDRESSES NOT FOUND
> >>> xen_platform_log xen platform: XENVIF|DriverRequestReboot: <===>
> >>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail7
> >>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail6
> >>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail5
> >>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail4
> >>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail3
> >>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail2
> >>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1
> (c0000001)
> >>> xen_platform_log xen platform: XENNET|DriverUnload: XENNET 8.2.0
> (31)
> >> (17.09.2015)
> >>> That means you have not rebooted to allow the emulated device to be
> >> unplugged. Other versions of Windows will prompt for the reboot but
> >> Microsoft broke the class installer in Windows 10 so it won't.
> >>>     Paul
> >> Thanks for reply.
> >> I already did a windows reboot after pv install but after doing another
> >> seem ok.
> >> Remain the dubt with ahci, I saw both emulated and pv ok in windows
> >> devices manager and I not understand if a changes is needed for ahci
> >> qemu side as Stefano Stabellini told.
> >> Can you take a look to this new qemu log please? Is ok or with ahci disk
> >> is not pv correctly?
> >>
> > The log shows:
> >
> > xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] :
> 104857600 sectors of 512 bytes (512)
> > xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] : 50 GB
> (00000000)
> > xen_platform_log xen platform: XENVBD|FrontendReadDiskInfo:Target[0]
> : Features: BARRIER FLUSH DISCARD
> > xen_platform_log xen platform: XENVBD|FrontendReadDiskInfo:Target[0]
> : DISCARD 0/1000
> > xen_platform_log xen platform: XENVBD|FrontendReadFeatures:Target[0]
> : Features: PERSISTENT INDIRECT
> > xen_platform_log xen platform: XENVBD|FrontendReadFeatures:Target[0]
> : INDIRECT 100
> > xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] :
> in state CONNECTED
> > xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] :
> in state ENABLED
> > xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] : Created
> (PV)
> >
> > That last line says you have a functioning PV disk.
> >
> >    Paul
> 
> Thanks for your reply.
> So with ahci even if Windows sees also emulated one in device manager
> should properly use the pv?
> 

XENFILT is installed as a filter on the IDE channel class in Windows so that it can make sure that, in the event of an emulated disk being present in the VM, the PV device does not come online... otherwise you've got two disks in the VM referencing the same storage and you'll get data corruption pretty quickly.
So, if you use AHCI, I'm not convinced that:

a) The emulated device unplug code in QEMU will actually unplug the emulated AHCI disk
b) XENFILT will spot the problem

Hence, if you see any corruption of the VMs disks I would not be surprised.

  Paul

> >
> >> If you need more information and/or test tell me and I'l 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 Oct 13 14:14:21 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 13 Oct 2015 14:14:21 +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 1Zm0LM-0004MY-Bs; Tue, 13 Oct 2015 14:14:20 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabio.fantoni@m2r.biz>) id 1Zm0LL-0004MT-97
	for win-pv-devel@lists.xenproject.org; Tue, 13 Oct 2015 14:14:19 +0000
Received: from [85.158.137.68] by server-5.bemta-3.messagelabs.com id
	6C/97-01748-AB11D165; Tue, 13 Oct 2015 14:14:18 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-10.tower-31.messagelabs.com!1444745656!52844326!1
X-Originating-IP: [209.85.220.175]
X-SpamReason: No, hits=1.7 required=7.0 tests=BIZ_TLD
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19438 invoked from network); 13 Oct 2015 14:14:17 -0000
Received: from mail-qk0-f175.google.com (HELO mail-qk0-f175.google.com)
	(209.85.220.175)
	by server-10.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2015 14:14:17 -0000
Received: by qkfm62 with SMTP id m62so6008949qkf.1
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 13 Oct 2015 07:14:16 -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:cc:from:message-id:date
	:user-agent:mime-version:in-reply-to:content-type
	:content-transfer-encoding;
	bh=PCKoWKAVdDBJZXB8PFarOGvOzH6mYYOnmCU0iJou7NY=;
	b=Mr3wEPjH9ak6Vuwvd3j5gYCsNnhG8oJsPAn5NWFv3pH1ME0uFOlkmi2LmKLJz4R3ak
	IBb4MKIGGKEKPNZyds2HDdciAmkEfABgZbGmHCB8xBCOJkWfBR82pJA+5Ezaynp2GH3p
	dmCqnLT5YnrKzOckFLjhPFkbS+WZacilPetRfOzbR56AfkhWFEkSj4739q93zlnZt04U
	Idxr0RSpQQ60nOW0HhNqLMbL0m0wLC62UXtph7ATu2/kk90dG1ARZJ9T7eLiEDhgeSgf
	agHaXkiWhRH2gCOx6hjqR0k7/TS299wYD5reQyQPqYGbqImu7Vf0tYTBPyXmqgiwAKcH
	trmA==
X-Gm-Message-State: ALoCoQm4UsHOrK0GYedOtA2LxLtFEpGYf+EK1Wnv/0l9xsp33eKQ8ETBdqWFtEB/kDaeerm57wXx
X-Received: by 10.194.234.97 with SMTP id ud1mr28497592wjc.133.1444745656397; 
	Tue, 13 Oct 2015 07:14:16 -0700 (PDT)
Received: from [192.168.178.34] ([95.233.12.243])
	by smtp.googlemail.com with ESMTPSA id
	p7sm3934924wjf.26.2015.10.13.07.14.15
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Tue, 13 Oct 2015 07:14:15 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <561B8AC1.9010900@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60C26F@AMSPEX01CL01.citrite.net>
	<561BD41E.5040302@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60DDED@AMSPEX01CL01.citrite.net>
	<561D0522.4090807@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60E611@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <561D11B6.9030909@m2r.biz>
Date: Tue, 13 Oct 2015 16:14:14 +0200
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
	Thunderbird/38.2.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F60E611@AMSPEX01CL01.citrite.net>
Cc: Stefano Stabellini <Stefano.Stabellini@citrix.com>
Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
 pro 64 bit with latest winpv build and xen 4.6.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-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/10/2015 15:39, Paul Durrant ha scritto:
>> -----Original Message-----
>> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
>> Sent: 13 October 2015 14:21
>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
>> Cc: Stefano Stabellini
>> Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
>> pro 64 bit with latest winpv build and xen 4.6.0
>>
>>
>>
>> Il 13/10/2015 11:45, 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: 12 October 2015 16:39
>>>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
>>>> Cc: Stefano Stabellini
>>>> Subject: Re: [win-pv-devel] Network and disk pv not working on windows
>> 10
>>>> pro 64 bit with latest winpv build and xen 4.6.0
>>>>
>>>> Il 12/10/2015 14:15, 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: 12 October 2015 11:26
>>>>>> To: win-pv-devel@lists.xenproject.org
>>>>>> Cc: Paul Durrant
>>>>>> Subject: [win-pv-devel] Network and disk pv not working on windows
>> 10
>>>> pro
>>>>>> 64 bit with latest winpv build and xen 4.6.0
>>>>>>
>>>>>> Dom0: Jessie (debian 8) 64 bit, kernel 3.16 from official repository,
>>>>>> xen 4.6.0, other installation details here:
>>>>>> ./configure --prefix=/usr --disable-blktap1 --disable-qemu-traditional
>>>>>> --disable-rombios --with-system-seabios=/usr/share/seabios/bios-
>>>> 256k.bin
>>>>>> --with-extra-qemuu-configure-args="--enable-spice --enable-usb-
>> redir"
>>>>>> --disable-blktap2 --enable-systemd
>>>>>> xen services enabled with:
>>>>>> systemctl enable xenstored.service
>>>>>> systemctl enable xenconsoled.service
>>>>>> systemctl enable xen-init-dom0.service
>>>>>> systemctl enable xen-qemu-dom0-disk-backend.service
>>>>>> systemctl enable xendomains.service
>>>>>>
>>>>>> domU xl cfg:
>>>>>> http://lists.xen.org/archives/html/xen-devel/2015-
>> 10/txtsAaP2yM2Vx.txt
>>>>>> Still use emualted disk and network and xen pv network is unable to
>>>>>> start for code 10 error (from windows devices manager). (see also
>>>>>> screenshot in attachment)
>>>>>>
>>>>>> In attachment full qemu log with xen_platform trace.
>>>>>>
>>>>> xen_platform_log xen platform: XENVIF|SettingsSave: FROM Ethernet
>>>> (Realtek RTL8139C+ Fast Ethernet NIC)
>>>>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
>>>> Version4: ADDRESSES NOT FOUND
>>>>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
>>>> Version6: ADDRESSES NOT FOUND
>>>>> xen_platform_log xen platform: XENVIF|DriverRequestReboot: <===>
>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail7
>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail6
>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail5
>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail4
>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail3
>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail2
>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1
>> (c0000001)
>>>>> xen_platform_log xen platform: XENNET|DriverUnload: XENNET 8.2.0
>> (31)
>>>> (17.09.2015)
>>>>> That means you have not rebooted to allow the emulated device to be
>>>> unplugged. Other versions of Windows will prompt for the reboot but
>>>> Microsoft broke the class installer in Windows 10 so it won't.
>>>>>      Paul
>>>> Thanks for reply.
>>>> I already did a windows reboot after pv install but after doing another
>>>> seem ok.
>>>> Remain the dubt with ahci, I saw both emulated and pv ok in windows
>>>> devices manager and I not understand if a changes is needed for ahci
>>>> qemu side as Stefano Stabellini told.
>>>> Can you take a look to this new qemu log please? Is ok or with ahci disk
>>>> is not pv correctly?
>>>>
>>> The log shows:
>>>
>>> xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] :
>> 104857600 sectors of 512 bytes (512)
>>> xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] : 50 GB
>> (00000000)
>>> xen_platform_log xen platform: XENVBD|FrontendReadDiskInfo:Target[0]
>> : Features: BARRIER FLUSH DISCARD
>>> xen_platform_log xen platform: XENVBD|FrontendReadDiskInfo:Target[0]
>> : DISCARD 0/1000
>>> xen_platform_log xen platform: XENVBD|FrontendReadFeatures:Target[0]
>> : Features: PERSISTENT INDIRECT
>>> xen_platform_log xen platform: XENVBD|FrontendReadFeatures:Target[0]
>> : INDIRECT 100
>>> xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] :
>> in state CONNECTED
>>> xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] :
>> in state ENABLED
>>> xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] : Created
>> (PV)
>>> That last line says you have a functioning PV disk.
>>>
>>>     Paul
>> Thanks for your reply.
>> So with ahci even if Windows sees also emulated one in device manager
>> should properly use the pv?
>>
> XENFILT is installed as a filter on the IDE channel class in Windows so that it can make sure that, in the event of an emulated disk being present in the VM, the PV device does not come online... otherwise you've got two disks in the VM referencing the same storage and you'll get data corruption pretty quickly.
> So, if you use AHCI, I'm not convinced that:
>
> a) The emulated device unplug code in QEMU will actually unplug the emulated AHCI disk
> b) XENFILT will spot the problem
>
> Hence, if you see any corruption of the VMs disks I would not be surprised.
>
>    Paul

I had disk corruption but with qcow2 disk overlay and also using ide 
instead as I reported time ago. Without qcow2 I not saw disk corruption 
for sure if I remember good. I saw domUs windows unbootable in other 
cases about updated/remove the new pv but also with ide.
Is there a way to check if corruption happen in raw disks even if domU 
seems still working correctly?


@ Stefano Stabellini: can you add unplug support for ahci in qemu to be 
sure it can't do unexpected things please?


If you need more information and/or test tell me and I'l 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 Oct 13 14:14:21 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 13 Oct 2015 14:14:21 +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 1Zm0LM-0004MY-Bs; Tue, 13 Oct 2015 14:14:20 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabio.fantoni@m2r.biz>) id 1Zm0LL-0004MT-97
	for win-pv-devel@lists.xenproject.org; Tue, 13 Oct 2015 14:14:19 +0000
Received: from [85.158.137.68] by server-5.bemta-3.messagelabs.com id
	6C/97-01748-AB11D165; Tue, 13 Oct 2015 14:14:18 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-10.tower-31.messagelabs.com!1444745656!52844326!1
X-Originating-IP: [209.85.220.175]
X-SpamReason: No, hits=1.7 required=7.0 tests=BIZ_TLD
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19438 invoked from network); 13 Oct 2015 14:14:17 -0000
Received: from mail-qk0-f175.google.com (HELO mail-qk0-f175.google.com)
	(209.85.220.175)
	by server-10.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2015 14:14:17 -0000
Received: by qkfm62 with SMTP id m62so6008949qkf.1
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 13 Oct 2015 07:14:16 -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:cc:from:message-id:date
	:user-agent:mime-version:in-reply-to:content-type
	:content-transfer-encoding;
	bh=PCKoWKAVdDBJZXB8PFarOGvOzH6mYYOnmCU0iJou7NY=;
	b=Mr3wEPjH9ak6Vuwvd3j5gYCsNnhG8oJsPAn5NWFv3pH1ME0uFOlkmi2LmKLJz4R3ak
	IBb4MKIGGKEKPNZyds2HDdciAmkEfABgZbGmHCB8xBCOJkWfBR82pJA+5Ezaynp2GH3p
	dmCqnLT5YnrKzOckFLjhPFkbS+WZacilPetRfOzbR56AfkhWFEkSj4739q93zlnZt04U
	Idxr0RSpQQ60nOW0HhNqLMbL0m0wLC62UXtph7ATu2/kk90dG1ARZJ9T7eLiEDhgeSgf
	agHaXkiWhRH2gCOx6hjqR0k7/TS299wYD5reQyQPqYGbqImu7Vf0tYTBPyXmqgiwAKcH
	trmA==
X-Gm-Message-State: ALoCoQm4UsHOrK0GYedOtA2LxLtFEpGYf+EK1Wnv/0l9xsp33eKQ8ETBdqWFtEB/kDaeerm57wXx
X-Received: by 10.194.234.97 with SMTP id ud1mr28497592wjc.133.1444745656397; 
	Tue, 13 Oct 2015 07:14:16 -0700 (PDT)
Received: from [192.168.178.34] ([95.233.12.243])
	by smtp.googlemail.com with ESMTPSA id
	p7sm3934924wjf.26.2015.10.13.07.14.15
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Tue, 13 Oct 2015 07:14:15 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <561B8AC1.9010900@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60C26F@AMSPEX01CL01.citrite.net>
	<561BD41E.5040302@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60DDED@AMSPEX01CL01.citrite.net>
	<561D0522.4090807@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60E611@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <561D11B6.9030909@m2r.biz>
Date: Tue, 13 Oct 2015 16:14:14 +0200
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
	Thunderbird/38.2.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F60E611@AMSPEX01CL01.citrite.net>
Cc: Stefano Stabellini <Stefano.Stabellini@citrix.com>
Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
 pro 64 bit with latest winpv build and xen 4.6.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-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/10/2015 15:39, Paul Durrant ha scritto:
>> -----Original Message-----
>> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
>> Sent: 13 October 2015 14:21
>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
>> Cc: Stefano Stabellini
>> Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
>> pro 64 bit with latest winpv build and xen 4.6.0
>>
>>
>>
>> Il 13/10/2015 11:45, 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: 12 October 2015 16:39
>>>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
>>>> Cc: Stefano Stabellini
>>>> Subject: Re: [win-pv-devel] Network and disk pv not working on windows
>> 10
>>>> pro 64 bit with latest winpv build and xen 4.6.0
>>>>
>>>> Il 12/10/2015 14:15, 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: 12 October 2015 11:26
>>>>>> To: win-pv-devel@lists.xenproject.org
>>>>>> Cc: Paul Durrant
>>>>>> Subject: [win-pv-devel] Network and disk pv not working on windows
>> 10
>>>> pro
>>>>>> 64 bit with latest winpv build and xen 4.6.0
>>>>>>
>>>>>> Dom0: Jessie (debian 8) 64 bit, kernel 3.16 from official repository,
>>>>>> xen 4.6.0, other installation details here:
>>>>>> ./configure --prefix=/usr --disable-blktap1 --disable-qemu-traditional
>>>>>> --disable-rombios --with-system-seabios=/usr/share/seabios/bios-
>>>> 256k.bin
>>>>>> --with-extra-qemuu-configure-args="--enable-spice --enable-usb-
>> redir"
>>>>>> --disable-blktap2 --enable-systemd
>>>>>> xen services enabled with:
>>>>>> systemctl enable xenstored.service
>>>>>> systemctl enable xenconsoled.service
>>>>>> systemctl enable xen-init-dom0.service
>>>>>> systemctl enable xen-qemu-dom0-disk-backend.service
>>>>>> systemctl enable xendomains.service
>>>>>>
>>>>>> domU xl cfg:
>>>>>> http://lists.xen.org/archives/html/xen-devel/2015-
>> 10/txtsAaP2yM2Vx.txt
>>>>>> Still use emualted disk and network and xen pv network is unable to
>>>>>> start for code 10 error (from windows devices manager). (see also
>>>>>> screenshot in attachment)
>>>>>>
>>>>>> In attachment full qemu log with xen_platform trace.
>>>>>>
>>>>> xen_platform_log xen platform: XENVIF|SettingsSave: FROM Ethernet
>>>> (Realtek RTL8139C+ Fast Ethernet NIC)
>>>>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
>>>> Version4: ADDRESSES NOT FOUND
>>>>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
>>>> Version6: ADDRESSES NOT FOUND
>>>>> xen_platform_log xen platform: XENVIF|DriverRequestReboot: <===>
>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail7
>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail6
>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail5
>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail4
>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail3
>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail2
>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1
>> (c0000001)
>>>>> xen_platform_log xen platform: XENNET|DriverUnload: XENNET 8.2.0
>> (31)
>>>> (17.09.2015)
>>>>> That means you have not rebooted to allow the emulated device to be
>>>> unplugged. Other versions of Windows will prompt for the reboot but
>>>> Microsoft broke the class installer in Windows 10 so it won't.
>>>>>      Paul
>>>> Thanks for reply.
>>>> I already did a windows reboot after pv install but after doing another
>>>> seem ok.
>>>> Remain the dubt with ahci, I saw both emulated and pv ok in windows
>>>> devices manager and I not understand if a changes is needed for ahci
>>>> qemu side as Stefano Stabellini told.
>>>> Can you take a look to this new qemu log please? Is ok or with ahci disk
>>>> is not pv correctly?
>>>>
>>> The log shows:
>>>
>>> xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] :
>> 104857600 sectors of 512 bytes (512)
>>> xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] : 50 GB
>> (00000000)
>>> xen_platform_log xen platform: XENVBD|FrontendReadDiskInfo:Target[0]
>> : Features: BARRIER FLUSH DISCARD
>>> xen_platform_log xen platform: XENVBD|FrontendReadDiskInfo:Target[0]
>> : DISCARD 0/1000
>>> xen_platform_log xen platform: XENVBD|FrontendReadFeatures:Target[0]
>> : Features: PERSISTENT INDIRECT
>>> xen_platform_log xen platform: XENVBD|FrontendReadFeatures:Target[0]
>> : INDIRECT 100
>>> xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] :
>> in state CONNECTED
>>> xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0] :
>> in state ENABLED
>>> xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] : Created
>> (PV)
>>> That last line says you have a functioning PV disk.
>>>
>>>     Paul
>> Thanks for your reply.
>> So with ahci even if Windows sees also emulated one in device manager
>> should properly use the pv?
>>
> XENFILT is installed as a filter on the IDE channel class in Windows so that it can make sure that, in the event of an emulated disk being present in the VM, the PV device does not come online... otherwise you've got two disks in the VM referencing the same storage and you'll get data corruption pretty quickly.
> So, if you use AHCI, I'm not convinced that:
>
> a) The emulated device unplug code in QEMU will actually unplug the emulated AHCI disk
> b) XENFILT will spot the problem
>
> Hence, if you see any corruption of the VMs disks I would not be surprised.
>
>    Paul

I had disk corruption but with qcow2 disk overlay and also using ide 
instead as I reported time ago. Without qcow2 I not saw disk corruption 
for sure if I remember good. I saw domUs windows unbootable in other 
cases about updated/remove the new pv but also with ide.
Is there a way to check if corruption happen in raw disks even if domU 
seems still working correctly?


@ Stefano Stabellini: can you add unplug support for ahci in qemu to be 
sure it can't do unexpected things please?


If you need more information and/or test tell me and I'l 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 Oct 13 14:21:10 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 13 Oct 2015 14:21: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 1Zm0Rx-00056C-I8; Tue, 13 Oct 2015 14:21:09 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72140db33=Paul.Durrant@citrix.com>)
	id 1Zm0Rw-000562-12
	for win-pv-devel@lists.xenproject.org; Tue, 13 Oct 2015 14:21:08 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	62/AF-10678-3531D165; Tue, 13 Oct 2015 14:21:07 +0000
X-Env-Sender: prvs=72140db33=Paul.Durrant@citrix.com
X-Msg-Ref: server-14.tower-31.messagelabs.com!1444746064!50429092!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=1.7 required=7.0 tests=BIZ_TLD,received_headers: 
	No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7821 invoked from network); 13 Oct 2015 14:21:05 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-14.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2015 14:21:05 -0000
X-IronPort-AV: E=Sophos;i="5.17,678,1437436800"; 
   d="scan'208";a="5114784"
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] Network and disk pv not working on windows 10
	pro 64 bit with latest winpv build and xen 4.6.0
Thread-Index: AQHRBNh9Z00iIvSIsUy7w+yOqi9SPJ5nxWbQgAAXqACAAVDwcIAAGqsAgAAln6D//+lgAIAAIusQ
Date: Tue, 13 Oct 2015 14:20:13 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F60E97B@AMSPEX01CL01.citrite.net>
References: <561B8AC1.9010900@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60C26F@AMSPEX01CL01.citrite.net>
	<561BD41E.5040302@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60DDED@AMSPEX01CL01.citrite.net>
	<561D0522.4090807@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60E611@AMSPEX01CL01.citrite.net>
	<561D11B6.9030909@m2r.biz>
In-Reply-To: <561D11B6.9030909@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
Cc: Stefano Stabellini <Stefano.Stabellini@citrix.com>
Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
 pro 64 bit with latest winpv build and xen 4.6.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

> -----Original Message-----
> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
> Sent: 13 October 2015 15:14
> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> Cc: Stefano Stabellini
> Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
> pro 64 bit with latest winpv build and xen 4.6.0
> 
> 
> 
> Il 13/10/2015 15:39, Paul Durrant ha scritto:
> >> -----Original Message-----
> >> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
> >> Sent: 13 October 2015 14:21
> >> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> >> Cc: Stefano Stabellini
> >> Subject: Re: [win-pv-devel] Network and disk pv not working on windows
> 10
> >> pro 64 bit with latest winpv build and xen 4.6.0
> >>
> >>
> >>
> >> Il 13/10/2015 11:45, 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: 12 October 2015 16:39
> >>>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> >>>> Cc: Stefano Stabellini
> >>>> Subject: Re: [win-pv-devel] Network and disk pv not working on
> windows
> >> 10
> >>>> pro 64 bit with latest winpv build and xen 4.6.0
> >>>>
> >>>> Il 12/10/2015 14:15, 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: 12 October 2015 11:26
> >>>>>> To: win-pv-devel@lists.xenproject.org
> >>>>>> Cc: Paul Durrant
> >>>>>> Subject: [win-pv-devel] Network and disk pv not working on
> windows
> >> 10
> >>>> pro
> >>>>>> 64 bit with latest winpv build and xen 4.6.0
> >>>>>>
> >>>>>> Dom0: Jessie (debian 8) 64 bit, kernel 3.16 from official repository,
> >>>>>> xen 4.6.0, other installation details here:
> >>>>>> ./configure --prefix=/usr --disable-blktap1 --disable-qemu-
> traditional
> >>>>>> --disable-rombios --with-system-seabios=/usr/share/seabios/bios-
> >>>> 256k.bin
> >>>>>> --with-extra-qemuu-configure-args="--enable-spice --enable-usb-
> >> redir"
> >>>>>> --disable-blktap2 --enable-systemd
> >>>>>> xen services enabled with:
> >>>>>> systemctl enable xenstored.service
> >>>>>> systemctl enable xenconsoled.service
> >>>>>> systemctl enable xen-init-dom0.service
> >>>>>> systemctl enable xen-qemu-dom0-disk-backend.service
> >>>>>> systemctl enable xendomains.service
> >>>>>>
> >>>>>> domU xl cfg:
> >>>>>> http://lists.xen.org/archives/html/xen-devel/2015-
> >> 10/txtsAaP2yM2Vx.txt
> >>>>>> Still use emualted disk and network and xen pv network is unable to
> >>>>>> start for code 10 error (from windows devices manager). (see also
> >>>>>> screenshot in attachment)
> >>>>>>
> >>>>>> In attachment full qemu log with xen_platform trace.
> >>>>>>
> >>>>> xen_platform_log xen platform: XENVIF|SettingsSave: FROM
> Ethernet
> >>>> (Realtek RTL8139C+ Fast Ethernet NIC)
> >>>>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
> >>>> Version4: ADDRESSES NOT FOUND
> >>>>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
> >>>> Version6: ADDRESSES NOT FOUND
> >>>>> xen_platform_log xen platform: XENVIF|DriverRequestReboot:
> <===>
> >>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail7
> >>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail6
> >>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail5
> >>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail4
> >>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail3
> >>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail2
> >>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1
> >> (c0000001)
> >>>>> xen_platform_log xen platform: XENNET|DriverUnload: XENNET 8.2.0
> >> (31)
> >>>> (17.09.2015)
> >>>>> That means you have not rebooted to allow the emulated device to
> be
> >>>> unplugged. Other versions of Windows will prompt for the reboot but
> >>>> Microsoft broke the class installer in Windows 10 so it won't.
> >>>>>      Paul
> >>>> Thanks for reply.
> >>>> I already did a windows reboot after pv install but after doing another
> >>>> seem ok.
> >>>> Remain the dubt with ahci, I saw both emulated and pv ok in windows
> >>>> devices manager and I not understand if a changes is needed for ahci
> >>>> qemu side as Stefano Stabellini told.
> >>>> Can you take a look to this new qemu log please? Is ok or with ahci disk
> >>>> is not pv correctly?
> >>>>
> >>> The log shows:
> >>>
> >>> xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] :
> >> 104857600 sectors of 512 bytes (512)
> >>> xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] : 50
> GB
> >> (00000000)
> >>> xen_platform_log xen platform:
> XENVBD|FrontendReadDiskInfo:Target[0]
> >> : Features: BARRIER FLUSH DISCARD
> >>> xen_platform_log xen platform:
> XENVBD|FrontendReadDiskInfo:Target[0]
> >> : DISCARD 0/1000
> >>> xen_platform_log xen platform:
> XENVBD|FrontendReadFeatures:Target[0]
> >> : Features: PERSISTENT INDIRECT
> >>> xen_platform_log xen platform:
> XENVBD|FrontendReadFeatures:Target[0]
> >> : INDIRECT 100
> >>> xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0]
> :
> >> in state CONNECTED
> >>> xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0]
> :
> >> in state ENABLED
> >>> xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] : Created
> >> (PV)
> >>> That last line says you have a functioning PV disk.
> >>>
> >>>     Paul
> >> Thanks for your reply.
> >> So with ahci even if Windows sees also emulated one in device manager
> >> should properly use the pv?
> >>
> > XENFILT is installed as a filter on the IDE channel class in Windows so that it
> can make sure that, in the event of an emulated disk being present in the
> VM, the PV device does not come online... otherwise you've got two disks in
> the VM referencing the same storage and you'll get data corruption pretty
> quickly.
> > So, if you use AHCI, I'm not convinced that:
> >
> > a) The emulated device unplug code in QEMU will actually unplug the
> emulated AHCI disk
> > b) XENFILT will spot the problem
> >
> > Hence, if you see any corruption of the VMs disks I would not be surprised.
> >
> >    Paul
> 
> I had disk corruption but with qcow2 disk overlay and also using ide
> instead as I reported time ago. Without qcow2 I not saw disk corruption
> for sure if I remember good. I saw domUs windows unbootable in other
> cases about updated/remove the new pv but also with ide.
> Is there a way to check if corruption happen in raw disks even if domU
> seems still working correctly?
> 

Go look at the number of disks the VM thinks it has. If you only gave it one but it thinks it has two then corruption is imminent.

  Paul

> 
> @ Stefano Stabellini: can you add unplug support for ahci in qemu to be
> sure it can't do unexpected things please?
> 
> 
> If you need more information and/or test tell me and I'l 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 Oct 13 14:21:10 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 13 Oct 2015 14:21: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 1Zm0Rx-00056C-I8; Tue, 13 Oct 2015 14:21:09 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72140db33=Paul.Durrant@citrix.com>)
	id 1Zm0Rw-000562-12
	for win-pv-devel@lists.xenproject.org; Tue, 13 Oct 2015 14:21:08 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	62/AF-10678-3531D165; Tue, 13 Oct 2015 14:21:07 +0000
X-Env-Sender: prvs=72140db33=Paul.Durrant@citrix.com
X-Msg-Ref: server-14.tower-31.messagelabs.com!1444746064!50429092!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=1.7 required=7.0 tests=BIZ_TLD,received_headers: 
	No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7821 invoked from network); 13 Oct 2015 14:21:05 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-14.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2015 14:21:05 -0000
X-IronPort-AV: E=Sophos;i="5.17,678,1437436800"; 
   d="scan'208";a="5114784"
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] Network and disk pv not working on windows 10
	pro 64 bit with latest winpv build and xen 4.6.0
Thread-Index: AQHRBNh9Z00iIvSIsUy7w+yOqi9SPJ5nxWbQgAAXqACAAVDwcIAAGqsAgAAln6D//+lgAIAAIusQ
Date: Tue, 13 Oct 2015 14:20:13 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F60E97B@AMSPEX01CL01.citrite.net>
References: <561B8AC1.9010900@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60C26F@AMSPEX01CL01.citrite.net>
	<561BD41E.5040302@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60DDED@AMSPEX01CL01.citrite.net>
	<561D0522.4090807@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60E611@AMSPEX01CL01.citrite.net>
	<561D11B6.9030909@m2r.biz>
In-Reply-To: <561D11B6.9030909@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
Cc: Stefano Stabellini <Stefano.Stabellini@citrix.com>
Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
 pro 64 bit with latest winpv build and xen 4.6.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

> -----Original Message-----
> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
> Sent: 13 October 2015 15:14
> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> Cc: Stefano Stabellini
> Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
> pro 64 bit with latest winpv build and xen 4.6.0
> 
> 
> 
> Il 13/10/2015 15:39, Paul Durrant ha scritto:
> >> -----Original Message-----
> >> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
> >> Sent: 13 October 2015 14:21
> >> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> >> Cc: Stefano Stabellini
> >> Subject: Re: [win-pv-devel] Network and disk pv not working on windows
> 10
> >> pro 64 bit with latest winpv build and xen 4.6.0
> >>
> >>
> >>
> >> Il 13/10/2015 11:45, 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: 12 October 2015 16:39
> >>>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> >>>> Cc: Stefano Stabellini
> >>>> Subject: Re: [win-pv-devel] Network and disk pv not working on
> windows
> >> 10
> >>>> pro 64 bit with latest winpv build and xen 4.6.0
> >>>>
> >>>> Il 12/10/2015 14:15, 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: 12 October 2015 11:26
> >>>>>> To: win-pv-devel@lists.xenproject.org
> >>>>>> Cc: Paul Durrant
> >>>>>> Subject: [win-pv-devel] Network and disk pv not working on
> windows
> >> 10
> >>>> pro
> >>>>>> 64 bit with latest winpv build and xen 4.6.0
> >>>>>>
> >>>>>> Dom0: Jessie (debian 8) 64 bit, kernel 3.16 from official repository,
> >>>>>> xen 4.6.0, other installation details here:
> >>>>>> ./configure --prefix=/usr --disable-blktap1 --disable-qemu-
> traditional
> >>>>>> --disable-rombios --with-system-seabios=/usr/share/seabios/bios-
> >>>> 256k.bin
> >>>>>> --with-extra-qemuu-configure-args="--enable-spice --enable-usb-
> >> redir"
> >>>>>> --disable-blktap2 --enable-systemd
> >>>>>> xen services enabled with:
> >>>>>> systemctl enable xenstored.service
> >>>>>> systemctl enable xenconsoled.service
> >>>>>> systemctl enable xen-init-dom0.service
> >>>>>> systemctl enable xen-qemu-dom0-disk-backend.service
> >>>>>> systemctl enable xendomains.service
> >>>>>>
> >>>>>> domU xl cfg:
> >>>>>> http://lists.xen.org/archives/html/xen-devel/2015-
> >> 10/txtsAaP2yM2Vx.txt
> >>>>>> Still use emualted disk and network and xen pv network is unable to
> >>>>>> start for code 10 error (from windows devices manager). (see also
> >>>>>> screenshot in attachment)
> >>>>>>
> >>>>>> In attachment full qemu log with xen_platform trace.
> >>>>>>
> >>>>> xen_platform_log xen platform: XENVIF|SettingsSave: FROM
> Ethernet
> >>>> (Realtek RTL8139C+ Fast Ethernet NIC)
> >>>>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
> >>>> Version4: ADDRESSES NOT FOUND
> >>>>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
> >>>> Version6: ADDRESSES NOT FOUND
> >>>>> xen_platform_log xen platform: XENVIF|DriverRequestReboot:
> <===>
> >>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail7
> >>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail6
> >>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail5
> >>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail4
> >>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail3
> >>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail2
> >>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1
> >> (c0000001)
> >>>>> xen_platform_log xen platform: XENNET|DriverUnload: XENNET 8.2.0
> >> (31)
> >>>> (17.09.2015)
> >>>>> That means you have not rebooted to allow the emulated device to
> be
> >>>> unplugged. Other versions of Windows will prompt for the reboot but
> >>>> Microsoft broke the class installer in Windows 10 so it won't.
> >>>>>      Paul
> >>>> Thanks for reply.
> >>>> I already did a windows reboot after pv install but after doing another
> >>>> seem ok.
> >>>> Remain the dubt with ahci, I saw both emulated and pv ok in windows
> >>>> devices manager and I not understand if a changes is needed for ahci
> >>>> qemu side as Stefano Stabellini told.
> >>>> Can you take a look to this new qemu log please? Is ok or with ahci disk
> >>>> is not pv correctly?
> >>>>
> >>> The log shows:
> >>>
> >>> xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] :
> >> 104857600 sectors of 512 bytes (512)
> >>> xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] : 50
> GB
> >> (00000000)
> >>> xen_platform_log xen platform:
> XENVBD|FrontendReadDiskInfo:Target[0]
> >> : Features: BARRIER FLUSH DISCARD
> >>> xen_platform_log xen platform:
> XENVBD|FrontendReadDiskInfo:Target[0]
> >> : DISCARD 0/1000
> >>> xen_platform_log xen platform:
> XENVBD|FrontendReadFeatures:Target[0]
> >> : Features: PERSISTENT INDIRECT
> >>> xen_platform_log xen platform:
> XENVBD|FrontendReadFeatures:Target[0]
> >> : INDIRECT 100
> >>> xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0]
> :
> >> in state CONNECTED
> >>> xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0]
> :
> >> in state ENABLED
> >>> xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] : Created
> >> (PV)
> >>> That last line says you have a functioning PV disk.
> >>>
> >>>     Paul
> >> Thanks for your reply.
> >> So with ahci even if Windows sees also emulated one in device manager
> >> should properly use the pv?
> >>
> > XENFILT is installed as a filter on the IDE channel class in Windows so that it
> can make sure that, in the event of an emulated disk being present in the
> VM, the PV device does not come online... otherwise you've got two disks in
> the VM referencing the same storage and you'll get data corruption pretty
> quickly.
> > So, if you use AHCI, I'm not convinced that:
> >
> > a) The emulated device unplug code in QEMU will actually unplug the
> emulated AHCI disk
> > b) XENFILT will spot the problem
> >
> > Hence, if you see any corruption of the VMs disks I would not be surprised.
> >
> >    Paul
> 
> I had disk corruption but with qcow2 disk overlay and also using ide
> instead as I reported time ago. Without qcow2 I not saw disk corruption
> for sure if I remember good. I saw domUs windows unbootable in other
> cases about updated/remove the new pv but also with ide.
> Is there a way to check if corruption happen in raw disks even if domU
> seems still working correctly?
> 

Go look at the number of disks the VM thinks it has. If you only gave it one but it thinks it has two then corruption is imminent.

  Paul

> 
> @ Stefano Stabellini: can you add unplug support for ahci in qemu to be
> sure it can't do unexpected things please?
> 
> 
> If you need more information and/or test tell me and I'l 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 Oct 13 14:44:26 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 13 Oct 2015 14:44: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 1Zm0oT-0006eE-F4; Tue, 13 Oct 2015 14:44:25 +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 1Zm0oR-0006e6-JB
	for win-pv-devel@lists.xenproject.org; Tue, 13 Oct 2015 14:44:24 +0000
Received: from [193.109.254.147] by server-4.bemta-14.messagelabs.com id
	09/31-10715-6C81D165; Tue, 13 Oct 2015 14:44:22 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-2.tower-27.messagelabs.com!1444747402!22070678!1
X-Originating-IP: [209.85.212.178]
X-SpamReason: No, hits=1.7 required=7.0 tests=BIZ_TLD
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10640 invoked from network); 13 Oct 2015 14:43:39 -0000
Received: from mail-wi0-f178.google.com (HELO mail-wi0-f178.google.com)
	(209.85.212.178)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2015 14:43:39 -0000
Received: by wieq12 with SMTP id q12so36112757wie.1
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 13 Oct 2015 07:43:22 -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:cc:from:message-id:date
	:user-agent:mime-version:in-reply-to:content-type;
	bh=Vgptnrl8E5J4HJpA69ab6QfIs8kctPkOv8Je9LGE/qI=;
	b=cTtc0+mANa14WCoQeG7IfYbdcdCfwqwR/yh748TszNfbeNVspDdhh58zaSQa8RKkWI
	juwy8uQTzNY0aLVBcHCdE8FWtGXrSeanhWWUf1gc1/dW38TzNwr80f2c3yC+Esc12YOH
	/phblx364GzF5T8aBkCaR1ZkCN7AnsDQ+7C66wMPceHzhPqgYKJTOZ1TN/dmrLIbYh/t
	mvZeJI++skkaHVMoOvqqFRYYZ0t+tyN6l5BR7I3rrGGLqIE9cTVGeRDw+7GZEtimiAg+
	nOa1VUUEmoPAOq/CXvsl9Z9Ld4YzXF+JOI0rWcYRQnK3BUQRjw7oumVyMQzx0m2LRPcb
	ADZQ==
X-Gm-Message-State: ALoCoQkY+sDkjAJmgL1slx+Jzcu69T1fqdsesEP8qekBhY6BtM4nPyakmRVMlxNudYVew9jF8WJp
X-Received: by 10.180.198.180 with SMTP id jd20mr23079811wic.70.1444747373453; 
	Tue, 13 Oct 2015 07:42:53 -0700 (PDT)
Received: from [192.168.178.34] ([95.233.12.243])
	by smtp.googlemail.com with ESMTPSA id
	xt1sm4070085wjb.32.2015.10.13.07.42.48
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Tue, 13 Oct 2015 07:42:52 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <561B8AC1.9010900@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60C26F@AMSPEX01CL01.citrite.net>
	<561BD41E.5040302@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60DDED@AMSPEX01CL01.citrite.net>
	<561D0522.4090807@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60E611@AMSPEX01CL01.citrite.net>
	<561D11B6.9030909@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60E97B@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <561D1867.7030209@m2r.biz>
Date: Tue, 13 Oct 2015 16:42:47 +0200
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
	Thunderbird/38.2.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F60E97B@AMSPEX01CL01.citrite.net>
Content-Type: multipart/mixed; boundary="------------090609030006090407090306"
Cc: Stefano Stabellini <Stefano.Stabellini@citrix.com>
Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
 pro 64 bit with latest winpv build and xen 4.6.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>
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.
--------------090609030006090407090306
Content-Type: text/plain; charset=windows-1252; format=flowed
Content-Transfer-Encoding: 7bit

Il 13/10/2015 16:20, Paul Durrant ha scritto:
>> -----Original Message-----
>> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
>> Sent: 13 October 2015 15:14
>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
>> Cc: Stefano Stabellini
>> Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
>> pro 64 bit with latest winpv build and xen 4.6.0
>>
>>
>>
>> Il 13/10/2015 15:39, Paul Durrant ha scritto:
>>>> -----Original Message-----
>>>> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
>>>> Sent: 13 October 2015 14:21
>>>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
>>>> Cc: Stefano Stabellini
>>>> Subject: Re: [win-pv-devel] Network and disk pv not working on windows
>> 10
>>>> pro 64 bit with latest winpv build and xen 4.6.0
>>>>
>>>>
>>>>
>>>> Il 13/10/2015 11:45, 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: 12 October 2015 16:39
>>>>>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
>>>>>> Cc: Stefano Stabellini
>>>>>> Subject: Re: [win-pv-devel] Network and disk pv not working on
>> windows
>>>> 10
>>>>>> pro 64 bit with latest winpv build and xen 4.6.0
>>>>>>
>>>>>> Il 12/10/2015 14:15, 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: 12 October 2015 11:26
>>>>>>>> To: win-pv-devel@lists.xenproject.org
>>>>>>>> Cc: Paul Durrant
>>>>>>>> Subject: [win-pv-devel] Network and disk pv not working on
>> windows
>>>> 10
>>>>>> pro
>>>>>>>> 64 bit with latest winpv build and xen 4.6.0
>>>>>>>>
>>>>>>>> Dom0: Jessie (debian 8) 64 bit, kernel 3.16 from official repository,
>>>>>>>> xen 4.6.0, other installation details here:
>>>>>>>> ./configure --prefix=/usr --disable-blktap1 --disable-qemu-
>> traditional
>>>>>>>> --disable-rombios --with-system-seabios=/usr/share/seabios/bios-
>>>>>> 256k.bin
>>>>>>>> --with-extra-qemuu-configure-args="--enable-spice --enable-usb-
>>>> redir"
>>>>>>>> --disable-blktap2 --enable-systemd
>>>>>>>> xen services enabled with:
>>>>>>>> systemctl enable xenstored.service
>>>>>>>> systemctl enable xenconsoled.service
>>>>>>>> systemctl enable xen-init-dom0.service
>>>>>>>> systemctl enable xen-qemu-dom0-disk-backend.service
>>>>>>>> systemctl enable xendomains.service
>>>>>>>>
>>>>>>>> domU xl cfg:
>>>>>>>> http://lists.xen.org/archives/html/xen-devel/2015-
>>>> 10/txtsAaP2yM2Vx.txt
>>>>>>>> Still use emualted disk and network and xen pv network is unable to
>>>>>>>> start for code 10 error (from windows devices manager). (see also
>>>>>>>> screenshot in attachment)
>>>>>>>>
>>>>>>>> In attachment full qemu log with xen_platform trace.
>>>>>>>>
>>>>>>> xen_platform_log xen platform: XENVIF|SettingsSave: FROM
>> Ethernet
>>>>>> (Realtek RTL8139C+ Fast Ethernet NIC)
>>>>>>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
>>>>>> Version4: ADDRESSES NOT FOUND
>>>>>>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
>>>>>> Version6: ADDRESSES NOT FOUND
>>>>>>> xen_platform_log xen platform: XENVIF|DriverRequestReboot:
>> <===>
>>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail7
>>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail6
>>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail5
>>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail4
>>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail3
>>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail2
>>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1
>>>> (c0000001)
>>>>>>> xen_platform_log xen platform: XENNET|DriverUnload: XENNET 8.2.0
>>>> (31)
>>>>>> (17.09.2015)
>>>>>>> That means you have not rebooted to allow the emulated device to
>> be
>>>>>> unplugged. Other versions of Windows will prompt for the reboot but
>>>>>> Microsoft broke the class installer in Windows 10 so it won't.
>>>>>>>       Paul
>>>>>> Thanks for reply.
>>>>>> I already did a windows reboot after pv install but after doing another
>>>>>> seem ok.
>>>>>> Remain the dubt with ahci, I saw both emulated and pv ok in windows
>>>>>> devices manager and I not understand if a changes is needed for ahci
>>>>>> qemu side as Stefano Stabellini told.
>>>>>> Can you take a look to this new qemu log please? Is ok or with ahci disk
>>>>>> is not pv correctly?
>>>>>>
>>>>> The log shows:
>>>>>
>>>>> xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] :
>>>> 104857600 sectors of 512 bytes (512)
>>>>> xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] : 50
>> GB
>>>> (00000000)
>>>>> xen_platform_log xen platform:
>> XENVBD|FrontendReadDiskInfo:Target[0]
>>>> : Features: BARRIER FLUSH DISCARD
>>>>> xen_platform_log xen platform:
>> XENVBD|FrontendReadDiskInfo:Target[0]
>>>> : DISCARD 0/1000
>>>>> xen_platform_log xen platform:
>> XENVBD|FrontendReadFeatures:Target[0]
>>>> : Features: PERSISTENT INDIRECT
>>>>> xen_platform_log xen platform:
>> XENVBD|FrontendReadFeatures:Target[0]
>>>> : INDIRECT 100
>>>>> xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0]
>> :
>>>> in state CONNECTED
>>>>> xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0]
>> :
>>>> in state ENABLED
>>>>> xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] : Created
>>>> (PV)
>>>>> That last line says you have a functioning PV disk.
>>>>>
>>>>>      Paul
>>>> Thanks for your reply.
>>>> So with ahci even if Windows sees also emulated one in device manager
>>>> should properly use the pv?
>>>>
>>> XENFILT is installed as a filter on the IDE channel class in Windows so that it
>> can make sure that, in the event of an emulated disk being present in the
>> VM, the PV device does not come online... otherwise you've got two disks in
>> the VM referencing the same storage and you'll get data corruption pretty
>> quickly.
>>> So, if you use AHCI, I'm not convinced that:
>>>
>>> a) The emulated device unplug code in QEMU will actually unplug the
>> emulated AHCI disk
>>> b) XENFILT will spot the problem
>>>
>>> Hence, if you see any corruption of the VMs disks I would not be surprised.
>>>
>>>     Paul
>> I had disk corruption but with qcow2 disk overlay and also using ide
>> instead as I reported time ago. Without qcow2 I not saw disk corruption
>> for sure if I remember good. I saw domUs windows unbootable in other
>> cases about updated/remove the new pv but also with ide.
>> Is there a way to check if corruption happen in raw disks even if domU
>> seems still working correctly?
>>
> Go look at the number of disks the VM thinks it has. If you only gave it one but it thinks it has two then corruption is imminent.
>
>    Paul

See 2 but one (the emulated as offline), see the screenshot attached.
In this case can risk corruption or not?

Thanks for any reply and sorry for my bad english.



>
>> @ Stefano Stabellini: can you add unplug support for ahci in qemu to be
>> sure it can't do unexpected things please?
>>
>>
>> If you need more information and/or test tell me and I'l post them.
>> Thanks for any reply and sorry for my bad english.


--------------090609030006090407090306
Content-Type: image/jpeg;
 name="disk_ahci_screen.JPG"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="disk_ahci_screen.JPG"

/9j/4AAQSkZJRgABAQEAYABgAAD/4RDSRXhpZgAATU0AKgAAAAgABAE7AAIAAAAETTJSAIdp
AAQAAAABAAAISpydAAEAAAAIAAAQwuocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFkAMAAgAA
ABQAABCYkAQAAgAAABQAABCskpEAAgAAAAM1NwAAkpIAAgAAAAM1NwAA6hwABwAACAwAAAiM
AAAAABzqAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAMjAxNToxMDoxMyAxNjozNDowNwAyMDE1OjEwOjEzIDE2OjM0OjA3AAAA
TQAyAFIAAAD/4QsWaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVn
aW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pg0KPHg6eG1wbWV0YSB4
bWxuczp4PSJhZG9iZTpuczptZXRhLyI+PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3
LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOkRlc2NyaXB0aW9uIHJk
ZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHht
bG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPjxyZGY6RGVzY3Jp
cHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4
MmYxYiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj48eG1wOkNy
ZWF0ZURhdGU+MjAxNS0xMC0xM1QxNjozNDowNy41NzQ8L3htcDpDcmVhdGVEYXRlPjwvcmRm
OkRlc2NyaXB0aW9uPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1
LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9y
Zy9kYy9lbGVtZW50cy8xLjEvIj48ZGM6Y3JlYXRvcj48cmRmOlNlcSB4bWxuczpyZGY9Imh0
dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPjxyZGY6bGk+TTJS
PC9yZGY6bGk+PC9yZGY6U2VxPg0KCQkJPC9kYzpjcmVhdG9yPjwvcmRmOkRlc2NyaXB0aW9u
PjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0ndyc/Pv/bAEMABwUFBgUEBwYF
BggHBwgKEQsKCQkKFQ8QDBEYFRoZGBUYFxseJyEbHSUdFxgiLiIlKCkrLCsaIC8zLyoyJyor
Kv/bAEMBBwgICgkKFAsLFCocGBwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKv/AABEIAwAFVgMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAA
AAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEU
MoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFla
Y2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPE
xcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAA
AAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIy
gQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZ
WmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrC
w8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APn8UtIK
M16RxC0A11XhP4beJfGoJ0O0RhsLq00gjEihgrFSeuCQPx+td5Zfs7eIolV7+xkuZMZMaXMM
aA/XcSw/75o6Xv8Aiib62/RnjOaTNe8S/AXUp4dh8NfZz/z0ttRXd/4+7D9Kwb39nPxosw/s
63jljPXz5o4yPbh2z9ePpSVu6+9f5jv5P7n/AJHkuaXmvUP+GdviF/z42f8A4GJR/wAM7fEL
/nxs/wDwMSnp3X3r/MV/J/c/8jy7NGa9R/4Z1+IX/PjZ/wDgYlH/AAzt8Qv+fGz/APAxKNO6
+9f5hfyf3P8AyPLs04GvT/8AhnX4hf8APjZ/+BiUf8M7fEL/AJ8bP/wMSnp3X3r/ADC/k/uf
+R5hupetenf8M7fEL/nxs/8AwMSj/hnb4g/8+Nn/AOBiUad196/zC/k/uf8AkeY4oFen/wDD
O/xB/wCfGz/8DEpR+zx8Qf8AnxtP/AxKNO6+9f5iv5P7n/keX4oxXqP/AAzx8Qf+fC0/8DEo
/wCGePiD/wA+Np/4GJ/jT93uvvQrvs/uf+R5fiivUf8Ahnn4gf8APhaf+BiUf8M8/ED/AJ8L
T/wMT/Gnp3X3oLvs/uf+R5eKUV6f/wAM8/ED/nwtP/AtP8aP+GefiB/z4Wn/AIGJ/jRdd196
/wAxXfZ/czzHNO7V6Z/wz18QP+fC0/8AAxP8aX/hnr4gf8+Fp/4GJTvHuvvQtez+5/5HmVFe
m/8ADPfxB/58LT/wMSj/AIZ7+IP/AD4Wn/gYlHu9196/zFr2f3P/ACPMaaTXqB/Z6+IB/wCX
C0/8DE/xpD+zz8QD/wAuFp/4GJS07r70Um+z+5/5HlxpDXqP/DPHxB/58bT/AMDEpP8Ahnf4
g/8APhZ/+BiUtO6+9f5ju+z+5/5Hl9Feof8ADO/xB/58LP8A8DEo/wCGd/iD/wA+Fn/4GJRp
3X3r/Md/J/c/8jy/NBNeof8ADO/xB/58bT/wMSj/AIZ3+IP/AD42f/gYlGndfegv5P7meX9a
MV6h/wAM7/EH/nxs/wDwMSj/AIZ3+IP/AD4Wf/gYlGndfegu+z+5nl9Ga9Q/4Z3+IP8Az4Wf
/gYlH/DO/wAQf+fCz/8AAxKNO6+9f5hfyf3M8wzSV6h/wzx8Qf8Anxs//AxKP+Gd/iD/AM+N
p/4GJRp3X3oV/J/c/wDI8vNJmvUT+zx8Qf8Anxs//AxKT/hnf4g/8+Nn/wCBiUad196/zHfy
f3P/ACPLyaM+1eof8M7/ABC/58bP/wADEo/4Z3+IP/PjZ/8AgYlLTuvvX+Y7+T+5/wCR5cTQ
DXqJ/Z2+IX/PjZ/+BiUn/DO3xC/58bP/AMDEo07r71/mF/J/c/8AI8wzSE16h/wzt8Qv+fGz
/wDAxKP+GdviF/z42f8A4GJRp3X3r/ML+T+5/wCR5dmlzXqH/DO3xC/58bP/AMDEo/4Z2+IX
/PjZ/wDgYlLTuvvX+YX8n9z/AMjzDNGa9Q/4Z2+IP/PjZ/8AgYlH/DO3xB/58bP/AMDEo07r
70F/J/c/8jy/NJXqP/DO3xC/58bP/wADEo/4Z2+IX/PjZ/8AgYlPS26+9f5hfyf3P/I8upc1
6f8A8M7fEL/nxs//AAMSj/hnb4hf8+Nn/wCBiUad196/zC/k/uf+R5fRXqP/AAzv8Qf+fGz/
APAxKP8Ahnb4g/8APjZ/+BiUrLuvvX+YX8n9z/yPLhS816h/wzv8Qf8Anxs//AxKX/hnf4gf
8+Fp/wCBiU9O6+9f5i5vJ/czy6ivUf8Ahnf4gf8APhaf+BiUf8M7/EH/AJ8bT/wMSnp3X3r/
ADDmfZ/czy6lya9Q/wCGd/iB/wA+Fp/4GJR/wzv8QP8AnwtP/AxKWndfev8AMOZ9n9zPLs0Z
r1H/AIZ3+IP/AD42f/gYlJ/wzv8AEH/nws//AAMSjTuvvQX8n9z/AMjzDNGa9Q/4Z3+IP/Ph
Z/8AgYlH/DO/xB/58LP/AMDEp6d196C/k/uf+R5hmgGvT/8Ahnf4g/8APjZ/+BiUD9nj4g/8
+Nn/AOBiUad196/zFfTZ/c/8jzHNGa9P/wCGePiD/wA+Np/4GJR/wzx8Qf8AnxtP/AxKNO6+
9f5i17P7meYZozXp/wDwzx8Qf+fG0/8AAxKP+GePiD/z42n/AIGJRp3X3r/MNez+5nmGaM16
f/wzx8Qf+fG0/wDAxKP+GePiD/z42n/gYlPTuvvX+Y9ez+5/5HmNBNenf8M8fEH/AJ8bT/wM
Sj/hnj4g/wDPjaf+BiUXXdfev8wv5P7n/keYZpa9N/4Z4+IP/Pjaf+BiUv8Awzx8Qf8AnxtP
/AxKLruvvX+YX8n9z/yPMqAa9O/4Z5+IP/Phaf8AgYlH/DPPxB/58LT/AMDEouu6+9f5i17P
7n/keY5pwNemf8M9fEH/AJ8LT/wMT/GlH7PXxBH/AC4Wn/gYn+NO67r70J37P7n/AJHmdLmv
TP8Ahnv4gf8APhaf+Bif40f8M+fED/nwtP8AwMT/ABp3j3X3r/MnXs/uf+R5mDSV6b/wz58Q
P+fC0/8AAxP8aP8Ahnz4gf8APhaf+Bif40Xj3X3r/MNez+5/5HmeaM16Z/wz58QP+fC0/wDA
xP8AGl/4Z8+IH/Phaf8AgYn+NPmXdfev8w17P7meY0ua9M/4Z8+IH/Phaf8AgYn+NL/wz58Q
P+fC0/8AAxP8aLx7r71/mGvZ/c/8jzLNLmvTP+GfPiB/z4Wn/gYn+NH/AAz58QP+fC0/8DE/
xovHuvvQWfZ/c/8AI8zpK9N/4Z8+IH/Phaf+Bif40f8ADPnxA/58LT/wMT/Gi8e6+9Br2f3P
/I8zpK9N/wCGfPiB/wA+Fp/4GJ/jR/wz78QP+fC0/wDAxP8AGnzR7r71/mFn2f3P/I8yozXp
v/DPnxA/58LT/wADE/xo/wCGfPiB/wA+Fp/4GJ/jS5o9196Cz7P7n/keZZozXpv/AAz58QP+
fC0/8DE/xo/4Z8+IH/Phaf8AgYn+NPmj3X3r/MLPs/uf+R5jQTXpv/DPnxA/58LT/wADE/xo
/wCGe/iB/wA+Fp/4GJ/jU3j3X3oevZ/c/wDI8xNITXpx/Z7+IB/5cLT/AMDE/wAaT/hnr4g/
8+Fp/wCBiUrruvvQ9ez+5/5HmOaTNen/APDPPxB/58LT/wADEpP+GefiD/z4Wn/gYlLTuvvX
+Y9ez+5/5HmOaQmvUP8Ahnn4g/8APhaf+BiUn/DPHxB/58bT/wADEouu6+9f5hr2f3P/ACPM
PwpK9P8A+GePiD/z42n/AIGJS/8ADPHxB/58bT/wMSi67r71/mO77P7n/keYZozXp/8Awzx8
Qf8AnxtP/AxKP+GePiD/AM+Np/4GJS07r71/mLXs/uZ5hmjNen/8M8fEH/nxtP8AwMSj/hnj
4g/8+Np/4GJRp3X3r/MNez+5nmGaM16f/wAM8fEH/nxtP/AxKT/hnj4g/wDPjaf+BiU9O6+9
f5hr2f3P/I8ypSa9NH7PPxB/58bT/wADEpf+GeviD/z42n/gYlF13X3r/MNez+5/5HmGaXNe
nf8ADPPxB/58LT/wMSj/AIZ6+IP/AD42n/gYlGndfev8w17P7n/keY5ozXp3/DPXxB/58LT/
AMDEo/4Z6+IP/Phaf+BiUad196/zDXs/uf8AkeYZozXp/wDwz18Qf+fC0/8AAxKxfFPwk8V+
DNEbVtet7eG1Eix5S4VyWboMD6H8qas9mvvQXtun9zOKopKWkMSijFGKBhTacabQAUGlpKBi
Ud6WjFACUUuKSpAKKKKACigUUAFFLRTGFFFFAgooopiClpKUUAFJTqKAEzRS0hoASlFJRQAU
UUUAB60UUUhhRRRQIDRRRQMKKXFGKQCUUuKWqENpaWkoAM0UYooAjxQRRigis2aH0V+zNcma
SeIn/UQzqBnsXhb+pr6Hr5l/ZalJ8T6xD/CtnuH4ug/9lr3zxjB9q0MW/nSwiWTbvhJDj5Wx
jHviuWv09P1ZrRekvX9EY9v8TdOu/Ekmg20aNqUaCRoC0gIUqGHPl7fusDgE10Om6zLfXzW0
1qISIy4IcnoQMYKj1rw250e/f4gW+vrBHY7l2/NK7PGFjCDzFVMfNjjaX684r1LwRa6pHevN
qYV1eJjHLHuKMp8vbyyjOcMeK3rUsOqUZ05O9ldPv16bFRlJys9jtaK47WbSDWPGNzYanZWm
pC306O4sLC/OIJHLusjn5WyQBGM7SVDcferKsfF+sXA0ix8LaEggGmW929vuSTbG7FQiu8sZ
UKEI3hX6j5RjnhWv9ev+Rq9L+X/A/wAz0aivOvEOt+I2s722a9t9LvI763MMIsZN3kNdKit5
yzbXDZXIAUgZUgZBq9Jr1/a6zd6bZRabBe3Gqw2ZvDbMEZjaLKzugcF2O0qo3DA28nHItVf+
un+Yzt6K4iLxL4hvrux06ybS47mX7ak11JBJJExt5EQMiBwcNuIILHB7nGDUh8c+IdVuNLj0
TSI5nl023v7pAEbPmMQVUvNGVA2H5gsnUZUY5Frt/W/+Qnon5f8ADHoVFYWtanqEetafpGkv
a2095HLN9pu4mlQCPblAiuhZjvz94YCnrWXeeJtXh1K/aFtP+x6ZeW9nNbvE/nXDSiMlkbfh
P9aNqlWztPIzwLX+vl+YHY0Vwq+JvEs91D5P9lRwXWrXOlwhoZGaPyzJtlb5wG4iIKDGTzuG
cAt/FWv31zp2nQPpVveTNfxT3EsMjR7raVUDIgcHDAklS3HXJxgnS/8AXcdrO39df8md1RXC
p46vn0O+v2gtYjB4fTU4wwYq0p80EZyMp8i46H5uvNU28R67pC+KdRlngvUjvLaG1tvKZRE0
qQgHLS7do8zJX5QzZO5c8HW39b2/MX9fk/1PRqK46x1zxPLq2kadqNpa2MtyLiS4M0I3PHE0
WNipM4QkSEcu2CM4/hrsaOlwCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiq2oSX0VhI+lW9vc3Yx5cVz
cNDG3Izl1RyOMn7pyeOOoxPt3jf/AKF7w/8A+D6f/wCQ6AOkooooAKKKKAMjVfFnhzQbpbXX
Nf0vTbh0EixXl7HC7KSQGAYg4yCM+xo0rxZ4c166a10PX9L1K4RDI0VnexzOqggFiFJOMkDP
uKpWP/JU9d/7Aum/+j76i+/5KnoX/YF1L/0fY0AdJRRRQAUUUUARW93b3kbvaTxTokjRM0Th
grqxVlOOhDAgjsQRRBd29zJOltPFK9vJ5UyxuGMT7Q21sdDtZTg9iD3rz3xP/af/AAkt5/wr
rf8Abtg/t3ytvl7do27N3y/bNuNufl248zjy667wn/Y3/CNW3/COf8ePzfe3eZ5m47/M3fN5
m7du3fNuznmgDZryb9pH/kkrf9f8P/s1es15N+0j/wAklb/r/h/9mreh/EXz/IxrfB935nyU
KcKaKcK7kcrFooooEFFFFACYpDTqQ0DG0UuKMUDEopTRSATFJilooC4gFKKXFAFMBKWlxiig
QlFLRigBMUuKMUtACYoxS0UCEoxS0UAJRRRQMKMUCloAbilAzRQKADFJinUUCExRilooAKTF
LRQAmKMUtFABRRRQAmKKWigAooooAZtxTMVKKaRUWLPcP2Wf+Rw1z/rwX/0YK+hfE+gf8JHp
kdp56QbJhLueHzAcAjGMj1r57/Za/wCRw1v/AK8F/wDRgr6drmr6OPp+rNqOql6/ojzt/hW7
7v8AibW3zTGc507q53ZP+s6fO3HTnpwMdxpGnjSdFs9PV/MFrAkW/GN20YzjJxnrirlFc92z
dJIp6lo+mazCkOsadaX8SNvVLqBZVVsYyAwODzUd74f0bUhbjUdIsbsWoxAJ7ZH8kcfdyPl6
Dp6CtCikMzE8N6HHHeImi6eqXxzdqLVALg5J+cY+bkk8561JLoWkTWUtnNpdlJazbfNge3Qo
+0ALlcYOAqgZ6AD0q/RQBWh02xthbi3s7eIW0ZigCRKvlIcZVcD5Qdo4HoPSqtz4b0O9itor
zRdPuI7QYtkltUYQjjhAR8vQdPStOigCpqWk6drFsLfV7C1v4FYOIrqFZVDdM4YEZ5PPvTG0
TSn1GDUH0yza9t02Q3Jt0MkS88K2Mgcngepq9RQBXXTrJdm2ztx5czTpiJflkbO5xxwx3Nk9
Tk+tZGpeD9K1TVbO4vLOzltbdLgPZy2qukrysjFyDxnKE9CSWzmt+igDPvtA0bUzCdS0mxvD
ApSE3FsknlqeCFyOB9Kc+iaVLNPNJplm8txD5EztbqWlj/uMccr7Hir1FAFCw0PSdLCDTNLs
rMR7tgt7dI9u7G7GAMZ2rn1wPSr9FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAG
RqvhPw5r10t1rmgaXqVwiCNZbyyjmdVBJCgsCcZJOPc0aV4T8OaDdNdaHoGl6bcOhjaWzso4
XZSQSpKgHGQDj2Fa9FABRRRQAUUUUARW9pb2cbpaQRQI8jSssSBQzsxZmOOpLEknuSTRBaW9
tJO9tBFE9xJ5szRoFMr7Qu5sdTtVRk9gB2qWigAryb9pH/kkrf8AX/D/AOzV6zXk/wC0h/yS
U/8AX/D/AOzVtQ/iff8AkY1vg+78z5JpwptOFdyOVi0UUUxBRRRQAUhpaKAEopDS0DCkpaQ0
AFJS0uKAFooooEFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAIKQinYpCKBnuH7Lf8AyOGt/wDXgv8A6MFfTbHCnHpXzZ+zDY3M
HiLUryaLZBdWJELEjL7ZFDHHXGTjPQkEDocfShGQRXDiru1u36s6KGz9f0R5h4S8VT3Hgy21
jV9f8R3M8wtBMsmlRQRI8sqJiJ2t0V1JbBIZyFyQc4NW2+J9l4e0x38RzGe5m1O/ht4xLbwf
uYJ2QfNK8acDYMZLHPQ4JHTr4RsF8IWXhwTXP2Oy+z+W+5fMPkyK65O3HJQZ4HGelVJPAlqs
kU+narqWm3kVxdTrd2zRF8XEnmSRlZI2Qpu2kZXI2jnrnJtX08/0t/XY6tLfP9GdFaXUN9ZQ
Xdq++C4jWWN/7ysMg/kampkKNFBHG8rzMqhTI4AZyB1OABk+wA9qfSdr6EK9tTkPEPiK/sPE
sJtJUTS9NET6oGQHcJ3KL8x+7sALnHbFP13xj/Z1xqVhcaXrFqttp894dRt/srqsca5LKDIx
DE8KHQAkHjAJD734beFdVm1K41fSLXUbvUXZpLu7t45Jo8oECo5XKhQox6detRN4AWT+00uP
EeszwapbG2uYZPsxDJ5XljDeTvGASwAbG4k4OTmVt/X9aFK3Nd7f1+ZNL45s7e+e3FhqNxbW
8kMF3qKRx+TbyShSquN4cnDoSURlG4ZIwcJaePrK71iOy/s3UoIZb2ewS+mjjEDTw79yDDlu
RGxDbdp6ZzkCSXwPZSam9wt/fx208kU11p6PH5FzJEFCO+ULg4RMhWVTtGQcnM0fg/T41tQJ
bhhbanNqaBmX5pZfM3Kfl+7++bA68Dk96f8AX4f8H8BL4fP/AID/AFsU/CXxG0PxnqFxaaM5
ZoY/NVjNC/mx7sbtscjMnb5ZFRuenBx1dYfh3wz/AMI3GLa11fUbnT408u2sbnymjtlzwqsI
xIQBwNztxW5Q7dA6sxPFl/eaVoY1GyfatrcQyXK4B3W+8CXqDjCFm4wfl61l/wDCRv8A220t
1d3UdjJqx0+zit442WQxwO0hkLDdtLq4+U5zGuOC2equ7WK9s5rW5QPDPG0cin+JSMEfkaw7
TwZp9lpGi6fBcXezRpzcQyvIrSSyFJFLSEr8xPmsx6c/lU/1+X+W3mPT+vnb8fyItL8c2mp2
Wl3Y06+t7fVrkW9lJI0DiXMbyB/3cjYXEbDBwwPBWqutfEvSND0RtWvLe4+ypeT2bkzW8RDw
sysQJJVL52MQqbmI/h7U5Ph7apDM/wDbGpHUZb1L7+0glskyyqhjBCrCIz8pYEshJDdeBiGX
4ZafJYi3TWNXiZlu0nnSSIyTpcuHlViYyACwGCoUj1p/1+X/AAb/AHoNP6+f/AsNh8UTf8JR
e21xdXbw/wBrxWtlDbRxYcNYibY5cA7SdxyCDnaM7cipZPiC0WlX9/J4U1wR6fN5M6B7Mtu2
gnbi4w+CQuFJO47cZBAvP4JsDfG7juryKf7al6rKyfLItt9nGAVPGznB/i9uKoR/Dx4tMs7F
PF2veVZTieAlLMkOM8tm3w5yxbLZO7DZyM09Py/T/gh29Px1/wCAW5fHen23i7T/AA5e209t
faggaIPPbkglGfa0aymQY2MN2zZkY3dK6euYh8DW8Wupqj6vqUrLcrePA7QiOScQ+T5jbYw2
Sn8IIUHoBXT0dCeojBipCEBscEjODXOeDpdRmTUWvNTn1SyW5MdpdXUUUcj7Plk4iVRsDqwG
Ru4PUbSekqrp1j/Z9q0P2q5ut0skvmXMm9hvcttB/uru2qOwAHakPoWqKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAryf9pD/kkp/wCv+H/2avWK8n/aQ/5JKf8Ar/h/
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
P/4ij7Hcf9BK4/74j/8AiKuUUAU/sdx/0Erj/viP/wCIo+x3H/QSuP8AviP/AOIq5RQBT+x3
H/QSuP8AviP/AOIo+x3H/QSuP++I/wD4irlFAFP7Hcf9BK4/74j/APiKPsdx/wBBK4/74j/+
Iq5RQBT+x3H/AEErj/viP/4ij7Hcf9BK4/74j/8AiKuUUAU/sdx/0Erj/viP/wCIo+x3H/QS
uP8AviP/AOIq5RQBT+x3H/QSuP8AviP/AOIo+x3H/QSuP++I/wD4irlFAFP7Hcf9BK4/74j/
APiKPsdx/wBBK4/74j/+Iq5RQBT+x3H/AEErj/viP/4ij7Hcf9BK4/74j/8AiKuUUAU/sdx/
0Erj/viP/wCIo+x3H/QSuP8AviP/AOIq5RQBT+x3H/QSuP8AviP/AOIo+x3H/QSuP++I/wD4
irlFAFP7Hcf9BK4/74j/APiKPsdx/wBBK4/74j/+Iq5RQBT+x3H/AEErj/viP/4ij7Hcf9BK
4/74j/8AiKuUUAU/sdx/0Erj/viP/wCIo+x3H/QSuP8AviP/AOIq5RQBT+x3H/QSuP8AviP/
AOIo+x3H/QSuP++I/wD4irlFAFP7Hcf9BK4/74j/APiKPsdx/wBBK4/74j/+Iq5RQBT+x3H/
AEErj/viP/4ij7Hcf9BK4/74j/8AiKuUUAU/sdx/0Erj/viP/wCIo+x3H/QSuP8AviP/AOIq
5RQBT+x3H/QSuP8AviP/AOIo+x3H/QSuP++I/wD4irlFAFP7Hcf9BK4/74j/APiKPsdx/wBB
K4/74j/+Iq5RQBT+x3H/AEErj/viP/4ij7Hcf9BK4/74j/8AiKuUUAU/sdx/0Erj/viP/wCI
o+x3H/QSuP8AviP/AOIq5RQBT+x3H/QSuP8AviP/AOIo+x3H/QSuP++I/wD4irlFAFP7Hcf9
BK4/74j/APiKPsdx/wBBK4/74j/+Iq5RQBT+x3H/AEErj/viP/4ij7Hcf9BK4/74j/8AiKuU
UAU/sdx/0Erj/viP/wCIo+x3H/QSuP8AviP/AOIq5RQBT+x3H/QSuP8AviP/AOIo+x3H/QSu
P++I/wD4irlFAFP7Hcf9BK4/74j/APiKPsdx/wBBK4/74j/+Iq5RQBT+x3H/AEErj/viP/4i
j7Hcf9BK4/74j/8AiKuUUAU/sdx/0Erj/viP/wCIo+x3H/QSuP8AviP/AOIq5RQBT+x3H/QS
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
QtP68rf8EL7f13/zPPkn1/U5dI1p4tV08XuqAS2X7z/RbdLaZfnjxjmX5skc5j9BXPSf8JCf
CK29g+uLBHqUaX2pSw6k89zF5RzIts7pcRjzPLysLY6kEjco9iooDt/Xf/MyPCizJ4VsFubu
e9kWPaZ7i1lt5HAJxujmJkBAwPnJY4ySc5rXoopt3dyUrKwUUUUhnC+L/wDkXfFX/XVP/RMN
d1XC+L/+Rd8Vf9dU/wDRMNd1QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAVj67/yCdQ/65Sf+ixWxWPrv/IJ1D/rlJ/6LFAD/Cv/ACJ2jf8AXhB/6LWtWsrwr/yJ2jf9
eEH/AKLWtWgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK5bxkyp
JpjOQoF6uSTj/ljPXU1y/jD/AF2l/wDX6v8A6JnrSn8Xyf5MzqfD81+aJLO5g2j9/H/32K01
mtJoWjlkhdHBVlZgQQexFUbP7orWh6VmaCxTWkMKxxSwoiAKqqwAAHYCmwXFv5LBpo+XfgsO
m41aHSigDmf+EV0PzNv2qb7Jv3/YftZ8jOc/c+vbpW600LzW6xSI2HPCsDgbWqzRQAVWSeKO
ecSSoh3g4ZgP4VqzRQBUuv7OvbdoL37LcQt96OXa6n8DxUEljoktlHZy2unvbRHMcDRoUQ+o
XoOprSooAphNMWGSELaCKUbZEAXa4xtwR34AH0FV/wCztB8iKH7Hp3lQkmOPyo9qE9SBjjNa
lFAFZ5LKTy9727eWdyZKnacYyPTgkfjTY/7Pi8ryvsqeShSPbtGxTjIHoOBx7CrdFAFAQaSu
oG+EVkLwjBuAqeYRjH3uvTilt4dKtCDax2cBBYgxqi43Y3dPXAz64FXqKAM2Ox0SJpWitdPR
pgwlKxoC4b72fXPfPWp3/s6Tf5n2VvMTy33bTuTn5T6jk8e5q3RQBnyW2jzXkd3NBYyXMQAj
mZELoB0w3UVIE0wIiBbQKkZiRcLhUOMqPQHA49quUUAU7dNMswBaLaQAKEAiCrhQSQOO2SeP
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
bGyrsrD0pI/HlmiyX1zb6vAXsLW5j02aGHdmeV44lUKSfMdgAQzbQNv3fmqNPhjaR6XJYpr+
shGggtVbNuTHBCxZIgPJ2lecHcCWHBJGav3Hga1vlnfUdT1G7up7eCA3bmJJFMMrSxSKEjVQ
6u/93adoyDzkVv6/r+n5D7/12/4JHL4/t4IY1m0XVk1B74WP9neXEZhK0TSryJDHtKr94OQM
8kYOJdL8WWms6ppiwf2hbSXUV4Gs5Y4gqPBIkcgkIyQyscDYxUgknPFSW/gy0imtri6v769v
IL4XzXU7Rh5pBE0QDBEVQoRsAKq8jPUnMmn+ELDTdVh1CCa5aWGS8dVdlKk3MqySZwvYqMeg
65601a+v9af5g7dP63/4H4m9RRRSEFFFFABRRRQAUUUUAcL4v/5F3xV/11T/ANEw13VcL4v/
AORd8Vf9dU/9Ew13VABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA
UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWPrv/
ACCdQ/65Sf8AosVsVj67/wAgnUP+uUn/AKLFAD/Cv/InaN/14Qf+i1rVrK8K/wDInaN/14Qf
+i1rVoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuX8Yf67S/8A
r9X/ANEz11Fcv4w/12l/9fq/+iZ60p/F8n+TM6nw/NfmizZ/dFa0PSsmz+6K1oelZmhZHSig
dKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKAPgSX/j6l/wB8/wA6KdMMXUv++386TFe9HY8SW4360Zp2KTbViENIRTiKSpGM
IpDTqMUDG4pCMU40mM1IxtFLtoqbMZFmmE0vWmms2anr/wCzj/yUB/8Ac/8AaclfVdfKf7OH
/JQG/wBz/wBpyV9WVxYn4l6fqzqw+0vX9EFFFFcp0hRRRQBm+INVs9H0O6ur++gslET7ZZpR
GN204wSRzXOaX4hi1O6jl0+7huLSSYCKW3vXl4WVUbd8xUghsj2rkNS1y5v723W5isbiYJIy
ma5l3RD5Aee27J4AA+SsuW9ubC+a6tTZxXLI9xKYJ3LHYysCxbO4kkkA91NVyXM+Y9p1vV4N
D0mW+uUkkClUjiiA3yyOwVEXJAyzMAMkDnkiqlhqmqxQXVx4qsNP0i3gjEouIdSM0YXndvLx
x7NoAOeRz14qXxJo8uuaI9pbXItblJYriCZkLKskUiyLuUEZXKgEZHBPNcVqPw/1XXP7cvbm
10nSL7UY7PEVhdSss8lvMZd8kyxxupbITIBZQAQTgCpRrpY7M+LfDYtLO6PiDSxb3zmO0m+2
x7LhgcFUOcMQeMDPNUdG8c6P4jCtoV9YTot9JZTB71A+V34KKu7fu8ssoJXKZbtisKLwjrtr
9im0mztdMv1ncz3h8QXN6yxs0e8ETQHztwT7rbduBtYZJFm28IaulzbRzNZrbWmv3GppKk7m
SSKZZ8grsAVlMyj7xBAJyOlP+vxQuj/ro/1sdNB4m0G5kvo7bW9OlfTwTerHdxsbYDOTIAfk
xg5zjoaW38SaHd2t5c2ms6fPBYki7liukZbcjk7yDhcYPXFcOngDW5vDI0e6GlQjT9EudKsb
iGV2a5MqBA8oKDyh8gJVTJknOfl5t+IPh9d6ot8tjLbWyS6dYQQoskkQaS1neXaWQBkUgqoZ
TuXkgcDK/r8/6sOy/r5f5v7jtbDU7DVdPS+0u9tr2zkzsuLeVZI2wcHDKSDggj8K5+Hx3p+o
atcWujXOmXltBBbS/bv7RUQsZZniKblVhuGzgZ+YsF460y08KzyeA9W0SeCPT7jUUmRmGpT6
iMum3e0kyq5916YHXmsebwX4h1S8vL2/h0axluItNiEVnPI6j7NdGViWMa5yvCjHHToM01bm
XbQX2f67r9LnZL4m0F7i6gXW9OaazdUuYxdx7oGZtqq4zlSWOAD1PFIvijQG0V9YXXNNOmI2
x70Xcfkq2cYMmdoOSB1715/4q0HWLLw5q8U0VnFpNxf2ZtdPN211G0j3yMztviVow2eYwXXk
4xjnXk8Ja9Ldf240OlJqq6smoDTxcObZlW3NvgzeUG34Yvu8vqAuP4qS1V3/AFt/mO39fI6m
XxPoEFvZTz63pscOoECzke7jC3JOMCMk4fqOmetZv/CdaRD4gtNDvr7T49SvTP5EcN6jr+7k
CBWJ2sHYkjaFOCjjJ284/wDwiGvWv2K40sWNrqTXM09zdRXjoluk0wkkiSIxMs6kDq3lnIyC
hPE2n+EdX0zXrG/iNlOkd3qTTI07oViup1kVl+Q7mULgqcDJ+9xyf8H+v+D+gd/67/1Y6Wx1
6xudIN7Pf6cqxRLJcvb3iyww5UNnzCF+XByCQMjmrGnXhvreSQtasUmki/0W485RtYrgnAw3
HK/wnIycZrjNK8BahY2ugWslxa/Z4LOC31dFZj55tzvh2ZXpvLBs4yvFdL4Y0i40XT7uC6eN
2n1G6ulMZJASWZ5FByBzhhn39ap2uxPy/rRmzRRRUgcL4v8A+Rd8Vf8AXVP/AETDXdVwvi//
AJF3xV/11T/0TDXdUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFY+u/8
gnUP+uUn/osVsVj67/yCdQ/65Sf+ixQA/wAK/wDInaN/14Qf+i1rVrK8K/8AInaN/wBeEH/o
ta1aACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArl/GH+u0v/r9X
/wBEz11Fcv4w/wBdpf8A1+r/AOiZ60p/F8n+TM6nw/NfmizZ/dFa0PSsmz+6K1oelZmhZHSi
gdKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooAKKKKAPgmX/j5l/3z/OgDNEv/AB8y/wC+f50CvoYLQ8Ke4FaTbTs0dauxFyMijbmp
QmaUpijlDmICmO9BSpcUhFJxQ+Yi2H0pNmKkpM1NirsiKmipDRSsPmZRFNNOFIa5mdKPXf2c
P+SgN/uf+05K+rK+U/2cP+SgP/uf+05K+l/EenX+p6Q0Wj6lJp17G6ywyryrMvRXHdD3H8+l
cWJ+Jen6s6sPtL1/RGrVHWNTTSdNe6dd5BwiZxuP+efwrn/DieKtW1ddV8S/8SmC2RoYtMt5
NyzP0aVz3GR8o7Dn62/G4STRIbY8TXNyscEmARG4VmBI7jCkfj+NcvodJUi8cQR39tZ3EkNx
cTqzeRAAjoAMk/M2P5dR7CtfS/Etjq1+9nbh1nWMyFWKHgEA/dY92HWuQfw5NeRQrdTw28kQ
K+dbXcjFlO7ja8W0feY5wTyeRmo/h5ZaNbeKLh9PuZ7u5Nq6+axAVV3RMRjy0OTuQ5579K3X
slC0viOWTre2SjblOq1S28KaR9mbVbDTYPtlwtvCXtFO+Rug4X9Tx61cbwxoLfe0TTj9bSP/
AArlvF2na94h8Q3FppulWs9lbac8InvryS1HnTfxxlYZNxRUHPGC5FU4v+Eq1e4udRSLULPU
ofDsZtrZ5JIrYahmdXypwj87cbsjBRv7prC+l/66/wCX4o6+XX+vL/P8Gd/ealaWE1nFdy+W
97P9ntxtJ3ybWfHA4+VGOTgcVI1yiXkdsVl8yRGdSIWKADGcuBtB5GASCecZwa84l0uDWbLw
9FpY8UKi6wr30l+bxJ4x9lmDENNyikkKWjwoLfKQcGktdO8TXP2bTUu9Xt1iTV4YrqaSU4KX
Ef2RpGJ+f5RwWOWXdycmnbv5/lf+u4b28/8Ag/5HpE1ykEkKOspM77EMcLOAcE/MVBCjjq2B
nAzkipq8/iuPEGo3Gj621rqlp9s1RRLpxZ1EFultMMSLwAGl5yRg5j9BXMafdaymn63PqVr4
kkguoLZ4LSKLVEa2uWkkDIH8xpXVAVLtHtRlX5VycUg8/wCt7f15ansK3KNePbBZfMRFckws
EIJIGHxtJ4OQDkcZHIqavLJo9bh0+4i0W48R3NhHpdgjT3CXC3MgF1ILplEgDiYxZPA3427f
4amjsdTvvsVtp8/iSLQ5tcUI1xNcx3ItvssnmB3k/fLGZcAFyCDjaQNhp21t/W9v6+Yf1+Fz
02ivH9Wt/FI03TbKW91q202C81GF7lbW9u5yFmxbF/s8qTsvl7sOSynjcCSDXq+nGQ6XameZ
p5PJTfK8JiZztGWKHlSeu08jpRuriejsWaKKKQBRRRQAUUUUAFFFFAHC+L/+Rd8Vf9dU/wDR
MNd1XC+L/wDkXfFX/XVP/RMNd1QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR
RRQAVj67/wAgnUP+uUn/AKLFbFY+u/8AIJ1D/rlJ/wCixQA/wr/yJ2jf9eEH/ota1ayvCv8A
yJ2jf9eEH/ota1aACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArl
/GH+u0v/AK/V/wDRM9dRXL+MP9dpf/X6v/ometKfxfJ/kzOp8PzX5os2f3RWtD0rJs/uitaH
pWZoWR0ooHSigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigD4Lk/4+Zf8AfP8AOgClkH+ky/75/nSgV9HBaHz83qNxmnBPWnKt
PxxWiRDkMPHSilPam/Sm9xAcUxh6U4g0YqbDIippNvrU22jaDU8rK5iDbRUhX0opcrKuZlIa
UGkJrjOw9e/Zx/5KA3+5/wC05K+q6+VP2cf+SgN/uf8AtOSvquuLE/EvT9WdWH2fr+iCs/Wd
Gg1yzjguZJofKlWaOSBgrowzggkH1I/GtCiuU6Tm/wDhDF/6Dur/APfyL/43RpfhbT/Csk9/
ZtPNK0YjPmFFABI6BVAzwOcZ4HoK6Sqmp/8AINl/D+YoAojxCrMyrChK9d06rj/vrGfwpD4i
QSiNoVDEcYmVgfxXIrzi5v8AxBpWn21vpOpabbJGFWV/P887sEYMYkj2n5V5LZ+8MfLk0lv9
a1y6ht9QullunjaFUhuN0L5X5nI3nZ1Py/MSEHPOAO62A9Y/tv8A6d//AB//AOtR/bf/AE7/
APj/AP8AWri/Gly9p4XlkWd7eJpoY7idG2mKFpVWRt2Rtwhb5u3XtXN3upW3gmfWodC8NadZ
SpDaNDJaOAs4lmaJWkTEagqdx+/yMAsOoFqO2h6x/bf/AE7/APj/AP8AWo/tv/p3/wDH/wD6
1eanX/FNra2U2sWcOmweay3d1JZedxuUR/u4rhjHu3MN25wNuTgGqOjajqkMdm2sSWeqNL4i
ureJ2tmDwBftGShaRsH5AFx91SV560C6X/rZv9D1j+2/+nf/AMf/APrUf23/ANO//j//ANav
Kk8aa1HoI1Wb+zZkvdIuNStYIo3DWxjUMFkO8+YPmALAJgjpzw+/8Y65o1tqK30NjdXKW9pP
bG2jMap9olaLa++TDbSM53IG77OtFnsO39fd/mj1L+2/+nf/AMf/APrUf23/ANO//j//ANau
Gg1vWLLwXf6rr+nCG8so5ZREdsYlVV3AkLJKE9D87dM98Vy13f3tr4j1CbVTpOp3AtNLX91A
wiAe7cA7GdiGG7IO7qFOB0ppXlYXS/8AW6X6nsX9t/8ATv8A+P8A/wBaj+2/+nf/AMf/APrV
5rceK9W07+0l1JLaK5SVEtbZrZ0VI3m8pJnm3ssi/MGIAVh0IGQauXuoeILfUNO0aO90sX11
DPcPeSWUgi2xlBsWLzs7j5gJO/gKeOeJ6XHbWx6Ja6r9puVi8nbuzzuz2z6VoVx3g3Un1iw0
zUZY1ie5hEhVG3Lyp6HuO4PpXY09hBRRRQAUUUUAcL4v/wCRd8Vf9dU/9Ew13VcL4v8A+Rd8
Vf8AXVP/AETDXdUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA
FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFY+u/wDI
J1D/AK5Sf+ixWxWPrv8AyCdQ/wCuUn/osUAP8K/8ido3/XhB/wCi1rVrK8K/8ido3/XhB/6L
WtWgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK5fxh/rtL/AOv1
f/RM9dRXL+MP9dpf/X6v/ometKfxfJ/kzOp8PzX5os2f3RWtD0rJs/uitaHpWZoWR0ooHSig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK
KKACiiigD4Nk/wCPqX/fP86eopWXNzL/AL5/nUijFfTU1ofOTeomKQ06mmtehmNNN5pxpBUd
ShpoFKRSUDCiikNDAM0UUUijIzSZoNJXnXZ6B6/+zh/yUB/9z/2nJX1ZXyn+zh/yUF/9z/2n
JX1VIzLGzIm9gCQucbj6Vx4n4l6fqzpw+0vX9EOpGYIpZiFUDJJPAFVNN1KLUYCyAxyodssL
/ejb0NSagcabcn/pi/8AI1ynSJ/aNl5ip9st97EKq+auST0AGaW/ieaykjjG5jjAz7iuAtrf
Tv7Yjv7dNOgka5i8yWHR3t5JMyqxBkJ5yRk/T8a76y1G11BXNnMJBGQH4IKkgEcH2P8AMdQa
pxsSpXPMf+Ff+Jtsan+ziI0Ea5VTgAk/3OuSeetXdJ8Ea9Z6zb3d2tkY4QQRAFVj8rAdFGeW
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
aw+zTXV87Na3ltLOXTzJvtRUyyN8uN+VGMAKOmMYAuxeFIrbWJL6x1O/tYrgL9rsozEYbllT
YHbchdW2hQSjLnaK3qKXSwXZxKfDG0j0uSxTX9ZCNBBaq2bcmOCFiyRAeTtK84O4EsOCSM1f
uPA1rfLO+o6nqN3dT28EBu3MSSKYZWlikUJGqh1d/wC7tO0ZB5z09FO7Ec7b+DLSKa2uLq/v
r28gvhfNdTtGHmkETRAMERVChGwAqryM9Scyaf4QsNN1WHUIJrlpYZLx1V2UqTcyrJJnC9io
x6DrnrW9RRcP6/P/ADYUUUUgCiiigDhfF/8AyLvir/rqn/omGu6rhfF//Iu+Kv8Arqn/AKJh
ruqACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACsfXf+QTqH/XKT/0WK2K
x9d/5BOof9cpP/RYoAf4V/5E7Rv+vCD/ANFrWrWV4V/5E7Rv+vCD/wBFrWrQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFcv4w/12l/9fq/+iZ66iuX8Yf67S/+
v1f/AETPWlP4vk/yZnU+H5r80WbP7orWh6Vk2f3RWtD0rM0LI6UUDpRQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB8MFT9ol
/wB8/wA6THNSbsXEn++f50pwetfWQ+FHy037zITTKnKg1GY/Sm0CaI80tGzFJ0qNSxDTacxp
M0hoSkNLTWNSykNNFFFRcoxqKbmlzXn3PSPYf2b/APkoL/7n/tOSvq2vlL9m45+ID/7n/tOS
vq2uTEbr0/Vm9DaXr+iCiiiuY6AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooA4Xxf/wAi74q/66p/6Jhruq4Xxf8A8i74q/66p/6JhruqACiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACsfXf8AkE6h/wBcpP8A0WK2Kx9d/wCQTqH/AFyk/wDR
YoAf4V/5E7Rv+vCD/wBFrWrWV4V/5E7Rv+vCD/0WtatABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAVy/jD/AF2l/wDX6v8A6JnrqK5fxh/rtL/6/V/9Ez1pT+L5
P8mZ1Ph+a/NFmz+6K1oelZNn90VrQ9KzNCyOlFA6UUAFFFFABRRRQAUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfCzH/AEiT/fP86kzmomP+
kyf75/nUgPBr6um/dR8vNe8IaSnZptWSBNGc9aRqTpSGgKA1GyelSZppNToUmyJgRUZqct61
GxHcVmzRMjopdooqSzGFIetGaSvMPSPYf2bf+SgSf7n/ALTkr6vr5Q/Zt/5KA/8Auf8AtOSv
q+ubEbx9P1ZtQ+16/ogooormOgKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo
oAKKKKAOF8X/APIu+Kv+uqf+iYa7quF8X/8AIu+Kv+uqf+iYa7qgAooooAKKKKACiiigAooo
oAKKKKACiiigAooooAKKKKACiiigAopDSZoAdRTc0ZpgOopuaA2ehzSAdRTc0ZpgOopuaM0A
OopuaM+9ADqKbmjNADqKbmjNADqKbn3ozSAdRTc0ZpgOopuaM0AOopuaM0AOopuaM0AOopBS
0gCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
rH13/kE6h/1yk/8ARYrYrH13/kE6h/1yk/8ARYoAf4V/5E7Rv+vCD/0WtatZXhX/AJE7Rv8A
rwg/9FrWrQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFcv4w/12
l/8AX6v/AKJnrqK5fxh/rtL/AOv1f/RM9aU/i+T/ACZnU+H5r80WbP7orWh6Vk2f3RWtD0rM
0LI6UUDpRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
RQAUUUUAFFFFABRRRQB8Juf9Ik/3z/Ong1E5/wBJl/3z/OlBr6iD90+amtSUmkJpmaM1dyLD
i1JmmFqTfSuPlH5pCaZuzSE0rlWFzTGozSGoKQUUmaKm5Ri0n1paTFeaeoew/s2f8lAf/c/9
pyV9X18o/s2/8lAk/wBz/wBpyV9XVzYjePp+rNaH2vX9EFFFFcx0BRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBwvi/8A5F3xV/11T/0TDXdVwvi//kXfFX/XVP8A
0TDXdUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIelJSmkxTEFFGKMUA
I33aQsNvBp2KMUARgkkZPrSqcAc8Yp+KMUAMDHqT2zSqSQcmnYoxQAzdx178mg9SQe1PxRig
BmTu6ge1AJOOeop+KMUAMyceuRmlU5PXIp2KMUAMySevrSAnr329KkxRigBgJOOe/agE7uvf
pT8UYoAKKMUYoAKKMUYoAKKMUYoAUdKWkFLSGFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWPrv/ACCdQ/65Sf8AosVsVj67/wAgnUP+uUn/
AKLFAD/Cv/InaN/14Qf+i1rVrK8K/wDInaN/14Qf+i1rVoAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACuX8Yf67S/8Ar9X/ANEz11Fcv4w/12l/9fq/+iZ60p/F
8n+TM6nw/NfmizZ/dFa0PSsmz+6K1oelZmhZHSigdKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPhB/+PmX/fP86Ud6JP8A
j5l/3z/OivpofCj5yXxMQmk3UHik+tUICfWmE0rGmVLZSQ7NGabTqQ7BQTQaaaQwopoopDMj
NFJgUV5x6J7F+zb/AMlAf/c/9pyV9XV8o/s2/wDJQH/3P/aclfV1c2I3j6fqzah9r1/RBRRR
XMdAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAcL4v/5F3xV/11T/
ANEw13VcL4v/AORd8Vf9dU/9Ew13VABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABWPrv/ACCdQ/65Sf8AosVsVj67/wAgnUP+uUn/AKLFAD/Cv/InaN/14Qf+i1rVrK8K
/wDInaN/14Qf+i1rVoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CuX8Yf67S/8Ar9X/ANEz11Fcv4w/12l/9fq/+iZ60p/F8n+TM6nw/NfmizZ/dFa0PSsmz+6K
1oelZmhZHSigdKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo
ooAKKKKACiiigAooooAKKKKAPhCQf6RL/vn+dJg9qbI/+ky/75/nRuz0r6SD90+dkncUsR1p
pag0lUCAmm/SnU3FSMSlzSYopFC5pM0hFNpAOBopAKKCrGRRRRXnHeexfs2/8lAf/c/9pyV9
XV8ofs2/8lAk/wBz/wBpyV9X1z4jePp+rNqH2vX9EFFFFcx0BRRRQAUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQBwvi/8A5F3xV/11T/0TDXdVwvi//kXfFX/XVP8A0TDX
Zfa/9j9aALFFV/tf+x+tZsviHy5nT7LnaxGfM6/pQBtUVh/8JJ/06/8AkT/61H/CSf8ATr/5
E/8ArUAblFYf/CSf9Ov/AJE/+tR/wkn/AE6/+RP/AK1AG5RWH/wkn/Tr/wCRP/rUf8JJ/wBO
v/kT/wCtQBuUVh/8JJ/06/8AkT/61H/CSf8ATr/5E/8ArUAblFYf/CSf9Ov/AJE/+tR/wkn/
AE6/+RP/AK1AG5RWH/wkn/Tr/wCRP/rUf8JJ/wBOv/kT/wCtQBuUVh/8JJ/06/8AkT/61H/C
Sf8ATr/5E/8ArUAblFYf/CSf9Ov/AJE/+tR/wkn/AE6/+RP/AK1AG5RWH/wkn/Tr/wCRP/rU
f8JJ/wBOv/kT/wCtQBuUVh/8JJ/06/8AkT/61H/CSf8ATr/5E/8ArUAblFYf/CSf9Ov/AJE/
+tR/wkn/AE6/+RP/AK1AG5RWH/wkn/Tr/wCRP/rUf8JJ/wBOv/kT/wCtQBuUVh/8JJ/06/8A
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
52m2c0vlRhfMczXOWOOrHHJPNNXtr/Vgeza6W/E2NV8RaJoTwrresWGmtcZEIvLpITJjGdu4
jPUdPWmv4m0GPWxoz63py6oxAFibuMTkkbh+7zu6c9OlcJ4i11fDl34wlubnTrbWbgI+mx6t
FvTULdYFxbxDcm/MnmDapJDPkqdwzkX+pE+M9asJb/T3aXWdNmOhqhW9uGWK2bfG28lUUruI
8s8Iw3L1BHVr+uw2rXPXpb60gvILSa6hjubkMYIHkAeUKMttXqcAjOOmao6j4p8P6OWGr67p
tgVk8phdXkcWH2htp3Ec7WBx6EHvXNeM9KbWPHnh+GCb7Pdx2F9NaXG3PkzK9sVbHcZ4I7qS
O9YMWpvq/g34oXU1u9rPskjngcEGOVbCNXX3AYHB6EYI61P2b+Tf42/r5FRjeSXf+v6+Z3cn
jnwnDYw3kvijRUtbhmWGdtQiCSFcbgrbsEjIzjpkVc/4SHRf7Ug0z+17D7fcxiWC0+0p5sqE
EhlTOSMAnIHY1ymsxanN408Jrol5aWlx/Zd4TJd2jXCbc22RtWSM56c7vwqN9TtdE8ffYrDU
7DUp9VvozqGkED7VbS+Uo+0IMkiMLGhIYH1D9FNW1t/W9v6/pmd7w5vL+v6/4Y9AooopDCii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAMnXf9TH/wBd
4P8A0atZGq/8hKT/AHV/9BFa+u/6mP8A67wf+jVrI1X/AJCUn+6v/oIoAp1sXf8AyK1x/wBe
z/8AosVj1sXf/IrXH/Xs/wD6LFAFzwr/AMido3/XhB/6LWtWsrwr/wAido3/AF4Qf+i1rVoA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuX8Yf67S/+v1f/AETP
XUVy/jD/AF2l/wDX6v8A6JnrSn8Xyf5MzqfD81+aLNn90VrQ9KybP7orWh6VmaFkdKKB0ooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooA+E3/AOPiT/fP86cBTXB+0Sf75/nThX1NP4T5me4UZo/nR9avqQFL2pu4Cl3jHFFx
2YYpMU0vTSTU3GkxxIFMZvSmmmkVDZaQFqKMUVJZh0ZpaQ9a8w9Q9h/ZtOfiA/8Auf8AtOSv
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
EOVV1WNCZACFBxxgHnGiqRa8v6/zX3kOEk/P/gX/AK9DkJvE2sTmZpr6SQzWSWDlwGzAhUqg
yOMFF5HPHXk1Pd+M9fvvIM99h4ZknEsUEcUjyoMJI7ooaRh2ZyTyfU10fhTwrp1te2r6zdrL
e3VhfTw2DWgkiKpHMgLSFuH3IzABSPlByDxVA+CbJLcxS606ajFYw6hcQfY8xJDJsPyyb8s4
SRWIKqOo3etc0Oa39bv/AC3E4zSt/XRfqkVJfH/iOWaF2u7dRC8rpEljAkZMq7ZMxhArBh1B
BB69ahfxv4ge7+0m+VZfNt5Rst4lVWgz5OFC4AXJ4Ax6g1sN8NLmL/j41COPy72aGf8AdZ8u
CMSHz+vIPky4H+yOeaxtf8OQ6NpWn3lvdXF6t2is062yi2DFQxRJRI251JwylVIx0pKVPp5f
8AbjUW/n/wAESDxnrlrHbJFcwkWpl8rzLSFyFk3b0JZCWQ72yhyuTnFVbrxJql5rkGrz3I+3
Wxj8mSOJIxH5eNgCqAoAwMDHauq0Gy03WdN8JpPpdpEG1a4gnMSsGulSKBgHYkk5JIwCANxw
BmsbxFImoaBomrvaWttd3L3EMwtLdIEkEbKVbYgCg/OVyBztHfNONnNJITT5bt7/AOZAvjTW
lW6QvZSQ3UvnyQS6bbPEJNu3ekbRlUYjqVAJ70kPjTW7b7H9lmtbdbMsY0hsYEViybCZAEAk
JUkZfdwT6mu/8X6JY3uvS6DONFsbi512G10v+zYbfzYYGJWQzLDg4BMeBJhs57ZrlYPBWkyN
GZdfuI4rvUG06yf+zgfMlUJvZx5vyIGkUAjcxGTtHSojOElt/Wn5XsU4zT3/AK1/yuchNM08
8krhA0jFiEQIoJOeFAAA9gMCii6he0u5raXHmQu0bYPGQcGitVJNaGbTTszKoNLSGuU6z239
mP8A5GvW/wDryX/0MV9KV81/sxf8jXrf/Xkv/oYr6Urmr7r0/VmtH7Xr+iCiiiuc3CiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
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
NvBobapPqKQyX5KJE0ZGAjEfe6ZOf5UBexyvirWb/wAGXGm6LZSWc0EdmDL5lnHIHcyOScup
PTbXpdppnhHWdCtr59J05nnt1lCrCYzuKg4+Vh34rivGHw5k1PUY7261dmlf5ZPJRZEjAU7S
BwewHJ75yOlQ6LpeoaS1pjW7SSws5kMnmK8bFFYE4GCM9sZr6CEsDVwsISspx303+ZzvnU21
scJfokepXKRDaiysFA7DNZOtf8gib/gP/oQrSnfzLiR/7zk/rWbrX/IIm/4D/wChCvAOk5Wi
ijNMQUUUUAFFFFABRRRQAUUUUCCiiimA6ikpKQh1FNpaAFopKKBi0UlFAhaKTNFAC0UlLQAU
UUUAFFJRQAtFJRQAtFJRmgBaKTNGaAFopM0ZoAWikzRmgBaKTNJQAuaKSigYtJRRQAUUUlIY
tGaSigBaSiigAooooAKKKKACiiigAooooAKKKKACiiigAoorvY9Y0fwDGthpttp3iHUJwBqt
1Molt/LPW2hP/oUo5yPlOBkoDgqvaRpF5ruppYaakb3DpJJ+9mSFFVEZ3ZnchVAVWJJI6Voe
J9O0e3kt7/w3eibT74MyWsrg3FmwxuikHfGflfow9wQGeEPEP/CLeJodV8q4k8uGeHFrc/Z5
V82F4tySbW2su/cDg8gUAXpfh3rsEcMk0uhxpcIZIWfxBYASLuK7lPncjcrDI7qR2qtd+CtY
s9Mur9m0ue3s0WSf7HrFpcvGpdUDFI5WbG51GcdxXdfFfw/4z8R+NZBB4W8UX0emedZJf3Ft
JcNeAXM0glDJEihT5mFVRgKFAOK5/TfCfiLQvCfjC51zQdU023fSYo1lvLOSFCxv7QhQWAGc
AnHsaAOFrRvdA1TTtG0/Vb6ykgstSMgs5XwPO8vbuIHXA3LzjB7Zwa0/AP2f/hLk+1f2f/x5
Xnk/2l5Pkef9ll8nd537v/WbMbuM4ru5jqQm8M/8LF8j/kM6j9t+2eV5X2X7JZ58rH7v/V58
vZxu2becUAebXPhvUrPSLi/uoTD9lvPsV1bSKyTW8hXcu9CBgNhwPdGzjjN74f8AhL/hOvHW
n+HPtv2D7b5n+keV5uzZEz/dyM52Y69663VvP/4RHUf7U/4/f+EYsvte/O/z/ty+Ru/2vsu3
r2qt+z9/yXTw/wD9vP8A6TS0AdRc/AbwfZ3Uttd/GDQ4LiFzHLFLHCrxsDgqwNxkEEYINZvi
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
AOiUooGf/9k=
--------------090609030006090407090306
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
--------------090609030006090407090306--


From win-pv-devel-bounces@lists.xenproject.org Tue Oct 13 14:44:26 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 13 Oct 2015 14:44: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 1Zm0oT-0006eE-F4; Tue, 13 Oct 2015 14:44:25 +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 1Zm0oR-0006e6-JB
	for win-pv-devel@lists.xenproject.org; Tue, 13 Oct 2015 14:44:24 +0000
Received: from [193.109.254.147] by server-4.bemta-14.messagelabs.com id
	09/31-10715-6C81D165; Tue, 13 Oct 2015 14:44:22 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-2.tower-27.messagelabs.com!1444747402!22070678!1
X-Originating-IP: [209.85.212.178]
X-SpamReason: No, hits=1.7 required=7.0 tests=BIZ_TLD
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10640 invoked from network); 13 Oct 2015 14:43:39 -0000
Received: from mail-wi0-f178.google.com (HELO mail-wi0-f178.google.com)
	(209.85.212.178)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2015 14:43:39 -0000
Received: by wieq12 with SMTP id q12so36112757wie.1
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 13 Oct 2015 07:43:22 -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:cc:from:message-id:date
	:user-agent:mime-version:in-reply-to:content-type;
	bh=Vgptnrl8E5J4HJpA69ab6QfIs8kctPkOv8Je9LGE/qI=;
	b=cTtc0+mANa14WCoQeG7IfYbdcdCfwqwR/yh748TszNfbeNVspDdhh58zaSQa8RKkWI
	juwy8uQTzNY0aLVBcHCdE8FWtGXrSeanhWWUf1gc1/dW38TzNwr80f2c3yC+Esc12YOH
	/phblx364GzF5T8aBkCaR1ZkCN7AnsDQ+7C66wMPceHzhPqgYKJTOZ1TN/dmrLIbYh/t
	mvZeJI++skkaHVMoOvqqFRYYZ0t+tyN6l5BR7I3rrGGLqIE9cTVGeRDw+7GZEtimiAg+
	nOa1VUUEmoPAOq/CXvsl9Z9Ld4YzXF+JOI0rWcYRQnK3BUQRjw7oumVyMQzx0m2LRPcb
	ADZQ==
X-Gm-Message-State: ALoCoQkY+sDkjAJmgL1slx+Jzcu69T1fqdsesEP8qekBhY6BtM4nPyakmRVMlxNudYVew9jF8WJp
X-Received: by 10.180.198.180 with SMTP id jd20mr23079811wic.70.1444747373453; 
	Tue, 13 Oct 2015 07:42:53 -0700 (PDT)
Received: from [192.168.178.34] ([95.233.12.243])
	by smtp.googlemail.com with ESMTPSA id
	xt1sm4070085wjb.32.2015.10.13.07.42.48
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Tue, 13 Oct 2015 07:42:52 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <561B8AC1.9010900@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60C26F@AMSPEX01CL01.citrite.net>
	<561BD41E.5040302@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60DDED@AMSPEX01CL01.citrite.net>
	<561D0522.4090807@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60E611@AMSPEX01CL01.citrite.net>
	<561D11B6.9030909@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60E97B@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <561D1867.7030209@m2r.biz>
Date: Tue, 13 Oct 2015 16:42:47 +0200
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
	Thunderbird/38.2.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F60E97B@AMSPEX01CL01.citrite.net>
Content-Type: multipart/mixed; boundary="------------090609030006090407090306"
Cc: Stefano Stabellini <Stefano.Stabellini@citrix.com>
Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
 pro 64 bit with latest winpv build and xen 4.6.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>
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.
--------------090609030006090407090306
Content-Type: text/plain; charset=windows-1252; format=flowed
Content-Transfer-Encoding: 7bit

Il 13/10/2015 16:20, Paul Durrant ha scritto:
>> -----Original Message-----
>> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
>> Sent: 13 October 2015 15:14
>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
>> Cc: Stefano Stabellini
>> Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
>> pro 64 bit with latest winpv build and xen 4.6.0
>>
>>
>>
>> Il 13/10/2015 15:39, Paul Durrant ha scritto:
>>>> -----Original Message-----
>>>> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
>>>> Sent: 13 October 2015 14:21
>>>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
>>>> Cc: Stefano Stabellini
>>>> Subject: Re: [win-pv-devel] Network and disk pv not working on windows
>> 10
>>>> pro 64 bit with latest winpv build and xen 4.6.0
>>>>
>>>>
>>>>
>>>> Il 13/10/2015 11:45, 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: 12 October 2015 16:39
>>>>>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
>>>>>> Cc: Stefano Stabellini
>>>>>> Subject: Re: [win-pv-devel] Network and disk pv not working on
>> windows
>>>> 10
>>>>>> pro 64 bit with latest winpv build and xen 4.6.0
>>>>>>
>>>>>> Il 12/10/2015 14:15, 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: 12 October 2015 11:26
>>>>>>>> To: win-pv-devel@lists.xenproject.org
>>>>>>>> Cc: Paul Durrant
>>>>>>>> Subject: [win-pv-devel] Network and disk pv not working on
>> windows
>>>> 10
>>>>>> pro
>>>>>>>> 64 bit with latest winpv build and xen 4.6.0
>>>>>>>>
>>>>>>>> Dom0: Jessie (debian 8) 64 bit, kernel 3.16 from official repository,
>>>>>>>> xen 4.6.0, other installation details here:
>>>>>>>> ./configure --prefix=/usr --disable-blktap1 --disable-qemu-
>> traditional
>>>>>>>> --disable-rombios --with-system-seabios=/usr/share/seabios/bios-
>>>>>> 256k.bin
>>>>>>>> --with-extra-qemuu-configure-args="--enable-spice --enable-usb-
>>>> redir"
>>>>>>>> --disable-blktap2 --enable-systemd
>>>>>>>> xen services enabled with:
>>>>>>>> systemctl enable xenstored.service
>>>>>>>> systemctl enable xenconsoled.service
>>>>>>>> systemctl enable xen-init-dom0.service
>>>>>>>> systemctl enable xen-qemu-dom0-disk-backend.service
>>>>>>>> systemctl enable xendomains.service
>>>>>>>>
>>>>>>>> domU xl cfg:
>>>>>>>> http://lists.xen.org/archives/html/xen-devel/2015-
>>>> 10/txtsAaP2yM2Vx.txt
>>>>>>>> Still use emualted disk and network and xen pv network is unable to
>>>>>>>> start for code 10 error (from windows devices manager). (see also
>>>>>>>> screenshot in attachment)
>>>>>>>>
>>>>>>>> In attachment full qemu log with xen_platform trace.
>>>>>>>>
>>>>>>> xen_platform_log xen platform: XENVIF|SettingsSave: FROM
>> Ethernet
>>>>>> (Realtek RTL8139C+ Fast Ethernet NIC)
>>>>>>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
>>>>>> Version4: ADDRESSES NOT FOUND
>>>>>>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
>>>>>> Version6: ADDRESSES NOT FOUND
>>>>>>> xen_platform_log xen platform: XENVIF|DriverRequestReboot:
>> <===>
>>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail7
>>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail6
>>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail5
>>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail4
>>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail3
>>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail2
>>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1
>>>> (c0000001)
>>>>>>> xen_platform_log xen platform: XENNET|DriverUnload: XENNET 8.2.0
>>>> (31)
>>>>>> (17.09.2015)
>>>>>>> That means you have not rebooted to allow the emulated device to
>> be
>>>>>> unplugged. Other versions of Windows will prompt for the reboot but
>>>>>> Microsoft broke the class installer in Windows 10 so it won't.
>>>>>>>       Paul
>>>>>> Thanks for reply.
>>>>>> I already did a windows reboot after pv install but after doing another
>>>>>> seem ok.
>>>>>> Remain the dubt with ahci, I saw both emulated and pv ok in windows
>>>>>> devices manager and I not understand if a changes is needed for ahci
>>>>>> qemu side as Stefano Stabellini told.
>>>>>> Can you take a look to this new qemu log please? Is ok or with ahci disk
>>>>>> is not pv correctly?
>>>>>>
>>>>> The log shows:
>>>>>
>>>>> xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] :
>>>> 104857600 sectors of 512 bytes (512)
>>>>> xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] : 50
>> GB
>>>> (00000000)
>>>>> xen_platform_log xen platform:
>> XENVBD|FrontendReadDiskInfo:Target[0]
>>>> : Features: BARRIER FLUSH DISCARD
>>>>> xen_platform_log xen platform:
>> XENVBD|FrontendReadDiskInfo:Target[0]
>>>> : DISCARD 0/1000
>>>>> xen_platform_log xen platform:
>> XENVBD|FrontendReadFeatures:Target[0]
>>>> : Features: PERSISTENT INDIRECT
>>>>> xen_platform_log xen platform:
>> XENVBD|FrontendReadFeatures:Target[0]
>>>> : INDIRECT 100
>>>>> xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0]
>> :
>>>> in state CONNECTED
>>>>> xen_platform_log xen platform: XENVBD|__FrontendSetState:Target[0]
>> :
>>>> in state ENABLED
>>>>> xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] : Created
>>>> (PV)
>>>>> That last line says you have a functioning PV disk.
>>>>>
>>>>>      Paul
>>>> Thanks for your reply.
>>>> So with ahci even if Windows sees also emulated one in device manager
>>>> should properly use the pv?
>>>>
>>> XENFILT is installed as a filter on the IDE channel class in Windows so that it
>> can make sure that, in the event of an emulated disk being present in the
>> VM, the PV device does not come online... otherwise you've got two disks in
>> the VM referencing the same storage and you'll get data corruption pretty
>> quickly.
>>> So, if you use AHCI, I'm not convinced that:
>>>
>>> a) The emulated device unplug code in QEMU will actually unplug the
>> emulated AHCI disk
>>> b) XENFILT will spot the problem
>>>
>>> Hence, if you see any corruption of the VMs disks I would not be surprised.
>>>
>>>     Paul
>> I had disk corruption but with qcow2 disk overlay and also using ide
>> instead as I reported time ago. Without qcow2 I not saw disk corruption
>> for sure if I remember good. I saw domUs windows unbootable in other
>> cases about updated/remove the new pv but also with ide.
>> Is there a way to check if corruption happen in raw disks even if domU
>> seems still working correctly?
>>
> Go look at the number of disks the VM thinks it has. If you only gave it one but it thinks it has two then corruption is imminent.
>
>    Paul

See 2 but one (the emulated as offline), see the screenshot attached.
In this case can risk corruption or not?

Thanks for any reply and sorry for my bad english.



>
>> @ Stefano Stabellini: can you add unplug support for ahci in qemu to be
>> sure it can't do unexpected things please?
>>
>>
>> If you need more information and/or test tell me and I'l post them.
>> Thanks for any reply and sorry for my bad english.


--------------090609030006090407090306
Content-Type: image/jpeg;
 name="disk_ahci_screen.JPG"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="disk_ahci_screen.JPG"

/9j/4AAQSkZJRgABAQEAYABgAAD/4RDSRXhpZgAATU0AKgAAAAgABAE7AAIAAAAETTJSAIdp
AAQAAAABAAAISpydAAEAAAAIAAAQwuocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFkAMAAgAA
ABQAABCYkAQAAgAAABQAABCskpEAAgAAAAM1NwAAkpIAAgAAAAM1NwAA6hwABwAACAwAAAiM
AAAAABzqAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAMjAxNToxMDoxMyAxNjozNDowNwAyMDE1OjEwOjEzIDE2OjM0OjA3AAAA
TQAyAFIAAAD/4QsWaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVn
aW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pg0KPHg6eG1wbWV0YSB4
bWxuczp4PSJhZG9iZTpuczptZXRhLyI+PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3
LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOkRlc2NyaXB0aW9uIHJk
ZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHht
bG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPjxyZGY6RGVzY3Jp
cHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4
MmYxYiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj48eG1wOkNy
ZWF0ZURhdGU+MjAxNS0xMC0xM1QxNjozNDowNy41NzQ8L3htcDpDcmVhdGVEYXRlPjwvcmRm
OkRlc2NyaXB0aW9uPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1
LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9y
Zy9kYy9lbGVtZW50cy8xLjEvIj48ZGM6Y3JlYXRvcj48cmRmOlNlcSB4bWxuczpyZGY9Imh0
dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPjxyZGY6bGk+TTJS
PC9yZGY6bGk+PC9yZGY6U2VxPg0KCQkJPC9kYzpjcmVhdG9yPjwvcmRmOkRlc2NyaXB0aW9u
PjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0ndyc/Pv/bAEMABwUFBgUEBwYF
BggHBwgKEQsKCQkKFQ8QDBEYFRoZGBUYFxseJyEbHSUdFxgiLiIlKCkrLCsaIC8zLyoyJyor
Kv/bAEMBBwgICgkKFAsLFCocGBwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKv/AABEIAwAFVgMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAA
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
m7du3fNuznmgDZryb9pH/kkrf9f8P/s1es15N+0j/wAklb/r/h/9mreh/EXz/IxrfB935nyU
KcKaKcK7kcrFooooEFFFFACYpDTqQ0DG0UuKMUDEopTRSATFJilooC4gFKKXFAFMBKWlxiig
QlFLRigBMUuKMUtACYoxS0UCEoxS0UAJRRRQMKMUCloAbilAzRQKADFJinUUCExRilooAKTF
LRQAmKMUtFABRRRQAmKKWigAooooAZtxTMVKKaRUWLPcP2Wf+Rw1z/rwX/0YK+hfE+gf8JHp
kdp56QbJhLueHzAcAjGMj1r57/Za/wCRw1v/AK8F/wDRgr6drmr6OPp+rNqOql6/ojzt/hW7
7v8AibW3zTGc507q53ZP+s6fO3HTnpwMdxpGnjSdFs9PV/MFrAkW/GN20YzjJxnrirlFc92z
dJIp6lo+mazCkOsadaX8SNvVLqBZVVsYyAwODzUd74f0bUhbjUdIsbsWoxAJ7ZH8kcfdyPl6
Dp6CtCikMzE8N6HHHeImi6eqXxzdqLVALg5J+cY+bkk8561JLoWkTWUtnNpdlJazbfNge3Qo
+0ALlcYOAqgZ6AD0q/RQBWh02xthbi3s7eIW0ZigCRKvlIcZVcD5Qdo4HoPSqtz4b0O9itor
zRdPuI7QYtkltUYQjjhAR8vQdPStOigCpqWk6drFsLfV7C1v4FYOIrqFZVDdM4YEZ5PPvTG0
TSn1GDUH0yza9t02Q3Jt0MkS88K2Mgcngepq9RQBXXTrJdm2ztx5czTpiJflkbO5xxwx3Nk9
Tk+tZGpeD9K1TVbO4vLOzltbdLgPZy2qukrysjFyDxnKE9CSWzmt+igDPvtA0bUzCdS0mxvD
ApSE3FsknlqeCFyOB9Kc+iaVLNPNJplm8txD5EztbqWlj/uMccr7Hir1FAFCw0PSdLCDTNLs
rMR7tgt7dI9u7G7GAMZ2rn1wPSr9FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAG
RqvhPw5r10t1rmgaXqVwiCNZbyyjmdVBJCgsCcZJOPc0aV4T8OaDdNdaHoGl6bcOhjaWzso4
XZSQSpKgHGQDj2Fa9FABRRRQAUUUUARW9pb2cbpaQRQI8jSssSBQzsxZmOOpLEknuSTRBaW9
tJO9tBFE9xJ5szRoFMr7Qu5sdTtVRk9gB2qWigAryb9pH/kkrf8AX/D/AOzV6zXk/wC0h/yS
U/8AX/D/AOzVtQ/iff8AkY1vg+78z5JpwptOFdyOVi0UUUxBRRRQAUhpaKAEopDS0DCkpaQ0
AFJS0uKAFooooEFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAIKQinYpCKBnuH7Lf8AyOGt/wDXgv8A6MFfTbHCnHpXzZ+zDY3M
HiLUryaLZBdWJELEjL7ZFDHHXGTjPQkEDocfShGQRXDiru1u36s6KGz9f0R5h4S8VT3Hgy21
jV9f8R3M8wtBMsmlRQRI8sqJiJ2t0V1JbBIZyFyQc4NW2+J9l4e0x38RzGe5m1O/ht4xLbwf
uYJ2QfNK8acDYMZLHPQ4JHTr4RsF8IWXhwTXP2Oy+z+W+5fMPkyK65O3HJQZ4HGelVJPAlqs
kU+narqWm3kVxdTrd2zRF8XEnmSRlZI2Qpu2kZXI2jnrnJtX08/0t/XY6tLfP9GdFaXUN9ZQ
Xdq++C4jWWN/7ysMg/kampkKNFBHG8rzMqhTI4AZyB1OABk+wA9qfSdr6EK9tTkPEPiK/sPE
sJtJUTS9NET6oGQHcJ3KL8x+7sALnHbFP13xj/Z1xqVhcaXrFqttp894dRt/srqsca5LKDIx
DE8KHQAkHjAJD734beFdVm1K41fSLXUbvUXZpLu7t45Jo8oECo5XKhQox6detRN4AWT+00uP
EeszwapbG2uYZPsxDJ5XljDeTvGASwAbG4k4OTmVt/X9aFK3Nd7f1+ZNL45s7e+e3FhqNxbW
8kMF3qKRx+TbyShSquN4cnDoSURlG4ZIwcJaePrK71iOy/s3UoIZb2ewS+mjjEDTw79yDDlu
RGxDbdp6ZzkCSXwPZSam9wt/fx208kU11p6PH5FzJEFCO+ULg4RMhWVTtGQcnM0fg/T41tQJ
bhhbanNqaBmX5pZfM3Kfl+7++bA68Dk96f8AX4f8H8BL4fP/AID/AFsU/CXxG0PxnqFxaaM5
ZoY/NVjNC/mx7sbtscjMnb5ZFRuenBx1dYfh3wz/AMI3GLa11fUbnT408u2sbnymjtlzwqsI
xIQBwNztxW5Q7dA6sxPFl/eaVoY1GyfatrcQyXK4B3W+8CXqDjCFm4wfl61l/wDCRv8A220t
1d3UdjJqx0+zit442WQxwO0hkLDdtLq4+U5zGuOC2equ7WK9s5rW5QPDPG0cin+JSMEfkaw7
TwZp9lpGi6fBcXezRpzcQyvIrSSyFJFLSEr8xPmsx6c/lU/1+X+W3mPT+vnb8fyItL8c2mp2
Wl3Y06+t7fVrkW9lJI0DiXMbyB/3cjYXEbDBwwPBWqutfEvSND0RtWvLe4+ypeT2bkzW8RDw
sysQJJVL52MQqbmI/h7U5Ph7apDM/wDbGpHUZb1L7+0glskyyqhjBCrCIz8pYEshJDdeBiGX
4ZafJYi3TWNXiZlu0nnSSIyTpcuHlViYyACwGCoUj1p/1+X/AAb/AHoNP6+f/AsNh8UTf8JR
e21xdXbw/wBrxWtlDbRxYcNYibY5cA7SdxyCDnaM7cipZPiC0WlX9/J4U1wR6fN5M6B7Mtu2
gnbi4w+CQuFJO47cZBAvP4JsDfG7juryKf7al6rKyfLItt9nGAVPGznB/i9uKoR/Dx4tMs7F
PF2veVZTieAlLMkOM8tm3w5yxbLZO7DZyM09Py/T/gh29Px1/wCAW5fHen23i7T/AA5e209t
faggaIPPbkglGfa0aymQY2MN2zZkY3dK6euYh8DW8Wupqj6vqUrLcrePA7QiOScQ+T5jbYw2
Sn8IIUHoBXT0dCeojBipCEBscEjODXOeDpdRmTUWvNTn1SyW5MdpdXUUUcj7Plk4iVRsDqwG
Ru4PUbSekqrp1j/Z9q0P2q5ut0skvmXMm9hvcttB/uru2qOwAHakPoWqKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAryf9pD/kkp/wCv+H/2avWK8n/aQ/5JKf8Ar/h/
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
P/4ij7Hcf9BK4/74j/8AiKuUUAU/sdx/0Erj/viP/wCIo+x3H/QSuP8AviP/AOIq5RQBT+x3
H/QSuP8AviP/AOIo+x3H/QSuP++I/wD4irlFAFP7Hcf9BK4/74j/APiKPsdx/wBBK4/74j/+
Iq5RQBT+x3H/AEErj/viP/4ij7Hcf9BK4/74j/8AiKuUUAU/sdx/0Erj/viP/wCIo+x3H/QS
uP8AviP/AOIq5RQBT+x3H/QSuP8AviP/AOIo+x3H/QSuP++I/wD4irlFAFP7Hcf9BK4/74j/
APiKPsdx/wBBK4/74j/+Iq5RQBT+x3H/AEErj/viP/4ij7Hcf9BK4/74j/8AiKuUUAU/sdx/
0Erj/viP/wCIo+x3H/QSuP8AviP/AOIq5RQBT+x3H/QSuP8AviP/AOIo+x3H/QSuP++I/wD4
irlFAFP7Hcf9BK4/74j/APiKPsdx/wBBK4/74j/+Iq5RQBT+x3H/AEErj/viP/4ij7Hcf9BK
4/74j/8AiKuUUAU/sdx/0Erj/viP/wCIo+x3H/QSuP8AviP/AOIq5RQBT+x3H/QSuP8AviP/
AOIo+x3H/QSuP++I/wD4irlFAFP7Hcf9BK4/74j/APiKPsdx/wBBK4/74j/+Iq5RQBT+x3H/
AEErj/viP/4ij7Hcf9BK4/74j/8AiKuUUAU/sdx/0Erj/viP/wCIo+x3H/QSuP8AviP/AOIq
5RQBT+x3H/QSuP8AviP/AOIo+x3H/QSuP++I/wD4irlFAFP7Hcf9BK4/74j/APiKPsdx/wBB
K4/74j/+Iq5RQBT+x3H/AEErj/viP/4ij7Hcf9BK4/74j/8AiKuUUAU/sdx/0Erj/viP/wCI
o+x3H/QSuP8AviP/AOIq5RQBT+x3H/QSuP8AviP/AOIo+x3H/QSuP++I/wD4irlFAFP7Hcf9
BK4/74j/APiKPsdx/wBBK4/74j/+Iq5RQBT+x3H/AEErj/viP/4ij7Hcf9BK4/74j/8AiKuU
UAU/sdx/0Erj/viP/wCIo+x3H/QSuP8AviP/AOIq5RQBT+x3H/QSuP8AviP/AOIo+x3H/QSu
P++I/wD4irlFAFP7Hcf9BK4/74j/APiKPsdx/wBBK4/74j/+Iq5RQBT+x3H/AEErj/viP/4i
j7Hcf9BK4/74j/8AiKuUUAU/sdx/0Erj/viP/wCIo+x3H/QSuP8AviP/AOIq5RQBT+x3H/QS
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
QtP68rf8EL7f13/zPPkn1/U5dI1p4tV08XuqAS2X7z/RbdLaZfnjxjmX5skc5j9BXPSf8JCf
CK29g+uLBHqUaX2pSw6k89zF5RzIts7pcRjzPLysLY6kEjco9iooDt/Xf/MyPCizJ4VsFubu
e9kWPaZ7i1lt5HAJxujmJkBAwPnJY4ySc5rXoopt3dyUrKwUUUUhnC+L/wDkXfFX/XVP/RMN
d1XC+L/+Rd8Vf9dU/wDRMNd1QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAVj67/yCdQ/65Sf+ixWxWPrv/IJ1D/rlJ/6LFAD/Cv/ACJ2jf8AXhB/6LWtWsrwr/yJ2jf9
eEH/AKLWtWgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK5bxkyp
JpjOQoF6uSTj/ljPXU1y/jD/AF2l/wDX6v8A6JnrSn8Xyf5MzqfD81+aJLO5g2j9/H/32K01
mtJoWjlkhdHBVlZgQQexFUbP7orWh6VmaCxTWkMKxxSwoiAKqqwAAHYCmwXFv5LBpo+XfgsO
m41aHSigDmf+EV0PzNv2qb7Jv3/YftZ8jOc/c+vbpW600LzW6xSI2HPCsDgbWqzRQAVWSeKO
ecSSoh3g4ZgP4VqzRQBUuv7OvbdoL37LcQt96OXa6n8DxUEljoktlHZy2unvbRHMcDRoUQ+o
XoOprSooAphNMWGSELaCKUbZEAXa4xtwR34AH0FV/wCztB8iKH7Hp3lQkmOPyo9qE9SBjjNa
lFAFZ5LKTy9727eWdyZKnacYyPTgkfjTY/7Pi8ryvsqeShSPbtGxTjIHoOBx7CrdFAFAQaSu
oG+EVkLwjBuAqeYRjH3uvTilt4dKtCDax2cBBYgxqi43Y3dPXAz64FXqKAM2Ox0SJpWitdPR
pgwlKxoC4b72fXPfPWp3/s6Tf5n2VvMTy33bTuTn5T6jk8e5q3RQBnyW2jzXkd3NBYyXMQAj
mZELoB0w3UVIE0wIiBbQKkZiRcLhUOMqPQHA49quUUAU7dNMswBaLaQAKEAiCrhQSQOO2SeP
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
bGyrsrD0pI/HlmiyX1zb6vAXsLW5j02aGHdmeV44lUKSfMdgAQzbQNv3fmqNPhjaR6XJYpr+
shGggtVbNuTHBCxZIgPJ2lecHcCWHBJGav3Hga1vlnfUdT1G7up7eCA3bmJJFMMrSxSKEjVQ
6u/93adoyDzkVv6/r+n5D7/12/4JHL4/t4IY1m0XVk1B74WP9neXEZhK0TSryJDHtKr94OQM
8kYOJdL8WWms6ppiwf2hbSXUV4Gs5Y4gqPBIkcgkIyQyscDYxUgknPFSW/gy0imtri6v769v
IL4XzXU7Rh5pBE0QDBEVQoRsAKq8jPUnMmn+ELDTdVh1CCa5aWGS8dVdlKk3MqySZwvYqMeg
65601a+v9af5g7dP63/4H4m9RRRSEFFFFABRRRQAUUUUAcL4v/5F3xV/11T/ANEw13VcL4v/
AORd8Vf9dU/9Ew13VABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA
UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWPrv/
ACCdQ/65Sf8AosVsVj67/wAgnUP+uUn/AKLFAD/Cv/InaN/14Qf+i1rVrK8K/wDInaN/14Qf
+i1rVoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuX8Yf67S/8A
r9X/ANEz11Fcv4w/12l/9fq/+iZ60p/F8n+TM6nw/NfmizZ/dFa0PSsmz+6K1oelZmhZHSig
dKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKAPgSX/j6l/wB8/wA6KdMMXUv++386TFe9HY8SW4360Zp2KTbViENIRTiKSpGM
IpDTqMUDG4pCMU40mM1IxtFLtoqbMZFmmE0vWmms2anr/wCzj/yUB/8Ac/8AaclfVdfKf7OH
/JQG/wBz/wBpyV9WVxYn4l6fqzqw+0vX9EFFFFcp0hRRRQBm+INVs9H0O6ur++gslET7ZZpR
GN204wSRzXOaX4hi1O6jl0+7huLSSYCKW3vXl4WVUbd8xUghsj2rkNS1y5v723W5isbiYJIy
ma5l3RD5Aee27J4AA+SsuW9ubC+a6tTZxXLI9xKYJ3LHYysCxbO4kkkA91NVyXM+Y9p1vV4N
D0mW+uUkkClUjiiA3yyOwVEXJAyzMAMkDnkiqlhqmqxQXVx4qsNP0i3gjEouIdSM0YXndvLx
x7NoAOeRz14qXxJo8uuaI9pbXItblJYriCZkLKskUiyLuUEZXKgEZHBPNcVqPw/1XXP7cvbm
10nSL7UY7PEVhdSss8lvMZd8kyxxupbITIBZQAQTgCpRrpY7M+LfDYtLO6PiDSxb3zmO0m+2
x7LhgcFUOcMQeMDPNUdG8c6P4jCtoV9YTot9JZTB71A+V34KKu7fu8ssoJXKZbtisKLwjrtr
9im0mztdMv1ncz3h8QXN6yxs0e8ETQHztwT7rbduBtYZJFm28IaulzbRzNZrbWmv3GppKk7m
SSKZZ8grsAVlMyj7xBAJyOlP+vxQuj/ro/1sdNB4m0G5kvo7bW9OlfTwTerHdxsbYDOTIAfk
xg5zjoaW38SaHd2t5c2ms6fPBYki7liukZbcjk7yDhcYPXFcOngDW5vDI0e6GlQjT9EudKsb
iGV2a5MqBA8oKDyh8gJVTJknOfl5t+IPh9d6ot8tjLbWyS6dYQQoskkQaS1neXaWQBkUgqoZ
TuXkgcDK/r8/6sOy/r5f5v7jtbDU7DVdPS+0u9tr2zkzsuLeVZI2wcHDKSDggj8K5+Hx3p+o
atcWujXOmXltBBbS/bv7RUQsZZniKblVhuGzgZ+YsF460y08KzyeA9W0SeCPT7jUUmRmGpT6
iMum3e0kyq5916YHXmsebwX4h1S8vL2/h0axluItNiEVnPI6j7NdGViWMa5yvCjHHToM01bm
XbQX2f67r9LnZL4m0F7i6gXW9OaazdUuYxdx7oGZtqq4zlSWOAD1PFIvijQG0V9YXXNNOmI2
x70Xcfkq2cYMmdoOSB1715/4q0HWLLw5q8U0VnFpNxf2ZtdPN211G0j3yMztviVow2eYwXXk
4xjnXk8Ja9Ldf240OlJqq6smoDTxcObZlW3NvgzeUG34Yvu8vqAuP4qS1V3/AFt/mO39fI6m
XxPoEFvZTz63pscOoECzke7jC3JOMCMk4fqOmetZv/CdaRD4gtNDvr7T49SvTP5EcN6jr+7k
CBWJ2sHYkjaFOCjjJ284/wDwiGvWv2K40sWNrqTXM09zdRXjoluk0wkkiSIxMs6kDq3lnIyC
hPE2n+EdX0zXrG/iNlOkd3qTTI07oViup1kVl+Q7mULgqcDJ+9xyf8H+v+D+gd/67/1Y6Wx1
6xudIN7Pf6cqxRLJcvb3iyww5UNnzCF+XByCQMjmrGnXhvreSQtasUmki/0W485RtYrgnAw3
HK/wnIycZrjNK8BahY2ugWslxa/Z4LOC31dFZj55tzvh2ZXpvLBs4yvFdL4Y0i40XT7uC6eN
2n1G6ulMZJASWZ5FByBzhhn39ap2uxPy/rRmzRRRUgcL4v8A+Rd8Vf8AXVP/AETDXdVwvi//
AJF3xV/11T/0TDXdUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFY+u/8
gnUP+uUn/osVsVj67/yCdQ/65Sf+ixQA/wAK/wDInaN/14Qf+i1rVrK8K/8AInaN/wBeEH/o
ta1aACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArl/GH+u0v/r9X
/wBEz11Fcv4w/wBdpf8A1+r/AOiZ60p/F8n+TM6nw/NfmizZ/dFa0PSsmz+6K1oelZmhZHSi
gdKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooAKKKKAPgmX/j5l/3z/OgDNEv/AB8y/wC+f50CvoYLQ8Ke4FaTbTs0dauxFyMijbmp
QmaUpijlDmICmO9BSpcUhFJxQ+Yi2H0pNmKkpM1NirsiKmipDRSsPmZRFNNOFIa5mdKPXf2c
P+SgN/uf+05K+rK+U/2cP+SgP/uf+05K+l/EenX+p6Q0Wj6lJp17G6ywyryrMvRXHdD3H8+l
cWJ+Jen6s6sPtL1/RGrVHWNTTSdNe6dd5BwiZxuP+efwrn/DieKtW1ddV8S/8SmC2RoYtMt5
NyzP0aVz3GR8o7Dn62/G4STRIbY8TXNyscEmARG4VmBI7jCkfj+NcvodJUi8cQR39tZ3EkNx
cTqzeRAAjoAMk/M2P5dR7CtfS/Etjq1+9nbh1nWMyFWKHgEA/dY92HWuQfw5NeRQrdTw28kQ
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
wiAe7cA7GdiGG7IO7qFOB0ppXlYXS/8AW6X6nsX9t/8ATv8A+P8A/wBaj+2/+nf/AMf/APrV
5rceK9W07+0l1JLaK5SVEtbZrZ0VI3m8pJnm3ssi/MGIAVh0IGQauXuoeILfUNO0aO90sX11
DPcPeSWUgi2xlBsWLzs7j5gJO/gKeOeJ6XHbWx6Ja6r9puVi8nbuzzuz2z6VoVx3g3Un1iw0
zUZY1ie5hEhVG3Lyp6HuO4PpXY09hBRRRQAUUUUAcL4v/wCRd8Vf9dU/9Ew13VcL4v8A+Rd8
Vf8AXVP/AETDXdUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA
FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFY+u/wDI
J1D/AK5Sf+ixWxWPrv8AyCdQ/wCuUn/osUAP8K/8ido3/XhB/wCi1rVrK8K/8ido3/XhB/6L
WtWgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK5fxh/rtL/AOv1
f/RM9dRXL+MP9dpf/X6v/ometKfxfJ/kzOp8PzX5os2f3RWtD0rJs/uitaHpWZoWR0ooHSig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK
KKACiiigD4Nk/wCPqX/fP86eopWXNzL/AL5/nUijFfTU1ofOTeomKQ06mmtehmNNN5pxpBUd
ShpoFKRSUDCiikNDAM0UUUijIzSZoNJXnXZ6B6/+zh/yUB/9z/2nJX1ZXyn+zh/yUF/9z/2n
JX1VIzLGzIm9gCQucbj6Vx4n4l6fqzpw+0vX9EOpGYIpZiFUDJJPAFVNN1KLUYCyAxyodssL
/ejb0NSagcabcn/pi/8AI1ynSJ/aNl5ip9st97EKq+auST0AGaW/ieaykjjG5jjAz7iuAtrf
Tv7Yjv7dNOgka5i8yWHR3t5JMyqxBkJ5yRk/T8a76y1G11BXNnMJBGQH4IKkgEcH2P8AMdQa
pxsSpXPMf+Ff+Jtsan+ziI0Ea5VTgAk/3OuSeetXdJ8Ea9Z6zb3d2tkY4QQRAFVj8rAdFGeW
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
aw+zTXV87Na3ltLOXTzJvtRUyyN8uN+VGMAKOmMYAuxeFIrbWJL6x1O/tYrgL9rsozEYbllT
YHbchdW2hQSjLnaK3qKXSwXZxKfDG0j0uSxTX9ZCNBBaq2bcmOCFiyRAeTtK84O4EsOCSM1f
uPA1rfLO+o6nqN3dT28EBu3MSSKYZWlikUJGqh1d/wC7tO0ZB5z09FO7Ec7b+DLSKa2uLq/v
r28gvhfNdTtGHmkETRAMERVChGwAqryM9Scyaf4QsNN1WHUIJrlpYZLx1V2UqTcyrJJnC9io
x6DrnrW9RRcP6/P/ADYUUUUgCiiigDhfF/8AyLvir/rqn/omGu6rhfF//Iu+Kv8Arqn/AKJh
ruqACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACsfXf+QTqH/XKT/0WK2K
x9d/5BOof9cpP/RYoAf4V/5E7Rv+vCD/ANFrWrWV4V/5E7Rv+vCD/wBFrWrQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFcv4w/12l/9fq/+iZ66iuX8Yf67S/+
v1f/AETPWlP4vk/yZnU+H5r80WbP7orWh6Vk2f3RWtD0rM0LI6UUDpRQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB8MFT9ol
/wB8/wA6THNSbsXEn++f50pwetfWQ+FHy037zITTKnKg1GY/Sm0CaI80tGzFJ0qNSxDTacxp
M0hoSkNLTWNSykNNFFFRcoxqKbmlzXn3PSPYf2b/APkoL/7n/tOSvq2vlL9m45+ID/7n/tOS
vq2uTEbr0/Vm9DaXr+iCiiiuY6AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooA4Xxf/wAi74q/66p/6Jhruq4Xxf8A8i74q/66p/6JhruqACiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACsfXf8AkE6h/wBcpP8A0WK2Kx9d/wCQTqH/AFyk/wDR
YoAf4V/5E7Rv+vCD/wBFrWrWV4V/5E7Rv+vCD/0WtatABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAVy/jD/AF2l/wDX6v8A6JnrqK5fxh/rtL/6/V/9Ez1pT+L5
P8mZ1Ph+a/NFmz+6K1oelZNn90VrQ9KzNCyOlFA6UUAFFFFABRRRQAUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfCzH/AEiT/fP86kzmomP+
kyf75/nUgPBr6um/dR8vNe8IaSnZptWSBNGc9aRqTpSGgKA1GyelSZppNToUmyJgRUZqct61
GxHcVmzRMjopdooqSzGFIetGaSvMPSPYf2bf+SgSf7n/ALTkr6vr5Q/Zt/5KA/8Auf8AtOSv
q+ubEbx9P1ZtQ+16/ogooormOgKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo
oAKKKKAOF8X/APIu+Kv+uqf+iYa7quF8X/8AIu+Kv+uqf+iYa7qgAooooAKKKKACiiigAooo
oAKKKKACiiigAooooAKKKKACiiigAopDSZoAdRTc0ZpgOopuaA2ehzSAdRTc0ZpgOopuaM0A
OopuaM+9ADqKbmjNADqKbmjNADqKbn3ozSAdRTc0ZpgOopuaM0AOopuaM0AOopuaM0AOopBS
0gCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
rH13/kE6h/1yk/8ARYrYrH13/kE6h/1yk/8ARYoAf4V/5E7Rv+vCD/0WtatZXhX/AJE7Rv8A
rwg/9FrWrQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFcv4w/12
l/8AX6v/AKJnrqK5fxh/rtL/AOv1f/RM9aU/i+T/ACZnU+H5r80WbP7orWh6Vk2f3RWtD0rM
0LI6UUDpRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
RQAUUUUAFFFFABRRRQB8Juf9Ik/3z/Ong1E5/wBJl/3z/OlBr6iD90+amtSUmkJpmaM1dyLD
i1JmmFqTfSuPlH5pCaZuzSE0rlWFzTGozSGoKQUUmaKm5Ri0n1paTFeaeoew/s2f8lAf/c/9
pyV9X18o/s2/8lAk/wBz/wBpyV9XVzYjePp+rNaH2vX9EFFFFcx0BRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBwvi/8A5F3xV/11T/0TDXdVwvi//kXfFX/XVP8A
0TDXdUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIelJSmkxTEFFGKMUA
I33aQsNvBp2KMUARgkkZPrSqcAc8Yp+KMUAMDHqT2zSqSQcmnYoxQAzdx178mg9SQe1PxRig
BmTu6ge1AJOOeop+KMUAMyceuRmlU5PXIp2KMUAMySevrSAnr329KkxRigBgJOOe/agE7uvf
pT8UYoAKKMUYoAKKMUYoAKKMUYoAUdKWkFLSGFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWPrv/ACCdQ/65Sf8AosVsVj67/wAgnUP+uUn/
AKLFAD/Cv/InaN/14Qf+i1rVrK8K/wDInaN/14Qf+i1rVoAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACuX8Yf67S/8Ar9X/ANEz11Fcv4w/12l/9fq/+iZ60p/F
8n+TM6nw/NfmizZ/dFa0PSsmz+6K1oelZmhZHSigdKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPhB/+PmX/fP86Ud6JP8A
j5l/3z/OivpofCj5yXxMQmk3UHik+tUICfWmE0rGmVLZSQ7NGabTqQ7BQTQaaaQwopoopDMj
NFJgUV5x6J7F+zb/AMlAf/c/9pyV9XV8o/s2/wDJQH/3P/aclfV1c2I3j6fqzah9r1/RBRRR
XMdAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAcL4v/5F3xV/11T/
ANEw13VcL4v/AORd8Vf9dU/9Ew13VABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABWPrv/ACCdQ/65Sf8AosVsVj67/wAgnUP+uUn/AKLFAD/Cv/InaN/14Qf+i1rVrK8K
/wDInaN/14Qf+i1rVoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CuX8Yf67S/8Ar9X/ANEz11Fcv4w/12l/9fq/+iZ60p/F8n+TM6nw/NfmizZ/dFa0PSsmz+6K
1oelZmhZHSigdKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo
ooAKKKKACiiigAooooAKKKKAPhCQf6RL/vn+dJg9qbI/+ky/75/nRuz0r6SD90+dkncUsR1p
pag0lUCAmm/SnU3FSMSlzSYopFC5pM0hFNpAOBopAKKCrGRRRRXnHeexfs2/8lAf/c/9pyV9
XV8ofs2/8lAk/wBz/wBpyV9X1z4jePp+rNqH2vX9EFFFFcx0BRRRQAUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQBwvi/8A5F3xV/11T/0TDXdVwvi//kXfFX/XVP8A0TDX
Zfa/9j9aALFFV/tf+x+tZsviHy5nT7LnaxGfM6/pQBtUVh/8JJ/06/8AkT/61H/CSf8ATr/5
E/8ArUAblFYf/CSf9Ov/AJE/+tR/wkn/AE6/+RP/AK1AG5RWH/wkn/Tr/wCRP/rUf8JJ/wBO
v/kT/wCtQBuUVh/8JJ/06/8AkT/61H/CSf8ATr/5E/8ArUAblFYf/CSf9Ov/AJE/+tR/wkn/
AE6/+RP/AK1AG5RWH/wkn/Tr/wCRP/rUf8JJ/wBOv/kT/wCtQBuUVh/8JJ/06/8AkT/61H/C
Sf8ATr/5E/8ArUAblFYf/CSf9Ov/AJE/+tR/wkn/AE6/+RP/AK1AG5RWH/wkn/Tr/wCRP/rU
f8JJ/wBOv/kT/wCtQBuUVh/8JJ/06/8AkT/61H/CSf8ATr/5E/8ArUAblFYf/CSf9Ov/AJE/
+tR/wkn/AE6/+RP/AK1AG5RWH/wkn/Tr/wCRP/rUf8JJ/wBOv/kT/wCtQBuUVh/8JJ/06/8A
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
52m2c0vlRhfMczXOWOOrHHJPNNXtr/Vgeza6W/E2NV8RaJoTwrresWGmtcZEIvLpITJjGdu4
jPUdPWmv4m0GPWxoz63py6oxAFibuMTkkbh+7zu6c9OlcJ4i11fDl34wlubnTrbWbgI+mx6t
FvTULdYFxbxDcm/MnmDapJDPkqdwzkX+pE+M9asJb/T3aXWdNmOhqhW9uGWK2bfG28lUUruI
8s8Iw3L1BHVr+uw2rXPXpb60gvILSa6hjubkMYIHkAeUKMttXqcAjOOmao6j4p8P6OWGr67p
tgVk8phdXkcWH2htp3Ec7WBx6EHvXNeM9KbWPHnh+GCb7Pdx2F9NaXG3PkzK9sVbHcZ4I7qS
O9YMWpvq/g34oXU1u9rPskjngcEGOVbCNXX3AYHB6EYI61P2b+Tf42/r5FRjeSXf+v6+Z3cn
jnwnDYw3kvijRUtbhmWGdtQiCSFcbgrbsEjIzjpkVc/4SHRf7Ug0z+17D7fcxiWC0+0p5sqE
EhlTOSMAnIHY1ymsxanN408Jrol5aWlx/Zd4TJd2jXCbc22RtWSM56c7vwqN9TtdE8ffYrDU
7DUp9VvozqGkED7VbS+Uo+0IMkiMLGhIYH1D9FNW1t/W9v6/pmd7w5vL+v6/4Y9AooopDCii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAMnXf9TH/wBd
4P8A0atZGq/8hKT/AHV/9BFa+u/6mP8A67wf+jVrI1X/AJCUn+6v/oIoAp1sXf8AyK1x/wBe
z/8AosVj1sXf/IrXH/Xs/wD6LFAFzwr/AMido3/XhB/6LWtWsrwr/wAido3/AF4Qf+i1rVoA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuX8Yf67S/+v1f/AETP
XUVy/jD/AF2l/wDX6v8A6JnrSn8Xyf5MzqfD81+aLNn90VrQ9KybP7orWh6VmaFkdKKB0ooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooA+E3/AOPiT/fP86cBTXB+0Sf75/nThX1NP4T5me4UZo/nR9avqQFL2pu4Cl3jHFFx
2YYpMU0vTSTU3GkxxIFMZvSmmmkVDZaQFqKMUVJZh0ZpaQ9a8w9Q9h/ZtOfiA/8Auf8AtOSv
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
EOVV1WNCZACFBxxgHnGiqRa8v6/zX3kOEk/P/gX/AK9DkJvE2sTmZpr6SQzWSWDlwGzAhUqg
yOMFF5HPHXk1Pd+M9fvvIM99h4ZknEsUEcUjyoMJI7ooaRh2ZyTyfU10fhTwrp1te2r6zdrL
e3VhfTw2DWgkiKpHMgLSFuH3IzABSPlByDxVA+CbJLcxS606ajFYw6hcQfY8xJDJsPyyb8s4
SRWIKqOo3etc0Oa39bv/AC3E4zSt/XRfqkVJfH/iOWaF2u7dRC8rpEljAkZMq7ZMxhArBh1B
BB69ahfxv4ge7+0m+VZfNt5Rst4lVWgz5OFC4AXJ4Ax6g1sN8NLmL/j41COPy72aGf8AdZ8u
CMSHz+vIPky4H+yOeaxtf8OQ6NpWn3lvdXF6t2is062yi2DFQxRJRI251JwylVIx0pKVPp5f
8AbjUW/n/wAESDxnrlrHbJFcwkWpl8rzLSFyFk3b0JZCWQ72yhyuTnFVbrxJql5rkGrz3I+3
Wxj8mSOJIxH5eNgCqAoAwMDHauq0Gy03WdN8JpPpdpEG1a4gnMSsGulSKBgHYkk5JIwCANxw
BmsbxFImoaBomrvaWttd3L3EMwtLdIEkEbKVbYgCg/OVyBztHfNONnNJITT5bt7/AOZAvjTW
lW6QvZSQ3UvnyQS6bbPEJNu3ekbRlUYjqVAJ70kPjTW7b7H9lmtbdbMsY0hsYEViybCZAEAk
JUkZfdwT6mu/8X6JY3uvS6DONFsbi512G10v+zYbfzYYGJWQzLDg4BMeBJhs57ZrlYPBWkyN
GZdfuI4rvUG06yf+zgfMlUJvZx5vyIGkUAjcxGTtHSojOElt/Wn5XsU4zT3/AK1/yuchNM08
8krhA0jFiEQIoJOeFAAA9gMCii6he0u5raXHmQu0bYPGQcGitVJNaGbTTszKoNLSGuU6z239
mP8A5GvW/wDryX/0MV9KV81/sxf8jXrf/Xkv/oYr6Urmr7r0/VmtH7Xr+iCiiiuc3CiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
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
NvBobapPqKQyX5KJE0ZGAjEfe6ZOf5UBexyvirWb/wAGXGm6LZSWc0EdmDL5lnHIHcyOScup
PTbXpdppnhHWdCtr59J05nnt1lCrCYzuKg4+Vh34rivGHw5k1PUY7261dmlf5ZPJRZEjAU7S
BwewHJ75yOlQ6LpeoaS1pjW7SSws5kMnmK8bFFYE4GCM9sZr6CEsDVwsISspx303+ZzvnU21
scJfokepXKRDaiysFA7DNZOtf8gib/gP/oQrSnfzLiR/7zk/rWbrX/IIm/4D/wChCvAOk5Wi
ijNMQUUUUAFFFFABRRRQAUUUUCCiiimA6ikpKQh1FNpaAFopKKBi0UlFAhaKTNFAC0UlLQAU
UUUAFFJRQAtFJRQAtFJRmgBaKTNGaAFopM0ZoAWikzRmgBaKTNJQAuaKSigYtJRRQAUUUlIY
tGaSigBaSiigAooooAKKKKACiiigAooooAKKKKACiiigAoorvY9Y0fwDGthpttp3iHUJwBqt
1Molt/LPW2hP/oUo5yPlOBkoDgqvaRpF5ruppYaakb3DpJJ+9mSFFVEZ3ZnchVAVWJJI6Voe
J9O0e3kt7/w3eibT74MyWsrg3FmwxuikHfGflfow9wQGeEPEP/CLeJodV8q4k8uGeHFrc/Z5
V82F4tySbW2su/cDg8gUAXpfh3rsEcMk0uhxpcIZIWfxBYASLuK7lPncjcrDI7qR2qtd+CtY
s9Mur9m0ue3s0WSf7HrFpcvGpdUDFI5WbG51GcdxXdfFfw/4z8R+NZBB4W8UX0emedZJf3Ft
JcNeAXM0glDJEihT5mFVRgKFAOK5/TfCfiLQvCfjC51zQdU023fSYo1lvLOSFCxv7QhQWAGc
AnHsaAOFrRvdA1TTtG0/Vb6ykgstSMgs5XwPO8vbuIHXA3LzjB7Zwa0/AP2f/hLk+1f2f/x5
Xnk/2l5Pkef9ll8nd537v/WbMbuM4ru5jqQm8M/8LF8j/kM6j9t+2eV5X2X7JZ58rH7v/V58
vZxu2becUAebXPhvUrPSLi/uoTD9lvPsV1bSKyTW8hXcu9CBgNhwPdGzjjN74f8AhL/hOvHW
n+HPtv2D7b5n+keV5uzZEz/dyM52Y69663VvP/4RHUf7U/4/f+EYsvte/O/z/ty+Ru/2vsu3
r2qt+z9/yXTw/wD9vP8A6TS0AdRc/AbwfZ3Uttd/GDQ4LiFzHLFLHCrxsDgqwNxkEEYINZvi
z4I6XoXw71Lxbonjqz8QW+nvHGyWdspRmaREKmRZWAIEgbGPT1zX0PcxeJZ9fliin8Z21rJc
lVmiGjG3jQtgMu4GXYByMgvjqCaxPjZYXGn/AAB8RxXerXmquz27Ca8SFXUfaIRtAijRccZ5
GeTz0wrlWPjWikqezsrrUbyO00+2murmU7Y4YIy7ufQKOTTJIK6LwBcwWXxE8P3N5PHbwQ6h
C8ksrhVRQ4ySTwB71mwaBrN1pdxqVtpN9NYWxKz3Uds7RREYyGcDC9R1Peq8Wn3k9utxDaTy
QtMIFkSIlTIRkJnGNxA6daBnq3hbVdFuPClhZ6g+hHT7S7v31dL9YftDRugMbQbvnLHGAYvm
3KueMVU8PRxW/j8alcnwikMLW4kubLUUtxZDylPnwI7BZJBnJBST51I28ivP7Xw1rt7eXdpZ
aLqNxc2WftUMVo7vBg4O9QMrg+tVrPTb7UN32CyuLrYyK3kRM+0uwVQcDgliAPUnFAHpw1zw
efhrrujaTquoQ7LJW8q6tIlN5cm4Ri4bzstwqrjYCqAnBOQfKK1z4S8RjWBpJ8P6oNSMfmiy
+xSecU/vbMbse+KpDS78rdkWNyRY/wDH0fJb/R/m2/Px8vzcc454oEVaK0bnw9rVlpMOqXmk
X9vp9xjybuW2dYZMjI2uRg5APQ9qzs0AXtY/4/o/+vW3/wDRKUUax/x/R/8AXrb/APolKKYz
PoooqQPTpf2gvHd3ZR2up3NlfpHc29yDNaqpLQypKoOzbwWjGfYnpXaWH7WWrx4/tTwvZXPr
9muXh/8AQg9fPtFAwooooA7ipYLmW28zyX2+ZGY34Byp6ioqKkZag1K7toUihl2pG5kQFQdr
EYOCR3Halh1S7gtRbo6GIElQ8SvsJ67SQSv4YqpRQBcGq3f2UW5dGRUMalokZ1U9gxG4Dk8A
96jF/dLcw3CzMssCqsbqACoAwBVeigC8NYvBLvVoVypQotvGEYE55XbtPIHUdqhu764vnRrq
TeY12L8oG1ck4wO3NV6KALP9oXJBHm8GEQH5R9zrjp+vWo5bmWeKGOV9yQqVjGANoyT/ADJq
KigCf7bcf2ebLzT9mMnm+XgfexjPrTpNRupntnlmLNaqqQkgfKAcge/41WooAnkvbiWMo8mV
MpmI2j756mpxrN8JJnMqOZn8xxJEjgt/eAIIB9xiqNFAF0avffapbhpt8kwAl8xFZZMdMqRg
9PSkXVb1NQS9SbbPGMIyqAFGMYC4wBjtiqdFAFj7dc/ZPs3mnyfN87bgffxjOaW71C5vVCzs
m0EttjiWMEnqSFAyfeq1FAFy31W7toFhjdDGjFkEkSPsJ6lSwO38MVBBcS20wlgba4BAOAeo
wevsaiooAsw6hdW6QrBMyCCQyR7QAVY4BOfwFPbVrszRyho42iyV8qBEAJGCcKACcetU6KAA
HByOtXTrF+dUGom4P2tekm0emOmMdKpUUAWrfUrq1jeON0aORtzJLEsilvXDAjPvT4tYvYkk
RZEZJZDI6SRI6s3rhgRVKigCS4uJbq4ee4cySyHczHuajoooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACuIrt64iqQmWdP1K+0m+jvdKvLixu4s+XcW0rRyJkEHDKQRkEj6Gugbxv9
ssrSLXfD2l63cWqSIt7fTXfnSB5pJm3mOdQx3yuc4zzyTXLUUxHUr43+x2V3FoXh7S9EuLpI
0a9sZrvzowk0cy7DJOwU74kOcZ44Irn9Q1K+1a+kvdVvLi+u5ceZcXMrSSPgADLMSTgAD6Cq
1FABRRRQAV0nhbxHHpXmWl8CbWU7twGdhxg8dwa5uit6FedCoqkN0YV6EK9N057M71o/Bm/z
yYM/ewGfH/fP9MVyWuXNrd6zPNYKEt22hAF24woHT6is+it8Ri/bR5VCMeuiMMPg/YS5nOUt
LasKKKK4TuCvdG/aB0/UNPt7bUNEurU20YRWglWbzOADkHbt6e/WvC6KcPcqxqreO3z0Ma9K
NelKjPZ7/me53X7Q1lqVmbO58NSWyOAGniuVkYYOeFKLnOMdR1rlfG/xVh8UeEU8PWumSQxR
zrKtzLKNzAZ4KAcfe/vGvNqKxVGmqSpJaKXNu97W/LoV7NfWHiPtOPL8r3/MKKKK1NAr6P0X
4ofCXxF4K8PaH49064M2j2MVqJbm2ZkVljRXKNES2CUHYHjpXzhRQB9c2Hhr4M+I/GUXibR9
ctl1YX41HampbDJMJBJkxyHOC3UADr2rU/aG1XT4fgzq9lNfWyXd2Lc28DSqHmAuI2JVc5OA
CePSvjKilYdwooopiCu58J/FXWfB+gnStNtbOSEytLunRmbJx6EelULP4aeLb+xgvLTSfMgu
I1lif7TENysMg4LZHB71OPhT4z/6A3/k1D/8XW0adVbRf3HPOdGWkpL7zcl+OfiKe3aCWx0t
om6qYD6g+vsPyrMvPitq15p1zZmw0+KO5iaJzFGwOCMevvVb/hVPjP8A6A3/AJNQ/wDxdH/C
qfGf/QG/8mof/i63jPFQjyxTS9DnlSwkpc0rN+v/AATj6v6L/wAheH/gX/oJrWX4e+KHQMul
5DDIP2iL/wCKqr4f0i+uPGEWlRQbr1XkjMW9RhlVtwznHGD3rlcJLdHYpwezN6u68M+P4dH0
O20y5tHYW7OySqc8sxPT8f0rH/4QPxJ/0Dv/ACPH/wDFUf8ACB+JP+gd/wCR4/8A4qr9lV/l
f3EutSf2l951U3jCyvy5jni3SKRiSMA8gdz9BWJ418QQ3JTTdKnzbIP32z7rsDwB6459uaof
8IH4k/6B3/keP/4qj/hA/En/AEDv/I8f/wAVR7Kr/K/uEqtJfaX3nO1S1n/kET/8B/8AQhXX
/wDCB+JP+gd/5Hj/APiqyPFPhLW9M8N3V3fWXlQR7Nz+ajYy6gcA56kUnSqLVxf3Fe1pvRSX
3nndFFFQaC0UlLSAKKKKYBRRRQAUUUUAFFFFAgooooAKKKKACiiigAooooAKKKKBhRRRQIWi
kooAKKKKACiiigAooooAKKM0ZoAKKKKBhRRmjNABRRmkpALmikooAKKM0UAFFGaM0gCijNJT
AKKKKBhRRRSAKWkopiFoNGaQ0ALiiikpALSUUUxi0UlFIQtFJRQAtFFFAHW2vj5odd1XWbnw
7o97f6pNdSTTTm5GxbhWWSNVSZRt2u4BILDd97gY5rUbqG8v5J7axt9PjfG22tmkMaYAHBkZ
m5xnljyew4qvSUAFaN7r+q6jo2n6VfXkk9lppkNnE+D5PmbdwB64O1eM4HbGTWdRTGa9z4k1
K80i4sLqYzfarz7ZdXMjM81xIF2rvck5C5cj3ds54xS0/Ub7Sb6O90q8uLG7iz5dxbStHImQ
QcMpBGQSPoarZozSEeoeDPj74w8J29/Dd3cuurcxnyTqVw8jW8uMBgxJJX1TIB7Ec547V/HX
ivXoLiDWfEmq3lvctvltpbxzCx3bh+7ztABAIAGBgY6VgZozQAldb8Lr67sviboIs7qa3Fxf
QwzCKQr5sZkXKNjqpwODxxXJUUDPTfA2lXht9VvnstRgt3tb6OLWmO+xtQYyHWRMDDsBtBL9
WU7G4rK1i/u/C8/h/QtLu57O605PtF3JBI0bC5nALjIx92PYh+jDvXEAlWBUkEHII7U+4uJr
u5kuLqWSaaVi8ksjFmdickknkk+tAHt81pe6h4j1uLQUd7218cJd3Ri+9FAu/Er+kandljwM
+9YGqWE91q1r4d8JS+Ve+JNWm1JXjZkCW+91txlecbPMfAzwy8V5XUtxcz3cokuppJ5AqoGk
csdqgKoyewAAA7AUAexXGm6tL4W1Twxp2h6zBc2um28Gmre2bw3V8i3fmTukZGcbnU7QThVB
J61W1/VZbnUviPaQ37zWa2EEjxJMWha4EtsksgAOCxYMN3evIaKAPRtcsp9R+Ga6v4l0E6Pe
WS2dppV2VmjOoQhGBG2RyrAKFbcgA59686opKBF/WP8Aj+j/AOvW3/8ARKUUax/x/R/9etv/
AOiUooGf/9k=
--------------090609030006090407090306
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
--------------090609030006090407090306--


From win-pv-devel-bounces@lists.xenproject.org Tue Oct 13 14:47:33 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 13 Oct 2015 14:47:33 +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 1Zm0rB-0006r5-Ok; Tue, 13 Oct 2015 14:47:13 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72140db33=Paul.Durrant@citrix.com>)
	id 1Zm0rA-0006qB-52
	for win-pv-devel@lists.xenproject.org; Tue, 13 Oct 2015 14:47:12 +0000
Received: from [193.109.254.147] by server-7.bemta-14.messagelabs.com id
	31/A0-28221-F691D165; Tue, 13 Oct 2015 14:47:11 +0000
X-Env-Sender: prvs=72140db33=Paul.Durrant@citrix.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1444747629!58021472!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=1.7 required=7.0 tests=BIZ_TLD,received_headers: 
	No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31732 invoked from network); 13 Oct 2015 14:47:10 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2015 14:47:10 -0000
X-IronPort-AV: E=Sophos;i="5.17,678,1437436800"; 
   d="scan'208";a="5118484"
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] Network and disk pv not working on windows 10
	pro 64 bit with latest winpv build and xen 4.6.0
Thread-Index: AQHRBNh9Z00iIvSIsUy7w+yOqi9SPJ5nxWbQgAAXqACAAVDwcIAAGqsAgAAln6D//+lgAIAAIusQ///lD4CAACISYA==
Date: Tue, 13 Oct 2015 14:47:09 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F60EA64@AMSPEX01CL01.citrite.net>
References: <561B8AC1.9010900@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60C26F@AMSPEX01CL01.citrite.net>
	<561BD41E.5040302@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60DDED@AMSPEX01CL01.citrite.net>
	<561D0522.4090807@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60E611@AMSPEX01CL01.citrite.net>
	<561D11B6.9030909@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60E97B@AMSPEX01CL01.citrite.net>
	<561D1867.7030209@m2r.biz>
In-Reply-To: <561D1867.7030209@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
Cc: Stefano Stabellini <Stefano.Stabellini@citrix.com>
Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
 pro 64 bit with latest winpv build and xen 4.6.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

> -----Original Message-----
> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
> Sent: 13 October 2015 15:43
> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> Cc: Stefano Stabellini
> Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
> pro 64 bit with latest winpv build and xen 4.6.0
> 
> Il 13/10/2015 16:20, Paul Durrant ha scritto:
> >> -----Original Message-----
> >> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
> >> Sent: 13 October 2015 15:14
> >> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> >> Cc: Stefano Stabellini
> >> Subject: Re: [win-pv-devel] Network and disk pv not working on windows
> 10
> >> pro 64 bit with latest winpv build and xen 4.6.0
> >>
> >>
> >>
> >> Il 13/10/2015 15:39, Paul Durrant ha scritto:
> >>>> -----Original Message-----
> >>>> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
> >>>> Sent: 13 October 2015 14:21
> >>>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> >>>> Cc: Stefano Stabellini
> >>>> Subject: Re: [win-pv-devel] Network and disk pv not working on
> windows
> >> 10
> >>>> pro 64 bit with latest winpv build and xen 4.6.0
> >>>>
> >>>>
> >>>>
> >>>> Il 13/10/2015 11:45, 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: 12 October 2015 16:39
> >>>>>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> >>>>>> Cc: Stefano Stabellini
> >>>>>> Subject: Re: [win-pv-devel] Network and disk pv not working on
> >> windows
> >>>> 10
> >>>>>> pro 64 bit with latest winpv build and xen 4.6.0
> >>>>>>
> >>>>>> Il 12/10/2015 14:15, 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: 12 October 2015 11:26
> >>>>>>>> To: win-pv-devel@lists.xenproject.org
> >>>>>>>> Cc: Paul Durrant
> >>>>>>>> Subject: [win-pv-devel] Network and disk pv not working on
> >> windows
> >>>> 10
> >>>>>> pro
> >>>>>>>> 64 bit with latest winpv build and xen 4.6.0
> >>>>>>>>
> >>>>>>>> Dom0: Jessie (debian 8) 64 bit, kernel 3.16 from official repository,
> >>>>>>>> xen 4.6.0, other installation details here:
> >>>>>>>> ./configure --prefix=/usr --disable-blktap1 --disable-qemu-
> >> traditional
> >>>>>>>> --disable-rombios --with-system-
> seabios=/usr/share/seabios/bios-
> >>>>>> 256k.bin
> >>>>>>>> --with-extra-qemuu-configure-args="--enable-spice --enable-
> usb-
> >>>> redir"
> >>>>>>>> --disable-blktap2 --enable-systemd
> >>>>>>>> xen services enabled with:
> >>>>>>>> systemctl enable xenstored.service
> >>>>>>>> systemctl enable xenconsoled.service
> >>>>>>>> systemctl enable xen-init-dom0.service
> >>>>>>>> systemctl enable xen-qemu-dom0-disk-backend.service
> >>>>>>>> systemctl enable xendomains.service
> >>>>>>>>
> >>>>>>>> domU xl cfg:
> >>>>>>>> http://lists.xen.org/archives/html/xen-devel/2015-
> >>>> 10/txtsAaP2yM2Vx.txt
> >>>>>>>> Still use emualted disk and network and xen pv network is unable
> to
> >>>>>>>> start for code 10 error (from windows devices manager). (see also
> >>>>>>>> screenshot in attachment)
> >>>>>>>>
> >>>>>>>> In attachment full qemu log with xen_platform trace.
> >>>>>>>>
> >>>>>>> xen_platform_log xen platform: XENVIF|SettingsSave: FROM
> >> Ethernet
> >>>>>> (Realtek RTL8139C+ Fast Ethernet NIC)
> >>>>>>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
> >>>>>> Version4: ADDRESSES NOT FOUND
> >>>>>>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
> >>>>>> Version6: ADDRESSES NOT FOUND
> >>>>>>> xen_platform_log xen platform: XENVIF|DriverRequestReboot:
> >> <===>
> >>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail7
> >>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail6
> >>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail5
> >>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail4
> >>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail3
> >>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail2
> >>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1
> >>>> (c0000001)
> >>>>>>> xen_platform_log xen platform: XENNET|DriverUnload: XENNET
> 8.2.0
> >>>> (31)
> >>>>>> (17.09.2015)
> >>>>>>> That means you have not rebooted to allow the emulated device to
> >> be
> >>>>>> unplugged. Other versions of Windows will prompt for the reboot
> but
> >>>>>> Microsoft broke the class installer in Windows 10 so it won't.
> >>>>>>>       Paul
> >>>>>> Thanks for reply.
> >>>>>> I already did a windows reboot after pv install but after doing
> another
> >>>>>> seem ok.
> >>>>>> Remain the dubt with ahci, I saw both emulated and pv ok in
> windows
> >>>>>> devices manager and I not understand if a changes is needed for ahci
> >>>>>> qemu side as Stefano Stabellini told.
> >>>>>> Can you take a look to this new qemu log please? Is ok or with ahci
> disk
> >>>>>> is not pv correctly?
> >>>>>>
> >>>>> The log shows:
> >>>>>
> >>>>> xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] :
> >>>> 104857600 sectors of 512 bytes (512)
> >>>>> xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] :
> 50
> >> GB
> >>>> (00000000)
> >>>>> xen_platform_log xen platform:
> >> XENVBD|FrontendReadDiskInfo:Target[0]
> >>>> : Features: BARRIER FLUSH DISCARD
> >>>>> xen_platform_log xen platform:
> >> XENVBD|FrontendReadDiskInfo:Target[0]
> >>>> : DISCARD 0/1000
> >>>>> xen_platform_log xen platform:
> >> XENVBD|FrontendReadFeatures:Target[0]
> >>>> : Features: PERSISTENT INDIRECT
> >>>>> xen_platform_log xen platform:
> >> XENVBD|FrontendReadFeatures:Target[0]
> >>>> : INDIRECT 100
> >>>>> xen_platform_log xen platform:
> XENVBD|__FrontendSetState:Target[0]
> >> :
> >>>> in state CONNECTED
> >>>>> xen_platform_log xen platform:
> XENVBD|__FrontendSetState:Target[0]
> >> :
> >>>> in state ENABLED
> >>>>> xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] :
> Created
> >>>> (PV)
> >>>>> That last line says you have a functioning PV disk.
> >>>>>
> >>>>>      Paul
> >>>> Thanks for your reply.
> >>>> So with ahci even if Windows sees also emulated one in device
> manager
> >>>> should properly use the pv?
> >>>>
> >>> XENFILT is installed as a filter on the IDE channel class in Windows so that
> it
> >> can make sure that, in the event of an emulated disk being present in the
> >> VM, the PV device does not come online... otherwise you've got two
> disks in
> >> the VM referencing the same storage and you'll get data corruption pretty
> >> quickly.
> >>> So, if you use AHCI, I'm not convinced that:
> >>>
> >>> a) The emulated device unplug code in QEMU will actually unplug the
> >> emulated AHCI disk
> >>> b) XENFILT will spot the problem
> >>>
> >>> Hence, if you see any corruption of the VMs disks I would not be
> surprised.
> >>>
> >>>     Paul
> >> I had disk corruption but with qcow2 disk overlay and also using ide
> >> instead as I reported time ago. Without qcow2 I not saw disk corruption
> >> for sure if I remember good. I saw domUs windows unbootable in other
> >> cases about updated/remove the new pv but also with ide.
> >> Is there a way to check if corruption happen in raw disks even if domU
> >> seems still working correctly?
> >>
> > Go look at the number of disks the VM thinks it has. If you only gave it one
> but it thinks it has two then corruption is imminent.
> >
> >    Paul
> 
> See 2 but one (the emulated as offline), see the screenshot attached.
> In this case can risk corruption or not?

Not sure. That depends on how 'offline' the disk is. The fact you have 2 though shows that neither the unplug or the filter are working for AHCI disks, so I'd recommend you stick with IDE until those two pieces are updated.

  Paul

> 
> Thanks for any reply and sorry for my bad english.
> 
> 
> 
> >
> >> @ Stefano Stabellini: can you add unplug support for ahci in qemu to be
> >> sure it can't do unexpected things please?
> >>
> >>
> >> If you need more information and/or test tell me and I'l 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 Oct 13 14:47:33 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 13 Oct 2015 14:47:33 +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 1Zm0rB-0006r5-Ok; Tue, 13 Oct 2015 14:47:13 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72140db33=Paul.Durrant@citrix.com>)
	id 1Zm0rA-0006qB-52
	for win-pv-devel@lists.xenproject.org; Tue, 13 Oct 2015 14:47:12 +0000
Received: from [193.109.254.147] by server-7.bemta-14.messagelabs.com id
	31/A0-28221-F691D165; Tue, 13 Oct 2015 14:47:11 +0000
X-Env-Sender: prvs=72140db33=Paul.Durrant@citrix.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1444747629!58021472!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=1.7 required=7.0 tests=BIZ_TLD,received_headers: 
	No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31732 invoked from network); 13 Oct 2015 14:47:10 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2015 14:47:10 -0000
X-IronPort-AV: E=Sophos;i="5.17,678,1437436800"; 
   d="scan'208";a="5118484"
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] Network and disk pv not working on windows 10
	pro 64 bit with latest winpv build and xen 4.6.0
Thread-Index: AQHRBNh9Z00iIvSIsUy7w+yOqi9SPJ5nxWbQgAAXqACAAVDwcIAAGqsAgAAln6D//+lgAIAAIusQ///lD4CAACISYA==
Date: Tue, 13 Oct 2015 14:47:09 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F60EA64@AMSPEX01CL01.citrite.net>
References: <561B8AC1.9010900@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60C26F@AMSPEX01CL01.citrite.net>
	<561BD41E.5040302@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60DDED@AMSPEX01CL01.citrite.net>
	<561D0522.4090807@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60E611@AMSPEX01CL01.citrite.net>
	<561D11B6.9030909@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F60E97B@AMSPEX01CL01.citrite.net>
	<561D1867.7030209@m2r.biz>
In-Reply-To: <561D1867.7030209@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
Cc: Stefano Stabellini <Stefano.Stabellini@citrix.com>
Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
 pro 64 bit with latest winpv build and xen 4.6.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

> -----Original Message-----
> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
> Sent: 13 October 2015 15:43
> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> Cc: Stefano Stabellini
> Subject: Re: [win-pv-devel] Network and disk pv not working on windows 10
> pro 64 bit with latest winpv build and xen 4.6.0
> 
> Il 13/10/2015 16:20, Paul Durrant ha scritto:
> >> -----Original Message-----
> >> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
> >> Sent: 13 October 2015 15:14
> >> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> >> Cc: Stefano Stabellini
> >> Subject: Re: [win-pv-devel] Network and disk pv not working on windows
> 10
> >> pro 64 bit with latest winpv build and xen 4.6.0
> >>
> >>
> >>
> >> Il 13/10/2015 15:39, Paul Durrant ha scritto:
> >>>> -----Original Message-----
> >>>> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
> >>>> Sent: 13 October 2015 14:21
> >>>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> >>>> Cc: Stefano Stabellini
> >>>> Subject: Re: [win-pv-devel] Network and disk pv not working on
> windows
> >> 10
> >>>> pro 64 bit with latest winpv build and xen 4.6.0
> >>>>
> >>>>
> >>>>
> >>>> Il 13/10/2015 11:45, 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: 12 October 2015 16:39
> >>>>>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> >>>>>> Cc: Stefano Stabellini
> >>>>>> Subject: Re: [win-pv-devel] Network and disk pv not working on
> >> windows
> >>>> 10
> >>>>>> pro 64 bit with latest winpv build and xen 4.6.0
> >>>>>>
> >>>>>> Il 12/10/2015 14:15, 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: 12 October 2015 11:26
> >>>>>>>> To: win-pv-devel@lists.xenproject.org
> >>>>>>>> Cc: Paul Durrant
> >>>>>>>> Subject: [win-pv-devel] Network and disk pv not working on
> >> windows
> >>>> 10
> >>>>>> pro
> >>>>>>>> 64 bit with latest winpv build and xen 4.6.0
> >>>>>>>>
> >>>>>>>> Dom0: Jessie (debian 8) 64 bit, kernel 3.16 from official repository,
> >>>>>>>> xen 4.6.0, other installation details here:
> >>>>>>>> ./configure --prefix=/usr --disable-blktap1 --disable-qemu-
> >> traditional
> >>>>>>>> --disable-rombios --with-system-
> seabios=/usr/share/seabios/bios-
> >>>>>> 256k.bin
> >>>>>>>> --with-extra-qemuu-configure-args="--enable-spice --enable-
> usb-
> >>>> redir"
> >>>>>>>> --disable-blktap2 --enable-systemd
> >>>>>>>> xen services enabled with:
> >>>>>>>> systemctl enable xenstored.service
> >>>>>>>> systemctl enable xenconsoled.service
> >>>>>>>> systemctl enable xen-init-dom0.service
> >>>>>>>> systemctl enable xen-qemu-dom0-disk-backend.service
> >>>>>>>> systemctl enable xendomains.service
> >>>>>>>>
> >>>>>>>> domU xl cfg:
> >>>>>>>> http://lists.xen.org/archives/html/xen-devel/2015-
> >>>> 10/txtsAaP2yM2Vx.txt
> >>>>>>>> Still use emualted disk and network and xen pv network is unable
> to
> >>>>>>>> start for code 10 error (from windows devices manager). (see also
> >>>>>>>> screenshot in attachment)
> >>>>>>>>
> >>>>>>>> In attachment full qemu log with xen_platform trace.
> >>>>>>>>
> >>>>>>> xen_platform_log xen platform: XENVIF|SettingsSave: FROM
> >> Ethernet
> >>>>>> (Realtek RTL8139C+ Fast Ethernet NIC)
> >>>>>>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
> >>>>>> Version4: ADDRESSES NOT FOUND
> >>>>>>> xen_platform_log xen platform: XENVIF|SettingsCopyIpAddresses:
> >>>>>> Version6: ADDRESSES NOT FOUND
> >>>>>>> xen_platform_log xen platform: XENVIF|DriverRequestReboot:
> >> <===>
> >>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail7
> >>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail6
> >>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail5
> >>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail4
> >>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail3
> >>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail2
> >>>>>>> xen_platform_log xen platform: XENVIF|PdoStartDevice: fail1
> >>>> (c0000001)
> >>>>>>> xen_platform_log xen platform: XENNET|DriverUnload: XENNET
> 8.2.0
> >>>> (31)
> >>>>>> (17.09.2015)
> >>>>>>> That means you have not rebooted to allow the emulated device to
> >> be
> >>>>>> unplugged. Other versions of Windows will prompt for the reboot
> but
> >>>>>> Microsoft broke the class installer in Windows 10 so it won't.
> >>>>>>>       Paul
> >>>>>> Thanks for reply.
> >>>>>> I already did a windows reboot after pv install but after doing
> another
> >>>>>> seem ok.
> >>>>>> Remain the dubt with ahci, I saw both emulated and pv ok in
> windows
> >>>>>> devices manager and I not understand if a changes is needed for ahci
> >>>>>> qemu side as Stefano Stabellini told.
> >>>>>> Can you take a look to this new qemu log please? Is ok or with ahci
> disk
> >>>>>> is not pv correctly?
> >>>>>>
> >>>>> The log shows:
> >>>>>
> >>>>> xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] :
> >>>> 104857600 sectors of 512 bytes (512)
> >>>>> xen_platform_log xen platform: XENVBD|__ReadDiskInfo:Target[0] :
> 50
> >> GB
> >>>> (00000000)
> >>>>> xen_platform_log xen platform:
> >> XENVBD|FrontendReadDiskInfo:Target[0]
> >>>> : Features: BARRIER FLUSH DISCARD
> >>>>> xen_platform_log xen platform:
> >> XENVBD|FrontendReadDiskInfo:Target[0]
> >>>> : DISCARD 0/1000
> >>>>> xen_platform_log xen platform:
> >> XENVBD|FrontendReadFeatures:Target[0]
> >>>> : Features: PERSISTENT INDIRECT
> >>>>> xen_platform_log xen platform:
> >> XENVBD|FrontendReadFeatures:Target[0]
> >>>> : INDIRECT 100
> >>>>> xen_platform_log xen platform:
> XENVBD|__FrontendSetState:Target[0]
> >> :
> >>>> in state CONNECTED
> >>>>> xen_platform_log xen platform:
> XENVBD|__FrontendSetState:Target[0]
> >> :
> >>>> in state ENABLED
> >>>>> xen_platform_log xen platform: XENVBD|PdoCreate:Target[0] :
> Created
> >>>> (PV)
> >>>>> That last line says you have a functioning PV disk.
> >>>>>
> >>>>>      Paul
> >>>> Thanks for your reply.
> >>>> So with ahci even if Windows sees also emulated one in device
> manager
> >>>> should properly use the pv?
> >>>>
> >>> XENFILT is installed as a filter on the IDE channel class in Windows so that
> it
> >> can make sure that, in the event of an emulated disk being present in the
> >> VM, the PV device does not come online... otherwise you've got two
> disks in
> >> the VM referencing the same storage and you'll get data corruption pretty
> >> quickly.
> >>> So, if you use AHCI, I'm not convinced that:
> >>>
> >>> a) The emulated device unplug code in QEMU will actually unplug the
> >> emulated AHCI disk
> >>> b) XENFILT will spot the problem
> >>>
> >>> Hence, if you see any corruption of the VMs disks I would not be
> surprised.
> >>>
> >>>     Paul
> >> I had disk corruption but with qcow2 disk overlay and also using ide
> >> instead as I reported time ago. Without qcow2 I not saw disk corruption
> >> for sure if I remember good. I saw domUs windows unbootable in other
> >> cases about updated/remove the new pv but also with ide.
> >> Is there a way to check if corruption happen in raw disks even if domU
> >> seems still working correctly?
> >>
> > Go look at the number of disks the VM thinks it has. If you only gave it one
> but it thinks it has two then corruption is imminent.
> >
> >    Paul
> 
> See 2 but one (the emulated as offline), see the screenshot attached.
> In this case can risk corruption or not?

Not sure. That depends on how 'offline' the disk is. The fact you have 2 though shows that neither the unplug or the filter are working for AHCI disks, so I'd recommend you stick with IDE until those two pieces are updated.

  Paul

> 
> Thanks for any reply and sorry for my bad english.
> 
> 
> 
> >
> >> @ Stefano Stabellini: can you add unplug support for ahci in qemu to be
> >> sure it can't do unexpected things please?
> >>
> >>
> >> If you need more information and/or test tell me and I'l 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 Oct 13 16:36:53 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 13 Oct 2015 16:36: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 1Zm2ZI-00076Q-Ag; Tue, 13 Oct 2015 16:36:52 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72140db33=Paul.Durrant@citrix.com>)
	id 1Zm2ZH-00075u-Ev
	for win-pv-devel@lists.xenproject.org; Tue, 13 Oct 2015 16:36:51 +0000
Received: from [85.158.139.211] by server-17.bemta-5.messagelabs.com id
	B6/75-18107-2233D165; Tue, 13 Oct 2015 16:36:50 +0000
X-Env-Sender: prvs=72140db33=Paul.Durrant@citrix.com
X-Msg-Ref: server-5.tower-206.messagelabs.com!1444754208!41996713!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8400 invoked from network); 13 Oct 2015 16:36:48 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-5.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2015 16:36:48 -0000
X-IronPort-AV: E=Sophos;i="5.17,678,1437436800"; 
   d="scan'208";a="5132594"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 1/5] Update XENBUS interface headers
Thread-Index: AQHRALuB9Lsj8vBcp0+MH/AhlaF2Op5pqQ5A
Date: Tue, 13 Oct 2015 16:36:46 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F61013A@AMSPEX01CL01.citrite.net>
References: <5614A408.6030102@invisiblethingslab.com>
In-Reply-To: <5614A408.6030102@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] [PATCH 1/5] Update XENBUS interface headers
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 Rafal Wojdyla
> Sent: 07 October 2015 05:48
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 1/5] Update XENBUS interface headers
> 
> Also add headers needed for next patches in the series.
>
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  include/cache_interface.h  | 233 ++++++++++++++++++++++++++++++++
>  include/evtchn_interface.h | 325
> +++++++++++++++++++++++++++++++++++++++++++++
>  include/gnttab_interface.h | 249
> ++++++++++++++++++++++++++++++++++
>  include/store_interface.h  |  68 +++++++++-
>  4 files changed, 871 insertions(+), 4 deletions(-)
>  create mode 100644 include/cache_interface.h
>  create mode 100644 include/evtchn_interface.h
>  create mode 100644 include/gnttab_interface.h
> 
> diff --git a/include/cache_interface.h b/include/cache_interface.h
> new file mode 100644
> index 0000000..dae3ac6
> --- /dev/null
> +++ b/include/cache_interface.h
> @@ -0,0 +1,233 @@
> +/* 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 cache_interface.h
> +    \brief XENBUS CACHE Interface
> +
> +    This interface provides access to XENBUS's object cache
> +    implementation.
> +*/
> +
> +#ifndef _XENBUS_CACHE_INTERFACE_H
> +#define _XENBUS_CACHE_INTERFACE_H
> +
> +#ifndef _WINDLL
> +
> +/*! \typedef XENBUS_CACHE
> +    \brief Cache handle
> +*/
> +typedef struct _XENBUS_CACHE    XENBUS_CACHE, *PXENBUS_CACHE;
> +
> +/*! \typedef XENBUS_CACHE_ACQUIRE
> +    \brief Acquire a reference to the CACHE interface
> +
> +    \param Interface The interface header
> +*/
> +typedef NTSTATUS
> +(*XENBUS_CACHE_ACQUIRE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_CACHE_RELEASE
> +    \brief Release a reference to the CACHE interface
> +
> +    \param Interface The interface header
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_RELEASE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_CACHE_CTOR
> +    \brief Object creator callback
> +
> +    \param Argument Context \a Argument supplied to \a
> XENBUS_CACHE_CREATE
> +    \param Object Newly allocated object
> +
> +    This callback is invoked just after a new object is allocated and may
> +    be used to initialize any object data prior to its insertion into the
> +    cache.
> +*/
> +typedef NTSTATUS
> +(*XENBUS_CACHE_CTOR)(
> +    IN  PVOID   Argument,
> +    IN  PVOID   Object
> +    );
> +
> +/*! \typedef XENBUS_CACHE_DTOR
> +    \brief Object destructor callback
> +
> +    \param Argument Context \a Argument supplied to \a
> XENBUS_CACHE_CREATE
> +    \param Object Object about to be freed
> +
> +    This callback is invoked just after an object is removed from the
> +    cache and before it is freed and may be used to tear down any object
> data.
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_DTOR)(
> +    IN  PVOID   Argument,
> +    IN  PVOID   Object
> +    );
> +
> +/*! \typedef XENBUS_CACHE_ACQUIRE_LOCK
> +    \brief Cache lock callback
> +
> +    \param Argument Context \a Argument supplied to \a
> XENBUS_CACHE_CREATE
> +
> +    This callback is invoked if the cache implementation requires mutual
> +    exclusion.
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_ACQUIRE_LOCK)(
> +    IN  PVOID   Argument
> +    );
> +
> +/*! \typedef XENBUS_CACHE_RELEASE_LOCK
> +    \brief Cache unlock callback
> +
> +    \param Argument Context \a Argument supplied to \a
> XENBUS_CACHE_CREATE
> +
> +    This callback is invoked to release the mutual exclusion lock acquired
> +    by a previous invocation of \a XENBUS_CACHE_ACQUIRE_LOCK.
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_RELEASE_LOCK)(
> +    IN  PVOID   Argument
> +    );
> +
> +/*! \typedef XENBUS_CACHE_CREATE
> +    \brief Create a cache of objects of the given \a Size
> +
> +    \param Interface The interface header
> +    \param Name A name for the cache which will be used in debug output
> +    \param Size The size of each object in bytes
> +    \param Reservation The target minimum population of the cache
> +    \param Ctor A callback which is invoked when a new object created
> +    \param Dtor A callback which is invoked when an object is destroyed
> +    \param AcquireLock A callback invoked to acquire a spinlock
> +    \param ReleaseLock A callback invoked to release the spinlock
> +    \param Argument An optional context argument passed to the callbacks
> +    \param Cache A pointer to a cache handle to be initialized
> +
> +    If a non-zero \a Reservation is specified then this method will fail
> +    unless that number of objects can be immediately created.
> +*/
> +typedef NTSTATUS
> +(*XENBUS_CACHE_CREATE)(
> +    IN  PINTERFACE                  Interface,
> +    IN  const CHAR                  *Name,
> +    IN  ULONG                       Size,
> +    IN  ULONG                       Reservation,
> +    IN  XENBUS_CACHE_CTOR           Ctor,
> +    IN  XENBUS_CACHE_DTOR           Dtor,
> +    IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
> +    IN  XENBUS_CACHE_RELEASE_LOCK   ReleaseLock,
> +    IN  PVOID                       Argument OPTIONAL,
> +    OUT PXENBUS_CACHE               *Cache
> +    );
> +
> +/*! \typedef XENBUS_CACHE_GET
> +    \brief Get an object from a \a Cache
> +
> +    \param Interface The interface header
> +    \param Cache The cache handle
> +    \param Locked If mutually exclusive access to the cache is already
> +    guaranteed then set this to TRUE
> +*/
> +typedef PVOID
> +(*XENBUS_CACHE_GET)(
> +    IN  PINTERFACE      Interface,
> +    IN  PXENBUS_CACHE   Cache,
> +    IN  BOOLEAN         Locked
> +    );
> +
> +/*! \typedef XENBUS_CACHE_PUT
> +    \brief Return an object to a \a Cache
> +
> +    \param Interface The interface header
> +    \param Cache The cache handle
> +    \param Locked If mutually exclusive access to the cache is already
> +    guaranteed then set this to TRUE
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_PUT)(
> +    IN  PINTERFACE      Interface,
> +    IN  PXENBUS_CACHE   Cache,
> +    IN  PVOID           Object,
> +    IN  BOOLEAN         Locked
> +    );
> +
> +/*! \typedef XENBUS_CACHE_DESTROY
> +    \brief Destroy a \a Cache
> +
> +    \param Interface The interface header
> +    \param Cache The cache handle
> +
> +    All objects must have been returned to the cache prior to destruction
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_DESTROY)(
> +    IN  PINTERFACE      Interface,
> +    IN  PXENBUS_CACHE   Cache
> +    );
> +
> +// {A98DFD78-416A-4949-92A5-E084F2F4B44E}
> +DEFINE_GUID(GUID_XENBUS_CACHE_INTERFACE,
> +0xa98dfd78, 0x416a, 0x4949, 0x92, 0xa5, 0xe0, 0x84, 0xf2, 0xf4, 0xb4, 0x4e);
> +
> +/*! \struct _XENBUS_CACHE_INTERFACE_V1
> +    \brief CACHE interface version 1
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_CACHE_INTERFACE_V1 {
> +    INTERFACE               Interface;
> +    XENBUS_CACHE_ACQUIRE    CacheAcquire;
> +    XENBUS_CACHE_RELEASE    CacheRelease;
> +    XENBUS_CACHE_CREATE     CacheCreate;
> +    XENBUS_CACHE_GET        CacheGet;
> +    XENBUS_CACHE_PUT        CachePut;
> +    XENBUS_CACHE_DESTROY    CacheDestroy;
> +};
> +
> +typedef struct _XENBUS_CACHE_INTERFACE_V1
> XENBUS_CACHE_INTERFACE, *PXENBUS_CACHE_INTERFACE;
> +
> +/*! \def XENBUS_CACHE
> +    \brief Macro at assist in method invocation
> +*/
> +#define XENBUS_CACHE(_Method, _Interface, ...)    \
> +    (_Interface)->Cache ## _Method((PINTERFACE)(_Interface),
> __VA_ARGS__)
> +
> +#endif  // _WINDLL
> +
> +#define XENBUS_CACHE_INTERFACE_VERSION_MIN  1
> +#define XENBUS_CACHE_INTERFACE_VERSION_MAX  1
> +
> +#endif  // _XENBUS_CACHE_INTERFACE_H
> diff --git a/include/evtchn_interface.h b/include/evtchn_interface.h
> new file mode 100644
> index 0000000..c63f063
> --- /dev/null
> +++ b/include/evtchn_interface.h
> @@ -0,0 +1,325 @@
> +/* 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 evtchn_interface.h
> +    \brief XENBUS EVTCHN Interface
> +
> +    This interface provides access to hypervisor event channels
> +*/
> +
> +#ifndef _XENBUS_EVTCHN_INTERFACE_H
> +#define _XENBUS_EVTCHN_INTERFACE_H
> +
> +#ifndef _WINDLL
> +
> +/*! \enum _XENBUS_EVTCHN_TYPE
> +    \brief Event channel type to be opened
> +*/
> +typedef enum _XENBUS_EVTCHN_TYPE {
> +    XENBUS_EVTCHN_TYPE_INVALID = 0,
> +    XENBUS_EVTCHN_TYPE_FIXED,           /*!< Fixed */
> +    XENBUS_EVTCHN_TYPE_UNBOUND,         /*!< Unbound */
> +    XENBUS_EVTCHN_TYPE_INTER_DOMAIN,    /*!< Interdomain */
> +    XENBUS_EVTCHN_TYPE_VIRQ             /*!< VIRQ */
> +} XENBUS_EVTCHN_TYPE, *PXENBUS_EVTCHN_TYPE;
> +
> +/*! \typedef XENBUS_EVTCHN_CHANNEL
> +    \brief Event channel handle
> +*/
> +typedef struct _XENBUS_EVTCHN_CHANNEL XENBUS_EVTCHN_CHANNEL,
> *PXENBUS_EVTCHN_CHANNEL;
> +
> +/*! \typedef XENBUS_EVTCHN_ACQUIRE
> +    \brief Acquire a reference to the EVTCHN interface
> +
> +    \param Interface The interface header
> +*/
> +typedef NTSTATUS
> +(*XENBUS_EVTCHN_ACQUIRE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_RELEASE
> +    \brief Release a reference to the EVTCHN interface
> +
> +    \param Interface The interface header
> +*/
> +typedef VOID
> +(*XENBUS_EVTCHN_RELEASE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_OPEN
> +    \brief Open an event channel
> +
> +    \param Interface The interface header
> +    \param Type The type of event channel to open
> +    \param Function The callback function
> +    \param Argument An optional context argument passed to the callback
> +    \param ... Additional parameters required by \a Type
> +
> +    \b Fixed:
> +    \param LocalPort The local port number of the (already bound) channel
> +    \param Mask Set to TRUE if the channel should be automatically masked
> before invoking the callback
> +
> +    \b Unbound:
> +    \param RemoteDomain The domid of the remote domain which will bind
> the channel
> +    \param Mask Set to TRUE if the channel should be automatically masked
> before invoking the callback
> +
> +    \b Interdomain:
> +    \param RemoteDomain The domid of the remote domain which has
> already bound the channel
> +    \param RemotePort The port number bound to the channel in the
> remote domain
> +    \param Mask Set to TRUE if the channel should be automatically masked
> before invoking the callback
> +
> +    \b VIRQ:
> +    \param Index The index number of the VIRQ
> +
> +    \return Event channel handle
> +*/
> +typedef PXENBUS_EVTCHN_CHANNEL
> +(*XENBUS_EVTCHN_OPEN)(
> +    IN  PINTERFACE          Interface,
> +    IN  XENBUS_EVTCHN_TYPE  Type,
> +    IN  PKSERVICE_ROUTINE   Function,
> +    IN  PVOID               Argument OPTIONAL,
> +    ...
> +    );
> +
> +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 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  USHORT                  Group,
> +    IN  UCHAR                   Number
> +    );
> +
> +typedef BOOLEAN
> +(*XENBUS_EVTCHN_UNMASK_V1)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
> +    IN  BOOLEAN                 InCallback
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_UNMASK
> +    \brief Unmask an event channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +    \param InCallback Set to TRUE if this method is invoked in context of the
> channel callback
> +*/
> +typedef VOID
> +(*XENBUS_EVTCHN_UNMASK)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
> +    IN  BOOLEAN                 InCallback
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_SEND
> +    \brief Send an event to the remote end of the channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +*/
> +typedef VOID
> +(*XENBUS_EVTCHN_SEND)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_TRIGGER
> +    \brief Send an event to the local end of the channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +*/
> +typedef VOID
> +(*XENBUS_EVTCHN_TRIGGER)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_WAIT
> +    \brief Wait for an event to the local end of the channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +    \param Timeout An optional timeout value (similar to
> KeWaitForSingleObject(), but non-zero values are allowed at
> DISPATCH_LEVEL).
> +*/
> +typedef NTSTATUS
> +(*XENBUS_EVTCHN_WAIT)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
> +    IN  PLARGE_INTEGER          Timeout OPTIONAL
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_GET_PORT
> +    \brief Get the local port number bound to the channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +    \return The port number
> +*/
> +typedef ULONG
> +(*XENBUS_EVTCHN_GET_PORT)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_CLOSE
> +    \brief Close an event channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +*/
> +typedef VOID
> +(*XENBUS_EVTCHN_CLOSE)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel
> +    );
> +
> +// {BE2440AC-1098-4150-AF4D-452FADCEF923}
> +DEFINE_GUID(GUID_XENBUS_EVTCHN_INTERFACE,
> +0xbe2440ac, 0x1098, 0x4150, 0xaf, 0x4d, 0x45, 0x2f, 0xad, 0xce, 0xf9, 0x23);
> +
> +/*! \struct _XENBUS_EVTCHN_INTERFACE_V1
> +    \brief EVTCHN interface version 1
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_EVTCHN_INTERFACE_V1 {
> +    INTERFACE               Interface;
> +    XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
> +    XENBUS_EVTCHN_RELEASE   EvtchnRelease;
> +    XENBUS_EVTCHN_OPEN      EvtchnOpen;
> +    XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
> +    XENBUS_EVTCHN_SEND      EvtchnSend;
> +    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
> +    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
> +    XENBUS_EVTCHN_CLOSE     EvtchnClose;
> +};
> +
> +/*! \struct _XENBUS_EVTCHN_INTERFACE_V2
> +    \brief EVTCHN interface version 2
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_EVTCHN_INTERFACE_V2 {
> +    INTERFACE               Interface;
> +    XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
> +    XENBUS_EVTCHN_RELEASE   EvtchnRelease;
> +    XENBUS_EVTCHN_OPEN      EvtchnOpen;
> +    XENBUS_EVTCHN_BIND_V2   EvtchnBindVersion2;
> +    XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
> +    XENBUS_EVTCHN_SEND      EvtchnSend;
> +    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
> +    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
> +    XENBUS_EVTCHN_CLOSE     EvtchnClose;
> +};
> +
> +/*! \struct _XENBUS_EVTCHN_INTERFACE_V3
> +    \brief EVTCHN interface version 3
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_EVTCHN_INTERFACE_V3 {
> +    INTERFACE               Interface;
> +    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;
> +    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
> +    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
> +    XENBUS_EVTCHN_CLOSE     EvtchnClose;
> +};
> +
> +/*! \struct _XENBUS_EVTCHN_INTERFACE_V5
> +    \brief EVTCHN interface version 5
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_EVTCHN_INTERFACE_V5 {
> +    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;
> +    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
> +    XENBUS_EVTCHN_WAIT      EvtchnWait;
> +    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
> +    XENBUS_EVTCHN_CLOSE     EvtchnClose;
> +};
> +
> +typedef struct _XENBUS_EVTCHN_INTERFACE_V5
> XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
> +
> +/*! \def XENBUS_EVTCHN
> +    \brief Macro at assist in method invocation
> +*/
> +#define XENBUS_EVTCHN(_Method, _Interface, ...)    \
> +    (_Interface)->Evtchn ## _Method((PINTERFACE)(_Interface),
> __VA_ARGS__)
> +
> +#endif  // _WINDLL
> +
> +#define XENBUS_EVTCHN_INTERFACE_VERSION_MIN 1
> +#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 5
> +
> +#endif  // _XENBUS_EVTCHN_INTERFACE_H
> +
> diff --git a/include/gnttab_interface.h b/include/gnttab_interface.h
> new file mode 100644
> index 0000000..b0f4adf
> --- /dev/null
> +++ b/include/gnttab_interface.h
> @@ -0,0 +1,249 @@
> +/* 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 gnttab_interface.h
> +    \brief XENBUS GNTTAB Interface
> +
> +    This interface provides access to the hypervisor grant table
> +*/
> +
> +#ifndef _XENBUS_GNTTAB_INTERFACE_H
> +#define _XENBUS_GNTTAB_INTERFACE_H
> +
> +#include <cache_interface.h>
> +
> +#ifndef _WINDLL
> +
> +/*! \typedef XENBUS_GNTTAB_ENTRY
> +    \brief Grant table entry handle
> +*/
> +typedef struct _XENBUS_GNTTAB_ENTRY XENBUS_GNTTAB_ENTRY,
> *PXENBUS_GNTTAB_ENTRY;
> +
> +/*! \typedef XENBUS_GNTTAB_CACHE
> +    \brief Grant table cache handle
> +*/
> +typedef struct _XENBUS_GNTTAB_CACHE XENBUS_GNTTAB_CACHE,
> *PXENBUS_GNTTAB_CACHE;
> +
> +/*! \typedef XENBUS_GNTTAB_ACQUIRE
> +    \brief Acquire a reference to the GNTTAB interface
> +
> +    \param Interface The interface header
> +*/
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_ACQUIRE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_RELEASE
> +    \brief Release a reference to the GNTTAB interface
> +
> +    \param Interface The interface header
> +*/
> +typedef VOID
> +(*XENBUS_GNTTAB_RELEASE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_CREATE_CACHE
> +    \brief Create a cache of grant table entries
> +
> +    \param Interface The interface header
> +    \param Name A name for the cache which will be used in debug output
> +    \param Reservation The target minimum population of the cache
> +    \param AcquireLock A callback invoked to acquire a spinlock
> +    \param ReleaseLock A callback invoked to release the spinlock
> +    \param Argument An optional context argument passed to the callbacks
> +    \param Cache A pointer to a grant table cache handle to be initialized
> +*/
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_CREATE_CACHE)(
> +    IN  PINTERFACE                  Interface,
> +    IN  const CHAR                  *Name,
> +    IN  ULONG                       Reservation,
> +    IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
> +    IN  XENBUS_CACHE_RELEASE_LOCK   ReleaseLock,
> +    IN  PVOID                       Argument OPTIONAL,
> +    OUT PXENBUS_GNTTAB_CACHE        *Cache
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS
> +    \brief Get a table entry from the \a Cache permitting access to a given \a
> Pfn
> +
> +    \param Interface The interface header
> +    \param Cache The grant table cache handle
> +    \param Locked If mutually exclusive access to the cache is already
> +    guaranteed then set this to TRUE
> +    \param Domain The domid of the domain being granted access
> +    \param Pfn The frame number of the page that we are granting access to
> +    \param ReadOnly Set to TRUE if the foreign domain is only being granted
> +    read access
> +    \param Entry A pointer to a grant table entry handle to be initialized
> +*/
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS)(
> +    IN  PINTERFACE                  Interface,
> +    IN  PXENBUS_GNTTAB_CACHE        Cache,
> +    IN  BOOLEAN                     Locked,
> +    IN  USHORT                      Domain,
> +    IN  PFN_NUMBER                  Pfn,
> +    IN  BOOLEAN                     ReadOnly,
> +    OUT PXENBUS_GNTTAB_ENTRY        *Entry
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS
> +    \brief Revoke foreign access and return the \a Entry to the \a Cache
> +
> +    \param Interface The interface header
> +    \param Cache The grant table cache handle
> +    \param Locked If mutually exclusive access to the cache is already
> +    guaranteed then set this to TRUE
> +    \param Entry The grant table entry handle
> +*/
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS)(
> +    IN  PINTERFACE                  Interface,
> +    IN  PXENBUS_GNTTAB_CACHE        Cache,
> +    IN  BOOLEAN                     Locked,
> +    IN  PXENBUS_GNTTAB_ENTRY        Entry
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_GET_REFERENCE
> +    \brief Get the reference number of the entry
> +
> +    \param Interface The interface header
> +    \param Entry The grant table entry handle
> +    \return The reference number
> +*/
> +typedef ULONG
> +(*XENBUS_GNTTAB_GET_REFERENCE)(
> +    IN  PINTERFACE                  Interface,
> +    IN  PXENBUS_GNTTAB_ENTRY        Entry
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_DESTROY_CACHE
> +    \brief Destroy a cache of grant table entries
> +
> +    \param Interface The interface header
> +    \param Cache The grant table cache handle
> +
> +    All grant table entries must have been revoked prior to destruction
> +    of the cache
> +*/
> +typedef VOID
> +(*XENBUS_GNTTAB_DESTROY_CACHE)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_GNTTAB_CACHE    Cache
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_MAP_FOREIGN_PAGES
> +    \brief Map foreign memory pages into the system address space
> +
> +    \param Interface The interface header
> +    \param Domain The domid of the foreign domain that granted the pages
> +    \param NumberPages Number of pages to map
> +    \param References Array of grant reference numbers shared by the
> foreign domain
> +    \param ReadOnly If TRUE, pages are mapped with read-only access
> +    \param Address The physical address that the foreign pages are mapped
> under
> +*/
> +
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_MAP_FOREIGN_PAGES)(
> +    IN  PINTERFACE              Interface,
> +    IN  USHORT                  Domain,
> +    IN  ULONG                   NumberPages,
> +    IN  PULONG                  References,
> +    IN  BOOLEAN                 ReadOnly,
> +    OUT PHYSICAL_ADDRESS        *Address
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES
> +    \brief Unmap foreign memory pages from the system address space
> +
> +    \param Interface The interface header
> +    \param Address The physical address that the foreign pages are mapped
> under
> +*/
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES)(
> +    IN  PINTERFACE              Interface,
> +    IN  PHYSICAL_ADDRESS        Address
> +    );
> +
> +// {763679C5-E5C2-4A6D-8B88-6BB02EC42D8E}
> +DEFINE_GUID(GUID_XENBUS_GNTTAB_INTERFACE,
> +0x763679c5, 0xe5c2, 0x4a6d, 0x8b, 0x88, 0x6b, 0xb0, 0x2e, 0xc4, 0x2d, 0x8e);
> +
> +/*! \struct _XENBUS_GNTTAB_INTERFACE_V1
> +    \brief GNTTAB interface version 1
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_GNTTAB_INTERFACE_V1 {
> +    INTERFACE                           Interface;
> +    XENBUS_GNTTAB_ACQUIRE               GnttabAcquire;
> +    XENBUS_GNTTAB_RELEASE               GnttabRelease;
> +    XENBUS_GNTTAB_CREATE_CACHE          GnttabCreateCache;
> +    XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS
> GnttabPermitForeignAccess;
> +    XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS
> GnttabRevokeForeignAccess;
> +    XENBUS_GNTTAB_GET_REFERENCE         GnttabGetReference;
> +    XENBUS_GNTTAB_DESTROY_CACHE         GnttabDestroyCache;
> +};
> +
> +/*! \struct _XENBUS_GNTTAB_INTERFACE_V2
> +    \brief GNTTAB interface version 2
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_GNTTAB_INTERFACE_V2 {
> +    INTERFACE                           Interface;
> +    XENBUS_GNTTAB_ACQUIRE               GnttabAcquire;
> +    XENBUS_GNTTAB_RELEASE               GnttabRelease;
> +    XENBUS_GNTTAB_CREATE_CACHE          GnttabCreateCache;
> +    XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS
> GnttabPermitForeignAccess;
> +    XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS
> GnttabRevokeForeignAccess;
> +    XENBUS_GNTTAB_GET_REFERENCE         GnttabGetReference;
> +    XENBUS_GNTTAB_DESTROY_CACHE         GnttabDestroyCache;
> +    XENBUS_GNTTAB_MAP_FOREIGN_PAGES     GnttabMapForeignPages;
> +    XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES
> GnttabUnmapForeignPages;
> +};
> +
> +typedef struct _XENBUS_GNTTAB_INTERFACE_V2
> XENBUS_GNTTAB_INTERFACE, *PXENBUS_GNTTAB_INTERFACE;
> +
> +/*! \def XENBUS_GNTTAB
> +    \brief Macro at assist in method invocation
> +*/
> +#define XENBUS_GNTTAB(_Method, _Interface, ...)    \
> +    (_Interface)->Gnttab ## _Method((PINTERFACE)(_Interface),
> __VA_ARGS__)
> +
> +#endif  // _WINDLL
> +
> +#define XENBUS_GNTTAB_INTERFACE_VERSION_MIN 1
> +#define XENBUS_GNTTAB_INTERFACE_VERSION_MAX 2
> +
> +#endif  // _XENBUS_GNTTAB_INTERFACE_H
> +
> diff --git a/include/store_interface.h b/include/store_interface.h
> index 5bcbba3..52f1a1d 100644
> --- a/include/store_interface.h
> +++ b/include/store_interface.h
> @@ -50,6 +50,23 @@ typedef struct _XENBUS_STORE_TRANSACTION
> XENBUS_STORE_TRANSACTION, *PXENBUS_S
>  */
>  typedef struct _XENBUS_STORE_WATCH          XENBUS_STORE_WATCH,
> *PXENBUS_STORE_WATCH;
> 
> +/*! \typedef XENBUS_STORE_PERMISSION_MASK
> +    \brief Bitmask of XenStore key permissions
> +*/
> +typedef enum _XENBUS_STORE_PERMISSION_MASK {
> +    XENBUS_STORE_PERM_NONE = 0,
> +    XENBUS_STORE_PERM_READ = 1,
> +    XENBUS_STORE_PERM_WRITE = 2,
> +} XENBUS_STORE_PERMISSION_MASK;
> +
> +/*! \typedef XENBUS_STORE_PERMISSION
> +    \brief XenStore key permissions entry for a single domain
> +*/
> +typedef struct _XENBUS_STORE_PERMISSION {
> +    USHORT                          Domain;
> +    XENBUS_STORE_PERMISSION_MASK    Mask;
> +} XENBUS_STORE_PERMISSION, *PXENBUS_STORE_PERMISSION;
> +
>  /*! \typedef XENBUS_STORE_ACQUIRE
>      \brief Acquire a reference to the STORE interface
> 
> @@ -247,10 +264,36 @@ typedef VOID
>      IN  PINTERFACE  Interface
>      );
> 
> +/*! \typedef XENBUS_STORE_PERMISSIONS_SET
> +    \brief Set permissions for a XenStore key
> +
> +    \param Interface The interface header
> +    \param Transaction The transaction handle (NULL if this is not
> +    part of a transaction)
> +    \param Prefix An optional prefix for the \a Node
> +    \param Node The concatenation of the \a Prefix and this value specifies
> +    the XenStore key to set permissions of
> +    \param Permissions An array of permissions to set
> +    \param NumberPermissions Number of elements in the \a Permissions
> array
> +*/
> +typedef NTSTATUS
> +(*XENBUS_STORE_PERMISSIONS_SET)(
> +    IN  PINTERFACE                  Interface,
> +    IN  PXENBUS_STORE_TRANSACTION   Transaction OPTIONAL,
> +    IN  PCHAR                       Prefix OPTIONAL,
> +    IN  PCHAR                       Node,
> +    IN  PXENBUS_STORE_PERMISSION    Permissions,
> +    IN  ULONG                       NumberPermissions
> +    );
> +
>  // {86824C3B-D34E-4753-B281-2F1E3AD214D7}
>  DEFINE_GUID(GUID_XENBUS_STORE_INTERFACE,
>  0x86824c3b, 0xd34e, 0x4753, 0xb2, 0x81, 0x2f, 0x1e, 0x3a, 0xd2, 0x14, 0xd7);
> 
> +/*! \struct _XENBUS_STORE_INTERFACE_V1
> +    \brief STORE interface version 1
> +    \ingroup interfaces
> +*/
>  struct _XENBUS_STORE_INTERFACE_V1 {
>      INTERFACE                       Interface;
>      XENBUS_STORE_ACQUIRE            StoreAcquire;
> @@ -267,11 +310,28 @@ struct _XENBUS_STORE_INTERFACE_V1 {
>      XENBUS_STORE_POLL               StorePoll;
>  };
> 
> -/*! \struct _XENBUS_STORE_INTERFACE_V1
> -    \brief STORE interface version 1
> +/*! \struct _XENBUS_STORE_INTERFACE_V2
> +    \brief STORE interface version 2
>      \ingroup interfaces
>  */
> -typedef struct _XENBUS_STORE_INTERFACE_V1
> XENBUS_STORE_INTERFACE, *PXENBUS_STORE_INTERFACE;
> +struct _XENBUS_STORE_INTERFACE_V2 {
> +    INTERFACE                       Interface;
> +    XENBUS_STORE_ACQUIRE            StoreAcquire;
> +    XENBUS_STORE_RELEASE            StoreRelease;
> +    XENBUS_STORE_FREE               StoreFree;
> +    XENBUS_STORE_READ               StoreRead;
> +    XENBUS_STORE_PRINTF             StorePrintf;
> +    XENBUS_STORE_PERMISSIONS_SET    StorePermissionsSet;
> +    XENBUS_STORE_REMOVE             StoreRemove;
> +    XENBUS_STORE_DIRECTORY          StoreDirectory;
> +    XENBUS_STORE_TRANSACTION_START  StoreTransactionStart;
> +    XENBUS_STORE_TRANSACTION_END    StoreTransactionEnd;
> +    XENBUS_STORE_WATCH_ADD          StoreWatchAdd;
> +    XENBUS_STORE_WATCH_REMOVE       StoreWatchRemove;
> +    XENBUS_STORE_POLL               StorePoll;
> +};
> +
> +typedef struct _XENBUS_STORE_INTERFACE_V2
> XENBUS_STORE_INTERFACE, *PXENBUS_STORE_INTERFACE;
> 
>  /*! \def XENBUS_STORE
>      \brief Macro at assist in method invocation
> @@ -282,7 +342,7 @@ typedef struct _XENBUS_STORE_INTERFACE_V1
> XENBUS_STORE_INTERFACE, *PXENBUS_STORE
>  #endif  // _WINDLL
> 
>  #define XENBUS_STORE_INTERFACE_VERSION_MIN  1
> -#define XENBUS_STORE_INTERFACE_VERSION_MAX  1
> +#define XENBUS_STORE_INTERFACE_VERSION_MAX  2
> 
>  #endif  // _XENBUS_STORE_INTERFACE_H
> 
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Tue Oct 13 16:36:53 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 13 Oct 2015 16:36: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 1Zm2ZI-00076Q-Ag; Tue, 13 Oct 2015 16:36:52 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72140db33=Paul.Durrant@citrix.com>)
	id 1Zm2ZH-00075u-Ev
	for win-pv-devel@lists.xenproject.org; Tue, 13 Oct 2015 16:36:51 +0000
Received: from [85.158.139.211] by server-17.bemta-5.messagelabs.com id
	B6/75-18107-2233D165; Tue, 13 Oct 2015 16:36:50 +0000
X-Env-Sender: prvs=72140db33=Paul.Durrant@citrix.com
X-Msg-Ref: server-5.tower-206.messagelabs.com!1444754208!41996713!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8400 invoked from network); 13 Oct 2015 16:36:48 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-5.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2015 16:36:48 -0000
X-IronPort-AV: E=Sophos;i="5.17,678,1437436800"; 
   d="scan'208";a="5132594"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 1/5] Update XENBUS interface headers
Thread-Index: AQHRALuB9Lsj8vBcp0+MH/AhlaF2Op5pqQ5A
Date: Tue, 13 Oct 2015 16:36:46 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F61013A@AMSPEX01CL01.citrite.net>
References: <5614A408.6030102@invisiblethingslab.com>
In-Reply-To: <5614A408.6030102@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] [PATCH 1/5] Update XENBUS interface headers
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 Rafal Wojdyla
> Sent: 07 October 2015 05:48
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 1/5] Update XENBUS interface headers
> 
> Also add headers needed for next patches in the series.
>
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  include/cache_interface.h  | 233 ++++++++++++++++++++++++++++++++
>  include/evtchn_interface.h | 325
> +++++++++++++++++++++++++++++++++++++++++++++
>  include/gnttab_interface.h | 249
> ++++++++++++++++++++++++++++++++++
>  include/store_interface.h  |  68 +++++++++-
>  4 files changed, 871 insertions(+), 4 deletions(-)
>  create mode 100644 include/cache_interface.h
>  create mode 100644 include/evtchn_interface.h
>  create mode 100644 include/gnttab_interface.h
> 
> diff --git a/include/cache_interface.h b/include/cache_interface.h
> new file mode 100644
> index 0000000..dae3ac6
> --- /dev/null
> +++ b/include/cache_interface.h
> @@ -0,0 +1,233 @@
> +/* 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 cache_interface.h
> +    \brief XENBUS CACHE Interface
> +
> +    This interface provides access to XENBUS's object cache
> +    implementation.
> +*/
> +
> +#ifndef _XENBUS_CACHE_INTERFACE_H
> +#define _XENBUS_CACHE_INTERFACE_H
> +
> +#ifndef _WINDLL
> +
> +/*! \typedef XENBUS_CACHE
> +    \brief Cache handle
> +*/
> +typedef struct _XENBUS_CACHE    XENBUS_CACHE, *PXENBUS_CACHE;
> +
> +/*! \typedef XENBUS_CACHE_ACQUIRE
> +    \brief Acquire a reference to the CACHE interface
> +
> +    \param Interface The interface header
> +*/
> +typedef NTSTATUS
> +(*XENBUS_CACHE_ACQUIRE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_CACHE_RELEASE
> +    \brief Release a reference to the CACHE interface
> +
> +    \param Interface The interface header
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_RELEASE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_CACHE_CTOR
> +    \brief Object creator callback
> +
> +    \param Argument Context \a Argument supplied to \a
> XENBUS_CACHE_CREATE
> +    \param Object Newly allocated object
> +
> +    This callback is invoked just after a new object is allocated and may
> +    be used to initialize any object data prior to its insertion into the
> +    cache.
> +*/
> +typedef NTSTATUS
> +(*XENBUS_CACHE_CTOR)(
> +    IN  PVOID   Argument,
> +    IN  PVOID   Object
> +    );
> +
> +/*! \typedef XENBUS_CACHE_DTOR
> +    \brief Object destructor callback
> +
> +    \param Argument Context \a Argument supplied to \a
> XENBUS_CACHE_CREATE
> +    \param Object Object about to be freed
> +
> +    This callback is invoked just after an object is removed from the
> +    cache and before it is freed and may be used to tear down any object
> data.
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_DTOR)(
> +    IN  PVOID   Argument,
> +    IN  PVOID   Object
> +    );
> +
> +/*! \typedef XENBUS_CACHE_ACQUIRE_LOCK
> +    \brief Cache lock callback
> +
> +    \param Argument Context \a Argument supplied to \a
> XENBUS_CACHE_CREATE
> +
> +    This callback is invoked if the cache implementation requires mutual
> +    exclusion.
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_ACQUIRE_LOCK)(
> +    IN  PVOID   Argument
> +    );
> +
> +/*! \typedef XENBUS_CACHE_RELEASE_LOCK
> +    \brief Cache unlock callback
> +
> +    \param Argument Context \a Argument supplied to \a
> XENBUS_CACHE_CREATE
> +
> +    This callback is invoked to release the mutual exclusion lock acquired
> +    by a previous invocation of \a XENBUS_CACHE_ACQUIRE_LOCK.
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_RELEASE_LOCK)(
> +    IN  PVOID   Argument
> +    );
> +
> +/*! \typedef XENBUS_CACHE_CREATE
> +    \brief Create a cache of objects of the given \a Size
> +
> +    \param Interface The interface header
> +    \param Name A name for the cache which will be used in debug output
> +    \param Size The size of each object in bytes
> +    \param Reservation The target minimum population of the cache
> +    \param Ctor A callback which is invoked when a new object created
> +    \param Dtor A callback which is invoked when an object is destroyed
> +    \param AcquireLock A callback invoked to acquire a spinlock
> +    \param ReleaseLock A callback invoked to release the spinlock
> +    \param Argument An optional context argument passed to the callbacks
> +    \param Cache A pointer to a cache handle to be initialized
> +
> +    If a non-zero \a Reservation is specified then this method will fail
> +    unless that number of objects can be immediately created.
> +*/
> +typedef NTSTATUS
> +(*XENBUS_CACHE_CREATE)(
> +    IN  PINTERFACE                  Interface,
> +    IN  const CHAR                  *Name,
> +    IN  ULONG                       Size,
> +    IN  ULONG                       Reservation,
> +    IN  XENBUS_CACHE_CTOR           Ctor,
> +    IN  XENBUS_CACHE_DTOR           Dtor,
> +    IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
> +    IN  XENBUS_CACHE_RELEASE_LOCK   ReleaseLock,
> +    IN  PVOID                       Argument OPTIONAL,
> +    OUT PXENBUS_CACHE               *Cache
> +    );
> +
> +/*! \typedef XENBUS_CACHE_GET
> +    \brief Get an object from a \a Cache
> +
> +    \param Interface The interface header
> +    \param Cache The cache handle
> +    \param Locked If mutually exclusive access to the cache is already
> +    guaranteed then set this to TRUE
> +*/
> +typedef PVOID
> +(*XENBUS_CACHE_GET)(
> +    IN  PINTERFACE      Interface,
> +    IN  PXENBUS_CACHE   Cache,
> +    IN  BOOLEAN         Locked
> +    );
> +
> +/*! \typedef XENBUS_CACHE_PUT
> +    \brief Return an object to a \a Cache
> +
> +    \param Interface The interface header
> +    \param Cache The cache handle
> +    \param Locked If mutually exclusive access to the cache is already
> +    guaranteed then set this to TRUE
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_PUT)(
> +    IN  PINTERFACE      Interface,
> +    IN  PXENBUS_CACHE   Cache,
> +    IN  PVOID           Object,
> +    IN  BOOLEAN         Locked
> +    );
> +
> +/*! \typedef XENBUS_CACHE_DESTROY
> +    \brief Destroy a \a Cache
> +
> +    \param Interface The interface header
> +    \param Cache The cache handle
> +
> +    All objects must have been returned to the cache prior to destruction
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_DESTROY)(
> +    IN  PINTERFACE      Interface,
> +    IN  PXENBUS_CACHE   Cache
> +    );
> +
> +// {A98DFD78-416A-4949-92A5-E084F2F4B44E}
> +DEFINE_GUID(GUID_XENBUS_CACHE_INTERFACE,
> +0xa98dfd78, 0x416a, 0x4949, 0x92, 0xa5, 0xe0, 0x84, 0xf2, 0xf4, 0xb4, 0x4e);
> +
> +/*! \struct _XENBUS_CACHE_INTERFACE_V1
> +    \brief CACHE interface version 1
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_CACHE_INTERFACE_V1 {
> +    INTERFACE               Interface;
> +    XENBUS_CACHE_ACQUIRE    CacheAcquire;
> +    XENBUS_CACHE_RELEASE    CacheRelease;
> +    XENBUS_CACHE_CREATE     CacheCreate;
> +    XENBUS_CACHE_GET        CacheGet;
> +    XENBUS_CACHE_PUT        CachePut;
> +    XENBUS_CACHE_DESTROY    CacheDestroy;
> +};
> +
> +typedef struct _XENBUS_CACHE_INTERFACE_V1
> XENBUS_CACHE_INTERFACE, *PXENBUS_CACHE_INTERFACE;
> +
> +/*! \def XENBUS_CACHE
> +    \brief Macro at assist in method invocation
> +*/
> +#define XENBUS_CACHE(_Method, _Interface, ...)    \
> +    (_Interface)->Cache ## _Method((PINTERFACE)(_Interface),
> __VA_ARGS__)
> +
> +#endif  // _WINDLL
> +
> +#define XENBUS_CACHE_INTERFACE_VERSION_MIN  1
> +#define XENBUS_CACHE_INTERFACE_VERSION_MAX  1
> +
> +#endif  // _XENBUS_CACHE_INTERFACE_H
> diff --git a/include/evtchn_interface.h b/include/evtchn_interface.h
> new file mode 100644
> index 0000000..c63f063
> --- /dev/null
> +++ b/include/evtchn_interface.h
> @@ -0,0 +1,325 @@
> +/* 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 evtchn_interface.h
> +    \brief XENBUS EVTCHN Interface
> +
> +    This interface provides access to hypervisor event channels
> +*/
> +
> +#ifndef _XENBUS_EVTCHN_INTERFACE_H
> +#define _XENBUS_EVTCHN_INTERFACE_H
> +
> +#ifndef _WINDLL
> +
> +/*! \enum _XENBUS_EVTCHN_TYPE
> +    \brief Event channel type to be opened
> +*/
> +typedef enum _XENBUS_EVTCHN_TYPE {
> +    XENBUS_EVTCHN_TYPE_INVALID = 0,
> +    XENBUS_EVTCHN_TYPE_FIXED,           /*!< Fixed */
> +    XENBUS_EVTCHN_TYPE_UNBOUND,         /*!< Unbound */
> +    XENBUS_EVTCHN_TYPE_INTER_DOMAIN,    /*!< Interdomain */
> +    XENBUS_EVTCHN_TYPE_VIRQ             /*!< VIRQ */
> +} XENBUS_EVTCHN_TYPE, *PXENBUS_EVTCHN_TYPE;
> +
> +/*! \typedef XENBUS_EVTCHN_CHANNEL
> +    \brief Event channel handle
> +*/
> +typedef struct _XENBUS_EVTCHN_CHANNEL XENBUS_EVTCHN_CHANNEL,
> *PXENBUS_EVTCHN_CHANNEL;
> +
> +/*! \typedef XENBUS_EVTCHN_ACQUIRE
> +    \brief Acquire a reference to the EVTCHN interface
> +
> +    \param Interface The interface header
> +*/
> +typedef NTSTATUS
> +(*XENBUS_EVTCHN_ACQUIRE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_RELEASE
> +    \brief Release a reference to the EVTCHN interface
> +
> +    \param Interface The interface header
> +*/
> +typedef VOID
> +(*XENBUS_EVTCHN_RELEASE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_OPEN
> +    \brief Open an event channel
> +
> +    \param Interface The interface header
> +    \param Type The type of event channel to open
> +    \param Function The callback function
> +    \param Argument An optional context argument passed to the callback
> +    \param ... Additional parameters required by \a Type
> +
> +    \b Fixed:
> +    \param LocalPort The local port number of the (already bound) channel
> +    \param Mask Set to TRUE if the channel should be automatically masked
> before invoking the callback
> +
> +    \b Unbound:
> +    \param RemoteDomain The domid of the remote domain which will bind
> the channel
> +    \param Mask Set to TRUE if the channel should be automatically masked
> before invoking the callback
> +
> +    \b Interdomain:
> +    \param RemoteDomain The domid of the remote domain which has
> already bound the channel
> +    \param RemotePort The port number bound to the channel in the
> remote domain
> +    \param Mask Set to TRUE if the channel should be automatically masked
> before invoking the callback
> +
> +    \b VIRQ:
> +    \param Index The index number of the VIRQ
> +
> +    \return Event channel handle
> +*/
> +typedef PXENBUS_EVTCHN_CHANNEL
> +(*XENBUS_EVTCHN_OPEN)(
> +    IN  PINTERFACE          Interface,
> +    IN  XENBUS_EVTCHN_TYPE  Type,
> +    IN  PKSERVICE_ROUTINE   Function,
> +    IN  PVOID               Argument OPTIONAL,
> +    ...
> +    );
> +
> +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 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  USHORT                  Group,
> +    IN  UCHAR                   Number
> +    );
> +
> +typedef BOOLEAN
> +(*XENBUS_EVTCHN_UNMASK_V1)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
> +    IN  BOOLEAN                 InCallback
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_UNMASK
> +    \brief Unmask an event channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +    \param InCallback Set to TRUE if this method is invoked in context of the
> channel callback
> +*/
> +typedef VOID
> +(*XENBUS_EVTCHN_UNMASK)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
> +    IN  BOOLEAN                 InCallback
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_SEND
> +    \brief Send an event to the remote end of the channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +*/
> +typedef VOID
> +(*XENBUS_EVTCHN_SEND)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_TRIGGER
> +    \brief Send an event to the local end of the channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +*/
> +typedef VOID
> +(*XENBUS_EVTCHN_TRIGGER)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_WAIT
> +    \brief Wait for an event to the local end of the channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +    \param Timeout An optional timeout value (similar to
> KeWaitForSingleObject(), but non-zero values are allowed at
> DISPATCH_LEVEL).
> +*/
> +typedef NTSTATUS
> +(*XENBUS_EVTCHN_WAIT)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
> +    IN  PLARGE_INTEGER          Timeout OPTIONAL
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_GET_PORT
> +    \brief Get the local port number bound to the channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +    \return The port number
> +*/
> +typedef ULONG
> +(*XENBUS_EVTCHN_GET_PORT)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_CLOSE
> +    \brief Close an event channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +*/
> +typedef VOID
> +(*XENBUS_EVTCHN_CLOSE)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel
> +    );
> +
> +// {BE2440AC-1098-4150-AF4D-452FADCEF923}
> +DEFINE_GUID(GUID_XENBUS_EVTCHN_INTERFACE,
> +0xbe2440ac, 0x1098, 0x4150, 0xaf, 0x4d, 0x45, 0x2f, 0xad, 0xce, 0xf9, 0x23);
> +
> +/*! \struct _XENBUS_EVTCHN_INTERFACE_V1
> +    \brief EVTCHN interface version 1
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_EVTCHN_INTERFACE_V1 {
> +    INTERFACE               Interface;
> +    XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
> +    XENBUS_EVTCHN_RELEASE   EvtchnRelease;
> +    XENBUS_EVTCHN_OPEN      EvtchnOpen;
> +    XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
> +    XENBUS_EVTCHN_SEND      EvtchnSend;
> +    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
> +    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
> +    XENBUS_EVTCHN_CLOSE     EvtchnClose;
> +};
> +
> +/*! \struct _XENBUS_EVTCHN_INTERFACE_V2
> +    \brief EVTCHN interface version 2
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_EVTCHN_INTERFACE_V2 {
> +    INTERFACE               Interface;
> +    XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
> +    XENBUS_EVTCHN_RELEASE   EvtchnRelease;
> +    XENBUS_EVTCHN_OPEN      EvtchnOpen;
> +    XENBUS_EVTCHN_BIND_V2   EvtchnBindVersion2;
> +    XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
> +    XENBUS_EVTCHN_SEND      EvtchnSend;
> +    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
> +    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
> +    XENBUS_EVTCHN_CLOSE     EvtchnClose;
> +};
> +
> +/*! \struct _XENBUS_EVTCHN_INTERFACE_V3
> +    \brief EVTCHN interface version 3
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_EVTCHN_INTERFACE_V3 {
> +    INTERFACE               Interface;
> +    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;
> +    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
> +    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
> +    XENBUS_EVTCHN_CLOSE     EvtchnClose;
> +};
> +
> +/*! \struct _XENBUS_EVTCHN_INTERFACE_V5
> +    \brief EVTCHN interface version 5
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_EVTCHN_INTERFACE_V5 {
> +    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;
> +    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
> +    XENBUS_EVTCHN_WAIT      EvtchnWait;
> +    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
> +    XENBUS_EVTCHN_CLOSE     EvtchnClose;
> +};
> +
> +typedef struct _XENBUS_EVTCHN_INTERFACE_V5
> XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
> +
> +/*! \def XENBUS_EVTCHN
> +    \brief Macro at assist in method invocation
> +*/
> +#define XENBUS_EVTCHN(_Method, _Interface, ...)    \
> +    (_Interface)->Evtchn ## _Method((PINTERFACE)(_Interface),
> __VA_ARGS__)
> +
> +#endif  // _WINDLL
> +
> +#define XENBUS_EVTCHN_INTERFACE_VERSION_MIN 1
> +#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 5
> +
> +#endif  // _XENBUS_EVTCHN_INTERFACE_H
> +
> diff --git a/include/gnttab_interface.h b/include/gnttab_interface.h
> new file mode 100644
> index 0000000..b0f4adf
> --- /dev/null
> +++ b/include/gnttab_interface.h
> @@ -0,0 +1,249 @@
> +/* 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 gnttab_interface.h
> +    \brief XENBUS GNTTAB Interface
> +
> +    This interface provides access to the hypervisor grant table
> +*/
> +
> +#ifndef _XENBUS_GNTTAB_INTERFACE_H
> +#define _XENBUS_GNTTAB_INTERFACE_H
> +
> +#include <cache_interface.h>
> +
> +#ifndef _WINDLL
> +
> +/*! \typedef XENBUS_GNTTAB_ENTRY
> +    \brief Grant table entry handle
> +*/
> +typedef struct _XENBUS_GNTTAB_ENTRY XENBUS_GNTTAB_ENTRY,
> *PXENBUS_GNTTAB_ENTRY;
> +
> +/*! \typedef XENBUS_GNTTAB_CACHE
> +    \brief Grant table cache handle
> +*/
> +typedef struct _XENBUS_GNTTAB_CACHE XENBUS_GNTTAB_CACHE,
> *PXENBUS_GNTTAB_CACHE;
> +
> +/*! \typedef XENBUS_GNTTAB_ACQUIRE
> +    \brief Acquire a reference to the GNTTAB interface
> +
> +    \param Interface The interface header
> +*/
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_ACQUIRE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_RELEASE
> +    \brief Release a reference to the GNTTAB interface
> +
> +    \param Interface The interface header
> +*/
> +typedef VOID
> +(*XENBUS_GNTTAB_RELEASE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_CREATE_CACHE
> +    \brief Create a cache of grant table entries
> +
> +    \param Interface The interface header
> +    \param Name A name for the cache which will be used in debug output
> +    \param Reservation The target minimum population of the cache
> +    \param AcquireLock A callback invoked to acquire a spinlock
> +    \param ReleaseLock A callback invoked to release the spinlock
> +    \param Argument An optional context argument passed to the callbacks
> +    \param Cache A pointer to a grant table cache handle to be initialized
> +*/
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_CREATE_CACHE)(
> +    IN  PINTERFACE                  Interface,
> +    IN  const CHAR                  *Name,
> +    IN  ULONG                       Reservation,
> +    IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
> +    IN  XENBUS_CACHE_RELEASE_LOCK   ReleaseLock,
> +    IN  PVOID                       Argument OPTIONAL,
> +    OUT PXENBUS_GNTTAB_CACHE        *Cache
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS
> +    \brief Get a table entry from the \a Cache permitting access to a given \a
> Pfn
> +
> +    \param Interface The interface header
> +    \param Cache The grant table cache handle
> +    \param Locked If mutually exclusive access to the cache is already
> +    guaranteed then set this to TRUE
> +    \param Domain The domid of the domain being granted access
> +    \param Pfn The frame number of the page that we are granting access to
> +    \param ReadOnly Set to TRUE if the foreign domain is only being granted
> +    read access
> +    \param Entry A pointer to a grant table entry handle to be initialized
> +*/
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS)(
> +    IN  PINTERFACE                  Interface,
> +    IN  PXENBUS_GNTTAB_CACHE        Cache,
> +    IN  BOOLEAN                     Locked,
> +    IN  USHORT                      Domain,
> +    IN  PFN_NUMBER                  Pfn,
> +    IN  BOOLEAN                     ReadOnly,
> +    OUT PXENBUS_GNTTAB_ENTRY        *Entry
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS
> +    \brief Revoke foreign access and return the \a Entry to the \a Cache
> +
> +    \param Interface The interface header
> +    \param Cache The grant table cache handle
> +    \param Locked If mutually exclusive access to the cache is already
> +    guaranteed then set this to TRUE
> +    \param Entry The grant table entry handle
> +*/
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS)(
> +    IN  PINTERFACE                  Interface,
> +    IN  PXENBUS_GNTTAB_CACHE        Cache,
> +    IN  BOOLEAN                     Locked,
> +    IN  PXENBUS_GNTTAB_ENTRY        Entry
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_GET_REFERENCE
> +    \brief Get the reference number of the entry
> +
> +    \param Interface The interface header
> +    \param Entry The grant table entry handle
> +    \return The reference number
> +*/
> +typedef ULONG
> +(*XENBUS_GNTTAB_GET_REFERENCE)(
> +    IN  PINTERFACE                  Interface,
> +    IN  PXENBUS_GNTTAB_ENTRY        Entry
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_DESTROY_CACHE
> +    \brief Destroy a cache of grant table entries
> +
> +    \param Interface The interface header
> +    \param Cache The grant table cache handle
> +
> +    All grant table entries must have been revoked prior to destruction
> +    of the cache
> +*/
> +typedef VOID
> +(*XENBUS_GNTTAB_DESTROY_CACHE)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_GNTTAB_CACHE    Cache
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_MAP_FOREIGN_PAGES
> +    \brief Map foreign memory pages into the system address space
> +
> +    \param Interface The interface header
> +    \param Domain The domid of the foreign domain that granted the pages
> +    \param NumberPages Number of pages to map
> +    \param References Array of grant reference numbers shared by the
> foreign domain
> +    \param ReadOnly If TRUE, pages are mapped with read-only access
> +    \param Address The physical address that the foreign pages are mapped
> under
> +*/
> +
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_MAP_FOREIGN_PAGES)(
> +    IN  PINTERFACE              Interface,
> +    IN  USHORT                  Domain,
> +    IN  ULONG                   NumberPages,
> +    IN  PULONG                  References,
> +    IN  BOOLEAN                 ReadOnly,
> +    OUT PHYSICAL_ADDRESS        *Address
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES
> +    \brief Unmap foreign memory pages from the system address space
> +
> +    \param Interface The interface header
> +    \param Address The physical address that the foreign pages are mapped
> under
> +*/
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES)(
> +    IN  PINTERFACE              Interface,
> +    IN  PHYSICAL_ADDRESS        Address
> +    );
> +
> +// {763679C5-E5C2-4A6D-8B88-6BB02EC42D8E}
> +DEFINE_GUID(GUID_XENBUS_GNTTAB_INTERFACE,
> +0x763679c5, 0xe5c2, 0x4a6d, 0x8b, 0x88, 0x6b, 0xb0, 0x2e, 0xc4, 0x2d, 0x8e);
> +
> +/*! \struct _XENBUS_GNTTAB_INTERFACE_V1
> +    \brief GNTTAB interface version 1
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_GNTTAB_INTERFACE_V1 {
> +    INTERFACE                           Interface;
> +    XENBUS_GNTTAB_ACQUIRE               GnttabAcquire;
> +    XENBUS_GNTTAB_RELEASE               GnttabRelease;
> +    XENBUS_GNTTAB_CREATE_CACHE          GnttabCreateCache;
> +    XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS
> GnttabPermitForeignAccess;
> +    XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS
> GnttabRevokeForeignAccess;
> +    XENBUS_GNTTAB_GET_REFERENCE         GnttabGetReference;
> +    XENBUS_GNTTAB_DESTROY_CACHE         GnttabDestroyCache;
> +};
> +
> +/*! \struct _XENBUS_GNTTAB_INTERFACE_V2
> +    \brief GNTTAB interface version 2
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_GNTTAB_INTERFACE_V2 {
> +    INTERFACE                           Interface;
> +    XENBUS_GNTTAB_ACQUIRE               GnttabAcquire;
> +    XENBUS_GNTTAB_RELEASE               GnttabRelease;
> +    XENBUS_GNTTAB_CREATE_CACHE          GnttabCreateCache;
> +    XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS
> GnttabPermitForeignAccess;
> +    XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS
> GnttabRevokeForeignAccess;
> +    XENBUS_GNTTAB_GET_REFERENCE         GnttabGetReference;
> +    XENBUS_GNTTAB_DESTROY_CACHE         GnttabDestroyCache;
> +    XENBUS_GNTTAB_MAP_FOREIGN_PAGES     GnttabMapForeignPages;
> +    XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES
> GnttabUnmapForeignPages;
> +};
> +
> +typedef struct _XENBUS_GNTTAB_INTERFACE_V2
> XENBUS_GNTTAB_INTERFACE, *PXENBUS_GNTTAB_INTERFACE;
> +
> +/*! \def XENBUS_GNTTAB
> +    \brief Macro at assist in method invocation
> +*/
> +#define XENBUS_GNTTAB(_Method, _Interface, ...)    \
> +    (_Interface)->Gnttab ## _Method((PINTERFACE)(_Interface),
> __VA_ARGS__)
> +
> +#endif  // _WINDLL
> +
> +#define XENBUS_GNTTAB_INTERFACE_VERSION_MIN 1
> +#define XENBUS_GNTTAB_INTERFACE_VERSION_MAX 2
> +
> +#endif  // _XENBUS_GNTTAB_INTERFACE_H
> +
> diff --git a/include/store_interface.h b/include/store_interface.h
> index 5bcbba3..52f1a1d 100644
> --- a/include/store_interface.h
> +++ b/include/store_interface.h
> @@ -50,6 +50,23 @@ typedef struct _XENBUS_STORE_TRANSACTION
> XENBUS_STORE_TRANSACTION, *PXENBUS_S
>  */
>  typedef struct _XENBUS_STORE_WATCH          XENBUS_STORE_WATCH,
> *PXENBUS_STORE_WATCH;
> 
> +/*! \typedef XENBUS_STORE_PERMISSION_MASK
> +    \brief Bitmask of XenStore key permissions
> +*/
> +typedef enum _XENBUS_STORE_PERMISSION_MASK {
> +    XENBUS_STORE_PERM_NONE = 0,
> +    XENBUS_STORE_PERM_READ = 1,
> +    XENBUS_STORE_PERM_WRITE = 2,
> +} XENBUS_STORE_PERMISSION_MASK;
> +
> +/*! \typedef XENBUS_STORE_PERMISSION
> +    \brief XenStore key permissions entry for a single domain
> +*/
> +typedef struct _XENBUS_STORE_PERMISSION {
> +    USHORT                          Domain;
> +    XENBUS_STORE_PERMISSION_MASK    Mask;
> +} XENBUS_STORE_PERMISSION, *PXENBUS_STORE_PERMISSION;
> +
>  /*! \typedef XENBUS_STORE_ACQUIRE
>      \brief Acquire a reference to the STORE interface
> 
> @@ -247,10 +264,36 @@ typedef VOID
>      IN  PINTERFACE  Interface
>      );
> 
> +/*! \typedef XENBUS_STORE_PERMISSIONS_SET
> +    \brief Set permissions for a XenStore key
> +
> +    \param Interface The interface header
> +    \param Transaction The transaction handle (NULL if this is not
> +    part of a transaction)
> +    \param Prefix An optional prefix for the \a Node
> +    \param Node The concatenation of the \a Prefix and this value specifies
> +    the XenStore key to set permissions of
> +    \param Permissions An array of permissions to set
> +    \param NumberPermissions Number of elements in the \a Permissions
> array
> +*/
> +typedef NTSTATUS
> +(*XENBUS_STORE_PERMISSIONS_SET)(
> +    IN  PINTERFACE                  Interface,
> +    IN  PXENBUS_STORE_TRANSACTION   Transaction OPTIONAL,
> +    IN  PCHAR                       Prefix OPTIONAL,
> +    IN  PCHAR                       Node,
> +    IN  PXENBUS_STORE_PERMISSION    Permissions,
> +    IN  ULONG                       NumberPermissions
> +    );
> +
>  // {86824C3B-D34E-4753-B281-2F1E3AD214D7}
>  DEFINE_GUID(GUID_XENBUS_STORE_INTERFACE,
>  0x86824c3b, 0xd34e, 0x4753, 0xb2, 0x81, 0x2f, 0x1e, 0x3a, 0xd2, 0x14, 0xd7);
> 
> +/*! \struct _XENBUS_STORE_INTERFACE_V1
> +    \brief STORE interface version 1
> +    \ingroup interfaces
> +*/
>  struct _XENBUS_STORE_INTERFACE_V1 {
>      INTERFACE                       Interface;
>      XENBUS_STORE_ACQUIRE            StoreAcquire;
> @@ -267,11 +310,28 @@ struct _XENBUS_STORE_INTERFACE_V1 {
>      XENBUS_STORE_POLL               StorePoll;
>  };
> 
> -/*! \struct _XENBUS_STORE_INTERFACE_V1
> -    \brief STORE interface version 1
> +/*! \struct _XENBUS_STORE_INTERFACE_V2
> +    \brief STORE interface version 2
>      \ingroup interfaces
>  */
> -typedef struct _XENBUS_STORE_INTERFACE_V1
> XENBUS_STORE_INTERFACE, *PXENBUS_STORE_INTERFACE;
> +struct _XENBUS_STORE_INTERFACE_V2 {
> +    INTERFACE                       Interface;
> +    XENBUS_STORE_ACQUIRE            StoreAcquire;
> +    XENBUS_STORE_RELEASE            StoreRelease;
> +    XENBUS_STORE_FREE               StoreFree;
> +    XENBUS_STORE_READ               StoreRead;
> +    XENBUS_STORE_PRINTF             StorePrintf;
> +    XENBUS_STORE_PERMISSIONS_SET    StorePermissionsSet;
> +    XENBUS_STORE_REMOVE             StoreRemove;
> +    XENBUS_STORE_DIRECTORY          StoreDirectory;
> +    XENBUS_STORE_TRANSACTION_START  StoreTransactionStart;
> +    XENBUS_STORE_TRANSACTION_END    StoreTransactionEnd;
> +    XENBUS_STORE_WATCH_ADD          StoreWatchAdd;
> +    XENBUS_STORE_WATCH_REMOVE       StoreWatchRemove;
> +    XENBUS_STORE_POLL               StorePoll;
> +};
> +
> +typedef struct _XENBUS_STORE_INTERFACE_V2
> XENBUS_STORE_INTERFACE, *PXENBUS_STORE_INTERFACE;
> 
>  /*! \def XENBUS_STORE
>      \brief Macro at assist in method invocation
> @@ -282,7 +342,7 @@ typedef struct _XENBUS_STORE_INTERFACE_V1
> XENBUS_STORE_INTERFACE, *PXENBUS_STORE
>  #endif  // _WINDLL
> 
>  #define XENBUS_STORE_INTERFACE_VERSION_MIN  1
> -#define XENBUS_STORE_INTERFACE_VERSION_MAX  1
> +#define XENBUS_STORE_INTERFACE_VERSION_MAX  2
> 
>  #endif  // _XENBUS_STORE_INTERFACE_H
> 
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Oct 14 08:31:37 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 14 Oct 2015 08:31: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 1ZmHTC-0003SL-Gq; Wed, 14 Oct 2015 08:31:34 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72274ee0c=Paul.Durrant@citrix.com>)
	id 1ZmHTB-0003SG-78
	for win-pv-devel@lists.xenproject.org; Wed, 14 Oct 2015 08:31:33 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	3F/C1-10678-3E21E165; Wed, 14 Oct 2015 08:31:31 +0000
X-Env-Sender: prvs=72274ee0c=Paul.Durrant@citrix.com
X-Msg-Ref: server-15.tower-31.messagelabs.com!1444811490!52913822!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 12770 invoked from network); 14 Oct 2015 08:31:30 -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;
	14 Oct 2015 08:31:30 -0000
X-IronPort-AV: E=Sophos;i="5.17,681,1437436800"; 
   d="scan'208";a="5183231"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 2/5] Include ntifs.h instead of ntddk.h
Thread-Index: AQHRALt7NM06cabhAkusWFehU/rHJp5qs+6w
Date: Wed, 14 Oct 2015 08:31:29 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F610A95@AMSPEX01CL01.citrite.net>
References: <5614A41B.5090408@invisiblethingslab.com>
In-Reply-To: <5614A41B.5090408@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] [PATCH 2/5] Include ntifs.h instead of ntddk.h
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 Rafal Wojdyla
> Sent: 07 October 2015 05:48
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 2/5] Include ntifs.h instead of ntddk.h
> 
> Gnttab code uses KeStackAttachProcess which is only declared in ntifs.h
> (conflicts with ntddk.h).
> 
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xeniface/driver.c | 3 +--
>  src/xeniface/driver.h | 2 +-
>  src/xeniface/fdo.c    | 2 +-
>  src/xeniface/fdo.h    | 2 +-
>  src/xeniface/wmi.c    | 3 +--
>  src/xeniface/wmi.h    | 2 +-
>  6 files changed, 6 insertions(+), 8 deletions(-)
> 
> diff --git a/src/xeniface/driver.c b/src/xeniface/driver.c
> index 281ebdf..1c84467 100644
> --- a/src/xeniface/driver.c
> +++ b/src/xeniface/driver.c
> @@ -29,8 +29,7 @@
>   * SUCH DAMAGE.
>   */
> 
> -#include <ntddk.h>
> -//#include <util.h>
> +#include <ntifs.h>
>  #include <version.h>
> 
>  #include "fdo.h"
> diff --git a/src/xeniface/driver.h b/src/xeniface/driver.h
> index 93ac645..00f2d8f 100644
> --- a/src/xeniface/driver.h
> +++ b/src/xeniface/driver.h
> @@ -44,7 +44,7 @@
>  #pragma warning(disable:4100 4057)
> 
>  #include <wmilib.h>
> -#include <ntddk.h>
> +#include <ntifs.h>
>  extern PDRIVER_OBJECT   DriverObject;
> 
> 
> diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
> index 321bfb3..51bda24 100644
> --- a/src/xeniface/fdo.c
> +++ b/src/xeniface/fdo.c
> @@ -30,7 +30,7 @@
>   */
> 
> 
> -#include <ntddk.h>
> +#include <ntifs.h>
>  #include <wdmguid.h>
>  #include <ntstrsafe.h>
>  #include <stdlib.h>
> diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
> index 32f6bb1..4416064 100644
> --- a/src/xeniface/fdo.h
> +++ b/src/xeniface/fdo.h
> @@ -32,7 +32,7 @@
>  #ifndef _XENIFACE_FDO_H
>  #define _XENIFACE_FDO_H
> 
> -#include <ntddk.h>
> +#include <ntifs.h>
>  #include <store_interface.h>
>  #include <suspend_interface.h>
>  #include <shared_info_interface.h>
> diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
> index 4285ada..1bdb834 100644
> --- a/src/xeniface/wmi.c
> +++ b/src/xeniface/wmi.c
> @@ -30,12 +30,11 @@
>   */
> 
> 
> -#include <ntddk.h>
> +#include <ntifs.h>
>  #include <initguid.h>
>  #include <wmistr.h>
>  #include <wmilib.h>
>  #include <stdio.h>
> -#include <ntddk.h>
>  #include <guiddef.h>
>  #define NTSTRSAFE_LIB
>  #include<ntstrsafe.h>
> diff --git a/src/xeniface/wmi.h b/src/xeniface/wmi.h
> index 7fb67ca..ed77af7 100644
> --- a/src/xeniface/wmi.h
> +++ b/src/xeniface/wmi.h
> @@ -33,7 +33,7 @@
>  #ifndef _XEVTCHN_WMI_H
>  #define _XEVTCHN_WMI_H
> 
> -#include <ntddk.h>
> +#include <ntifs.h>
>  #include "driver.h"
>  #include "wmi_generated.h"
> 
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Oct 14 08:31:37 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 14 Oct 2015 08:31: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 1ZmHTC-0003SL-Gq; Wed, 14 Oct 2015 08:31:34 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72274ee0c=Paul.Durrant@citrix.com>)
	id 1ZmHTB-0003SG-78
	for win-pv-devel@lists.xenproject.org; Wed, 14 Oct 2015 08:31:33 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	3F/C1-10678-3E21E165; Wed, 14 Oct 2015 08:31:31 +0000
X-Env-Sender: prvs=72274ee0c=Paul.Durrant@citrix.com
X-Msg-Ref: server-15.tower-31.messagelabs.com!1444811490!52913822!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 12770 invoked from network); 14 Oct 2015 08:31:30 -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;
	14 Oct 2015 08:31:30 -0000
X-IronPort-AV: E=Sophos;i="5.17,681,1437436800"; 
   d="scan'208";a="5183231"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 2/5] Include ntifs.h instead of ntddk.h
Thread-Index: AQHRALt7NM06cabhAkusWFehU/rHJp5qs+6w
Date: Wed, 14 Oct 2015 08:31:29 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F610A95@AMSPEX01CL01.citrite.net>
References: <5614A41B.5090408@invisiblethingslab.com>
In-Reply-To: <5614A41B.5090408@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] [PATCH 2/5] Include ntifs.h instead of ntddk.h
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 Rafal Wojdyla
> Sent: 07 October 2015 05:48
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 2/5] Include ntifs.h instead of ntddk.h
> 
> Gnttab code uses KeStackAttachProcess which is only declared in ntifs.h
> (conflicts with ntddk.h).
> 
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xeniface/driver.c | 3 +--
>  src/xeniface/driver.h | 2 +-
>  src/xeniface/fdo.c    | 2 +-
>  src/xeniface/fdo.h    | 2 +-
>  src/xeniface/wmi.c    | 3 +--
>  src/xeniface/wmi.h    | 2 +-
>  6 files changed, 6 insertions(+), 8 deletions(-)
> 
> diff --git a/src/xeniface/driver.c b/src/xeniface/driver.c
> index 281ebdf..1c84467 100644
> --- a/src/xeniface/driver.c
> +++ b/src/xeniface/driver.c
> @@ -29,8 +29,7 @@
>   * SUCH DAMAGE.
>   */
> 
> -#include <ntddk.h>
> -//#include <util.h>
> +#include <ntifs.h>
>  #include <version.h>
> 
>  #include "fdo.h"
> diff --git a/src/xeniface/driver.h b/src/xeniface/driver.h
> index 93ac645..00f2d8f 100644
> --- a/src/xeniface/driver.h
> +++ b/src/xeniface/driver.h
> @@ -44,7 +44,7 @@
>  #pragma warning(disable:4100 4057)
> 
>  #include <wmilib.h>
> -#include <ntddk.h>
> +#include <ntifs.h>
>  extern PDRIVER_OBJECT   DriverObject;
> 
> 
> diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
> index 321bfb3..51bda24 100644
> --- a/src/xeniface/fdo.c
> +++ b/src/xeniface/fdo.c
> @@ -30,7 +30,7 @@
>   */
> 
> 
> -#include <ntddk.h>
> +#include <ntifs.h>
>  #include <wdmguid.h>
>  #include <ntstrsafe.h>
>  #include <stdlib.h>
> diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
> index 32f6bb1..4416064 100644
> --- a/src/xeniface/fdo.h
> +++ b/src/xeniface/fdo.h
> @@ -32,7 +32,7 @@
>  #ifndef _XENIFACE_FDO_H
>  #define _XENIFACE_FDO_H
> 
> -#include <ntddk.h>
> +#include <ntifs.h>
>  #include <store_interface.h>
>  #include <suspend_interface.h>
>  #include <shared_info_interface.h>
> diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
> index 4285ada..1bdb834 100644
> --- a/src/xeniface/wmi.c
> +++ b/src/xeniface/wmi.c
> @@ -30,12 +30,11 @@
>   */
> 
> 
> -#include <ntddk.h>
> +#include <ntifs.h>
>  #include <initguid.h>
>  #include <wmistr.h>
>  #include <wmilib.h>
>  #include <stdio.h>
> -#include <ntddk.h>
>  #include <guiddef.h>
>  #define NTSTRSAFE_LIB
>  #include<ntstrsafe.h>
> diff --git a/src/xeniface/wmi.h b/src/xeniface/wmi.h
> index 7fb67ca..ed77af7 100644
> --- a/src/xeniface/wmi.h
> +++ b/src/xeniface/wmi.h
> @@ -33,7 +33,7 @@
>  #ifndef _XEVTCHN_WMI_H
>  #define _XEVTCHN_WMI_H
> 
> -#include <ntddk.h>
> +#include <ntifs.h>
>  #include "driver.h"
>  #include "wmi_generated.h"
> 
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Oct 14 08:47:16 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 14 Oct 2015 08:47:16 +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 1ZmHiO-0004ZL-67; Wed, 14 Oct 2015 08:47:16 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72274ee0c=Paul.Durrant@citrix.com>)
	id 1ZmHiM-0004Z9-En
	for win-pv-devel@lists.xenproject.org; Wed, 14 Oct 2015 08:47:14 +0000
Received: from [85.158.137.68] by server-12.bemta-3.messagelabs.com id
	28/66-05269-1961E165; Wed, 14 Oct 2015 08:47:13 +0000
X-Env-Sender: prvs=72274ee0c=Paul.Durrant@citrix.com
X-Msg-Ref: server-7.tower-31.messagelabs.com!1444812432!18433292!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.2 required=7.0 tests=UPPERCASE_50_75,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29805 invoked from network); 14 Oct 2015 08:47:12 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-7.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2015 08:47:12 -0000
X-IronPort-AV: E=Sophos;i="5.17,681,1437436800"; 
   d="scan'208";a="5184354"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 3/5] Define new IOCTLs for user-mode
	clients
Thread-Index: AQHRALt5ge+iF7M0hkK0Cbb2e7WCHJ5qtBtw
Date: Wed, 14 Oct 2015 08:47:11 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F610AED@AMSPEX01CL01.citrite.net>
References: <5614A427.4090002@invisiblethingslab.com>
In-Reply-To: <5614A427.4090002@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] [PATCH 3/5] Define new IOCTLs for user-mode
 clients
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 Rafal Wojdyla
> Sent: 07 October 2015 05:49
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 3/5] Define new IOCTLs for user-mode
> clients
> 
> IOCTL input is defined as XENIFACE_*_IN structs.
> IOCTL output is defined as XENIFACE_*_OUT structs.
> 
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
> ---
>  include/xeniface_ioctls.h | 190
> ++++++++++++++++++++++++++++++++++++++++++++++
>  src/xeniface/driver.h     |   2 +-
>  src/xeniface/ioctls.h     |   2 +
>  3 files changed, 193 insertions(+), 1 deletion(-)
> 
> diff --git a/include/xeniface_ioctls.h b/include/xeniface_ioctls.h
> index 1367f67..c6d9893 100644
> --- a/include/xeniface_ioctls.h
> +++ b/include/xeniface_ioctls.h
> @@ -35,14 +35,204 @@
>  DEFINE_GUID(GUID_INTERFACE_XENIFACE, \
>      0xb2cfb085, 0xaa5e, 0x47e1, 0x8b, 0xf7, 0x97, 0x93, 0xf3, 0x15, 0x45, 0x65);
> 
> +/*********************************************************
> ***************/
> +/* store ioctls                                                         */
> +/*********************************************************
> ***************/

Not generally the comment style used. Could you use the interface headers as a style-guide?

> +// Define only for user mode clients.
> +#ifndef XENIFACE_KERNEL_MODE
> +

Could you not use _WINDLL to determine kernel-mode vs. user-mode inclusion, the same as the interface headers do?

> +typedef enum _XENBUS_STORE_PERMISSION_MASK {
> +    XENBUS_STORE_PERM_NONE = 0,
> +    XENBUS_STORE_PERM_READ = 1,
> +    XENBUS_STORE_PERM_WRITE = 2,
> +} XENBUS_STORE_PERMISSION_MASK;
> +
> +typedef struct _XENBUS_STORE_PERMISSION {
> +    USHORT Domain;
> +    XENBUS_STORE_PERMISSION_MASK Mask;
> +} XENBUS_STORE_PERMISSION, *PXENBUS_STORE_PERMISSION;
> +
> +#endif

Shouldn't these be prefixed XENIFACE_ rather than XENBUS_?

> +
> +#define XENIFACE_STORE_ALLOWED_PERMISSIONS
> (XENBUS_STORE_PERM_NONE | XENBUS_STORE_PERM_READ |
> XENBUS_STORE_PERM_WRITE)
> +
> +// TODO: document input/output format of these IOCTLs?

Yes, please. Could you add some doxygen tags?

>  #define IOCTL_XENIFACE_STORE_READ \
>      CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
>  #define IOCTL_XENIFACE_STORE_WRITE \
>      CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
>  #define IOCTL_XENIFACE_STORE_DIRECTORY \
>      CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
>  #define IOCTL_XENIFACE_STORE_REMOVE \
>      CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> 
> +#define IOCTL_XENIFACE_STORE_SET_PERMISSIONS \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +#pragma warning(push)
> +#pragma warning(disable:4200) // nonstandard extension used : zero-sized
> array in struct/union

Could you not just specify an array length of one to avoid the need for this #pragma. That's generally how Windows APIs of this nature specify their structures.

> +typedef struct _XENIFACE_STORE_SET_PERMISSIONS_IN {
> +    PCHAR Path;
> +    ULONG PathLength; // number of bytes, including the null terminator
> +    ULONG NumberPermissions;
> +    XENBUS_STORE_PERMISSION Permissions[0];
> +} XENIFACE_STORE_SET_PERMISSIONS_IN,
> *PXENIFACE_STORE_SET_PERMISSIONS_IN;
> +#pragma warning(pop)
> +
> +#define IOCTL_XENIFACE_STORE_ADD_WATCH \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x805, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_STORE_ADD_WATCH_IN {
> +    PCHAR Path;
> +    ULONG PathLength; // number of bytes, including the null terminator
> +    HANDLE Event;
> +} XENIFACE_STORE_ADD_WATCH_IN,
> *PXENIFACE_STORE_ADD_WATCH_IN;
> +
> +typedef struct _XENIFACE_STORE_ADD_WATCH_OUT {
> +    PVOID Context;
> +} XENIFACE_STORE_ADD_WATCH_OUT,
> *PXENIFACE_STORE_ADD_WATCH_OUT;
> +
> +#define IOCTL_XENIFACE_STORE_REMOVE_WATCH \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x806, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_STORE_REMOVE_WATCH_IN {
> +    PVOID Context;
> +} XENIFACE_STORE_REMOVE_WATCH_IN,
> *PXENIFACE_STORE_REMOVE_WATCH_IN;
> +
> +/*********************************************************
> ***************/
> +/* evtchn ioctls                                                        */
> +/*********************************************************
> ***************/
> +#define IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x810, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN {
> +    USHORT RemoteDomain;
> +    ULONG RemotePort;
> +    BOOLEAN Mask;
> +    HANDLE Event;
> +} XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN,
> *PXENIFACE_EVTCHN_BIND_INTERDOMAIN_IN;
> +
> +typedef struct _XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT {
> +    ULONG LocalPort;
> +} XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT,
> *PXENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT;
> +
> +#define IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x811, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_EVTCHN_BIND_UNBOUND_IN {
> +    USHORT RemoteDomain;
> +    BOOLEAN Mask;
> +    HANDLE Event;
> +} XENIFACE_EVTCHN_BIND_UNBOUND_IN,
> *PXENIFACE_EVTCHN_BIND_UNBOUND_IN;
> +
> +typedef struct _XENIFACE_EVTCHN_BIND_UNBOUND_OUT {
> +    ULONG LocalPort;
> +} XENIFACE_EVTCHN_BIND_UNBOUND_OUT,
> *PXENIFACE_EVTCHN_BIND_UNBOUND_OUT;
> +
> +#define IOCTL_XENIFACE_EVTCHN_CLOSE \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x812, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_EVTCHN_CLOSE_IN {
> +    ULONG LocalPort;
> +} XENIFACE_EVTCHN_CLOSE_IN, *PXENIFACE_EVTCHN_CLOSE_IN;
> +
> +#define IOCTL_XENIFACE_EVTCHN_NOTIFY \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x813, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_EVTCHN_NOTIFY_IN {
> +    ULONG LocalPort;
> +} XENIFACE_EVTCHN_NOTIFY_IN, *PXENIFACE_EVTCHN_NOTIFY_IN;
> +
> +#define IOCTL_XENIFACE_EVTCHN_UNMASK \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x814, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_EVTCHN_UNMASK_IN {
> +    ULONG LocalPort;
> +} XENIFACE_EVTCHN_UNMASK_IN, *PXENIFACE_EVTCHN_UNMASK_IN;
> +
> +/*********************************************************
> ***************/
> +/* gntmem ioctls                                                        */
> +/*********************************************************
> ***************/
> +// This IOCTL is pended forever, use
> IOCTL_XENIFACE_GNTTAB_GET_GRANT_RESULT
> +// to get the result. This IOCTL must be asynchronous.
> +#define IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x820, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef enum _XENIFACE_GNTTAB_PAGE_FLAGS {
> +    XENIFACE_GNTTAB_READONLY          = 1 << 0,
> +    XENIFACE_GNTTAB_USE_NOTIFY_OFFSET = 1 << 1,
> +    XENIFACE_GNTTAB_USE_NOTIFY_PORT   = 1 << 2,
> +} XENIFACE_GNTTAB_PAGE_FLAGS;
> +
> +typedef struct _XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN {
> +    ULONG RequestId; // should be unique for each request

Is that unique globally, per-process or per-thread? Per-thread would be most convenient for the user, I guess.

> +    USHORT RemoteDomain;
> +    ULONG NumberPages;
> +    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
> +    ULONG NotifyOffset;
> +    ULONG NotifyPort;
> +} XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN,
> *PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN;
> +
> +#define IOCTL_XENIFACE_GNTTAB_GET_GRANT_RESULT \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x821, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_GNTTAB_GET_GRANT_RESULT_IN {
> +    ULONG RequestId;
> +} XENIFACE_GNTTAB_GET_GRANT_RESULT_IN,
> *PXENIFACE_GNTTAB_GET_GRANT_RESULT_IN;
> +
> +#pragma warning(push)
> +#pragma warning(disable:4200) // nonstandard extension used : zero-sized
> array in struct/union
> +typedef struct _XENIFACE_GNTTAB_GET_GRANT_RESULT_OUT {
> +    PVOID Address;
> +    ULONG References[0];

Again, use array length 1 to avoid the #pragma

> +} XENIFACE_GNTTAB_GET_GRANT_RESULT_OUT,
> *PXENIFACE_GNTTAB_GET_GRANT_RESULT_OUT;
> +#pragma warning(pop)
> +
> +#define IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x822, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN {
> +    ULONG RequestId;
> +} XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN,
> *PXENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN;
> +
> +// This IOCTL is pended forever, use
> IOCTL_XENIFACE_GNTTAB_GET_MAP_RESULT
> +// to get the result. This IOCTL must be asynchronous.
> +#define IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x823, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +#pragma warning(push)
> +#pragma warning(disable:4200) // nonstandard extension used : zero-sized
> array in struct/union
> +typedef struct _XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN {
> +    ULONG RequestId; // should be unique for each request
> +    USHORT RemoteDomain;
> +    ULONG NumberPages;
> +    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
> +    ULONG NotifyOffset;
> +    ULONG NotifyPort;
> +    ULONG References[0];

And again.

  Paul

> +} XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN,
> *PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN;
> +#pragma warning(pop)
> +
> +#define IOCTL_XENIFACE_GNTTAB_GET_MAP_RESULT \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x824, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_GNTTAB_GET_MAP_RESULT_IN {
> +    ULONG RequestId;
> +} XENIFACE_GNTTAB_GET_MAP_RESULT_IN,
> *PXENIFACE_GNTTAB_GET_MAP_RESULT_IN;
> +
> +typedef struct _XENIFACE_GNTTAB_GET_MAP_RESULT_OUT {
> +    PVOID Address;
> +} XENIFACE_GNTTAB_GET_MAP_RESULT_OUT,
> *PXENIFACE_GNTTAB_GET_MAP_RESULT_OUT;
> +
> +#define IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x825, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN {
> +    ULONG RequestId;
> +} XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN,
> *PXENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN;
> +
>  #endif // _XENIFACE_IOCTLS_H_
> 
> diff --git a/src/xeniface/driver.h b/src/xeniface/driver.h
> index 00f2d8f..313f297 100644
> --- a/src/xeniface/driver.h
> +++ b/src/xeniface/driver.h
> @@ -32,7 +32,7 @@
>  #ifndef _XENIFACE_DRIVER_H
>  #define _XENIFACE_DRIVER_H
> 
> -
> +#define XENIFACE_KERNEL_MODE
> 
>  #include "fdo.h"
>  #include "types.h"
> diff --git a/src/xeniface/ioctls.h b/src/xeniface/ioctls.h
> index 63de9eb..7ee7801 100644
> --- a/src/xeniface/ioctls.h
> +++ b/src/xeniface/ioctls.h
> @@ -32,6 +32,8 @@
>  #ifndef _IOCTLS_H_
>  #define _IOCTLS_H_
> 
> +#define XENIFACE_KERNEL_MODE
> +
>  NTSTATUS
>  XenIFaceIoctl(
>      __in  PXENIFACE_FDO         Fdo,
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Oct 14 08:47:16 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 14 Oct 2015 08:47:16 +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 1ZmHiO-0004ZL-67; Wed, 14 Oct 2015 08:47:16 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72274ee0c=Paul.Durrant@citrix.com>)
	id 1ZmHiM-0004Z9-En
	for win-pv-devel@lists.xenproject.org; Wed, 14 Oct 2015 08:47:14 +0000
Received: from [85.158.137.68] by server-12.bemta-3.messagelabs.com id
	28/66-05269-1961E165; Wed, 14 Oct 2015 08:47:13 +0000
X-Env-Sender: prvs=72274ee0c=Paul.Durrant@citrix.com
X-Msg-Ref: server-7.tower-31.messagelabs.com!1444812432!18433292!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.2 required=7.0 tests=UPPERCASE_50_75,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29805 invoked from network); 14 Oct 2015 08:47:12 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-7.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2015 08:47:12 -0000
X-IronPort-AV: E=Sophos;i="5.17,681,1437436800"; 
   d="scan'208";a="5184354"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 3/5] Define new IOCTLs for user-mode
	clients
Thread-Index: AQHRALt5ge+iF7M0hkK0Cbb2e7WCHJ5qtBtw
Date: Wed, 14 Oct 2015 08:47:11 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F610AED@AMSPEX01CL01.citrite.net>
References: <5614A427.4090002@invisiblethingslab.com>
In-Reply-To: <5614A427.4090002@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] [PATCH 3/5] Define new IOCTLs for user-mode
 clients
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 Rafal Wojdyla
> Sent: 07 October 2015 05:49
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 3/5] Define new IOCTLs for user-mode
> clients
> 
> IOCTL input is defined as XENIFACE_*_IN structs.
> IOCTL output is defined as XENIFACE_*_OUT structs.
> 
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
> ---
>  include/xeniface_ioctls.h | 190
> ++++++++++++++++++++++++++++++++++++++++++++++
>  src/xeniface/driver.h     |   2 +-
>  src/xeniface/ioctls.h     |   2 +
>  3 files changed, 193 insertions(+), 1 deletion(-)
> 
> diff --git a/include/xeniface_ioctls.h b/include/xeniface_ioctls.h
> index 1367f67..c6d9893 100644
> --- a/include/xeniface_ioctls.h
> +++ b/include/xeniface_ioctls.h
> @@ -35,14 +35,204 @@
>  DEFINE_GUID(GUID_INTERFACE_XENIFACE, \
>      0xb2cfb085, 0xaa5e, 0x47e1, 0x8b, 0xf7, 0x97, 0x93, 0xf3, 0x15, 0x45, 0x65);
> 
> +/*********************************************************
> ***************/
> +/* store ioctls                                                         */
> +/*********************************************************
> ***************/

Not generally the comment style used. Could you use the interface headers as a style-guide?

> +// Define only for user mode clients.
> +#ifndef XENIFACE_KERNEL_MODE
> +

Could you not use _WINDLL to determine kernel-mode vs. user-mode inclusion, the same as the interface headers do?

> +typedef enum _XENBUS_STORE_PERMISSION_MASK {
> +    XENBUS_STORE_PERM_NONE = 0,
> +    XENBUS_STORE_PERM_READ = 1,
> +    XENBUS_STORE_PERM_WRITE = 2,
> +} XENBUS_STORE_PERMISSION_MASK;
> +
> +typedef struct _XENBUS_STORE_PERMISSION {
> +    USHORT Domain;
> +    XENBUS_STORE_PERMISSION_MASK Mask;
> +} XENBUS_STORE_PERMISSION, *PXENBUS_STORE_PERMISSION;
> +
> +#endif

Shouldn't these be prefixed XENIFACE_ rather than XENBUS_?

> +
> +#define XENIFACE_STORE_ALLOWED_PERMISSIONS
> (XENBUS_STORE_PERM_NONE | XENBUS_STORE_PERM_READ |
> XENBUS_STORE_PERM_WRITE)
> +
> +// TODO: document input/output format of these IOCTLs?

Yes, please. Could you add some doxygen tags?

>  #define IOCTL_XENIFACE_STORE_READ \
>      CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
>  #define IOCTL_XENIFACE_STORE_WRITE \
>      CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
>  #define IOCTL_XENIFACE_STORE_DIRECTORY \
>      CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
>  #define IOCTL_XENIFACE_STORE_REMOVE \
>      CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> 
> +#define IOCTL_XENIFACE_STORE_SET_PERMISSIONS \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +#pragma warning(push)
> +#pragma warning(disable:4200) // nonstandard extension used : zero-sized
> array in struct/union

Could you not just specify an array length of one to avoid the need for this #pragma. That's generally how Windows APIs of this nature specify their structures.

> +typedef struct _XENIFACE_STORE_SET_PERMISSIONS_IN {
> +    PCHAR Path;
> +    ULONG PathLength; // number of bytes, including the null terminator
> +    ULONG NumberPermissions;
> +    XENBUS_STORE_PERMISSION Permissions[0];
> +} XENIFACE_STORE_SET_PERMISSIONS_IN,
> *PXENIFACE_STORE_SET_PERMISSIONS_IN;
> +#pragma warning(pop)
> +
> +#define IOCTL_XENIFACE_STORE_ADD_WATCH \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x805, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_STORE_ADD_WATCH_IN {
> +    PCHAR Path;
> +    ULONG PathLength; // number of bytes, including the null terminator
> +    HANDLE Event;
> +} XENIFACE_STORE_ADD_WATCH_IN,
> *PXENIFACE_STORE_ADD_WATCH_IN;
> +
> +typedef struct _XENIFACE_STORE_ADD_WATCH_OUT {
> +    PVOID Context;
> +} XENIFACE_STORE_ADD_WATCH_OUT,
> *PXENIFACE_STORE_ADD_WATCH_OUT;
> +
> +#define IOCTL_XENIFACE_STORE_REMOVE_WATCH \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x806, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_STORE_REMOVE_WATCH_IN {
> +    PVOID Context;
> +} XENIFACE_STORE_REMOVE_WATCH_IN,
> *PXENIFACE_STORE_REMOVE_WATCH_IN;
> +
> +/*********************************************************
> ***************/
> +/* evtchn ioctls                                                        */
> +/*********************************************************
> ***************/
> +#define IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x810, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN {
> +    USHORT RemoteDomain;
> +    ULONG RemotePort;
> +    BOOLEAN Mask;
> +    HANDLE Event;
> +} XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN,
> *PXENIFACE_EVTCHN_BIND_INTERDOMAIN_IN;
> +
> +typedef struct _XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT {
> +    ULONG LocalPort;
> +} XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT,
> *PXENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT;
> +
> +#define IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x811, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_EVTCHN_BIND_UNBOUND_IN {
> +    USHORT RemoteDomain;
> +    BOOLEAN Mask;
> +    HANDLE Event;
> +} XENIFACE_EVTCHN_BIND_UNBOUND_IN,
> *PXENIFACE_EVTCHN_BIND_UNBOUND_IN;
> +
> +typedef struct _XENIFACE_EVTCHN_BIND_UNBOUND_OUT {
> +    ULONG LocalPort;
> +} XENIFACE_EVTCHN_BIND_UNBOUND_OUT,
> *PXENIFACE_EVTCHN_BIND_UNBOUND_OUT;
> +
> +#define IOCTL_XENIFACE_EVTCHN_CLOSE \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x812, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_EVTCHN_CLOSE_IN {
> +    ULONG LocalPort;
> +} XENIFACE_EVTCHN_CLOSE_IN, *PXENIFACE_EVTCHN_CLOSE_IN;
> +
> +#define IOCTL_XENIFACE_EVTCHN_NOTIFY \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x813, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_EVTCHN_NOTIFY_IN {
> +    ULONG LocalPort;
> +} XENIFACE_EVTCHN_NOTIFY_IN, *PXENIFACE_EVTCHN_NOTIFY_IN;
> +
> +#define IOCTL_XENIFACE_EVTCHN_UNMASK \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x814, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_EVTCHN_UNMASK_IN {
> +    ULONG LocalPort;
> +} XENIFACE_EVTCHN_UNMASK_IN, *PXENIFACE_EVTCHN_UNMASK_IN;
> +
> +/*********************************************************
> ***************/
> +/* gntmem ioctls                                                        */
> +/*********************************************************
> ***************/
> +// This IOCTL is pended forever, use
> IOCTL_XENIFACE_GNTTAB_GET_GRANT_RESULT
> +// to get the result. This IOCTL must be asynchronous.
> +#define IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x820, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef enum _XENIFACE_GNTTAB_PAGE_FLAGS {
> +    XENIFACE_GNTTAB_READONLY          = 1 << 0,
> +    XENIFACE_GNTTAB_USE_NOTIFY_OFFSET = 1 << 1,
> +    XENIFACE_GNTTAB_USE_NOTIFY_PORT   = 1 << 2,
> +} XENIFACE_GNTTAB_PAGE_FLAGS;
> +
> +typedef struct _XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN {
> +    ULONG RequestId; // should be unique for each request

Is that unique globally, per-process or per-thread? Per-thread would be most convenient for the user, I guess.

> +    USHORT RemoteDomain;
> +    ULONG NumberPages;
> +    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
> +    ULONG NotifyOffset;
> +    ULONG NotifyPort;
> +} XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN,
> *PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN;
> +
> +#define IOCTL_XENIFACE_GNTTAB_GET_GRANT_RESULT \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x821, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_GNTTAB_GET_GRANT_RESULT_IN {
> +    ULONG RequestId;
> +} XENIFACE_GNTTAB_GET_GRANT_RESULT_IN,
> *PXENIFACE_GNTTAB_GET_GRANT_RESULT_IN;
> +
> +#pragma warning(push)
> +#pragma warning(disable:4200) // nonstandard extension used : zero-sized
> array in struct/union
> +typedef struct _XENIFACE_GNTTAB_GET_GRANT_RESULT_OUT {
> +    PVOID Address;
> +    ULONG References[0];

Again, use array length 1 to avoid the #pragma

> +} XENIFACE_GNTTAB_GET_GRANT_RESULT_OUT,
> *PXENIFACE_GNTTAB_GET_GRANT_RESULT_OUT;
> +#pragma warning(pop)
> +
> +#define IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x822, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN {
> +    ULONG RequestId;
> +} XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN,
> *PXENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN;
> +
> +// This IOCTL is pended forever, use
> IOCTL_XENIFACE_GNTTAB_GET_MAP_RESULT
> +// to get the result. This IOCTL must be asynchronous.
> +#define IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x823, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +#pragma warning(push)
> +#pragma warning(disable:4200) // nonstandard extension used : zero-sized
> array in struct/union
> +typedef struct _XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN {
> +    ULONG RequestId; // should be unique for each request
> +    USHORT RemoteDomain;
> +    ULONG NumberPages;
> +    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
> +    ULONG NotifyOffset;
> +    ULONG NotifyPort;
> +    ULONG References[0];

And again.

  Paul

> +} XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN,
> *PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN;
> +#pragma warning(pop)
> +
> +#define IOCTL_XENIFACE_GNTTAB_GET_MAP_RESULT \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x824, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_GNTTAB_GET_MAP_RESULT_IN {
> +    ULONG RequestId;
> +} XENIFACE_GNTTAB_GET_MAP_RESULT_IN,
> *PXENIFACE_GNTTAB_GET_MAP_RESULT_IN;
> +
> +typedef struct _XENIFACE_GNTTAB_GET_MAP_RESULT_OUT {
> +    PVOID Address;
> +} XENIFACE_GNTTAB_GET_MAP_RESULT_OUT,
> *PXENIFACE_GNTTAB_GET_MAP_RESULT_OUT;
> +
> +#define IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x825, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +typedef struct _XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN {
> +    ULONG RequestId;
> +} XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN,
> *PXENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN;
> +
>  #endif // _XENIFACE_IOCTLS_H_
> 
> diff --git a/src/xeniface/driver.h b/src/xeniface/driver.h
> index 00f2d8f..313f297 100644
> --- a/src/xeniface/driver.h
> +++ b/src/xeniface/driver.h
> @@ -32,7 +32,7 @@
>  #ifndef _XENIFACE_DRIVER_H
>  #define _XENIFACE_DRIVER_H
> 
> -
> +#define XENIFACE_KERNEL_MODE
> 
>  #include "fdo.h"
>  #include "types.h"
> diff --git a/src/xeniface/ioctls.h b/src/xeniface/ioctls.h
> index 63de9eb..7ee7801 100644
> --- a/src/xeniface/ioctls.h
> +++ b/src/xeniface/ioctls.h
> @@ -32,6 +32,8 @@
>  #ifndef _IOCTLS_H_
>  #define _IOCTLS_H_
> 
> +#define XENIFACE_KERNEL_MODE
> +
>  NTSTATUS
>  XenIFaceIoctl(
>      __in  PXENIFACE_FDO         Fdo,
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Oct 14 10:36:13 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 14 Oct 2015 10:36: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 1ZmJPm-0005uT-TD; Wed, 14 Oct 2015 10:36:10 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72274ee0c=Paul.Durrant@citrix.com>)
	id 1ZmJPk-0005uJ-Vl
	for win-pv-devel@lists.xenproject.org; Wed, 14 Oct 2015 10:36:09 +0000
Received: from [85.158.137.68] by server-4.bemta-3.messagelabs.com id
	6C/6A-09570-2103E165; Wed, 14 Oct 2015 10:36:02 +0000
X-Env-Sender: prvs=72274ee0c=Paul.Durrant@citrix.com
X-Msg-Ref: server-12.tower-31.messagelabs.com!1444818956!16207816!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30535 invoked from network); 14 Oct 2015 10:35:56 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-12.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2015 10:35:56 -0000
X-IronPort-AV: E=Sophos;i="5.17,681,1437436800"; 
   d="scan'208";a="5192048"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 4/5] Implement new IOCTL handlers
Thread-Index: AQHRALuLOFp9rRciJk6eY/nrf9sjEJ5qx0ZQ
Date: Wed, 14 Oct 2015 10:35:54 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F611101@AMSPEX01CL01.citrite.net>
References: <5614A431.2020704@invisiblethingslab.com>
In-Reply-To: <5614A431.2020704@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] [PATCH 4/5] Implement new IOCTL handlers
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 Rafal Wojdyla
> Sent: 07 October 2015 05:49
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 4/5] Implement new IOCTL handlers
> 
> This patch implements new store, evtchn and gnttab IOCTLs.
> Handlers are split into separate files for readability.
> 
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
> ---
>  src/xeniface/fdo.c               | 188 ++++++++--
>  src/xeniface/fdo.h               |  25 +-
>  src/xeniface/ioctl_evtchn.c      | 467 ++++++++++++++++++++++++
>  src/xeniface/ioctl_gnttab.c      | 765
> +++++++++++++++++++++++++++++++++++++++
>  src/xeniface/ioctl_store.c       | 574 +++++++++++++++++++++++++++++
>  src/xeniface/ioctls.c            | 360 ++++++------------
>  src/xeniface/ioctls.h            | 315 +++++++++++++++-
>  src/xeniface/irp_queue.c         | 131 +++++++
>  src/xeniface/irp_queue.h         |  50 +++
>  vs2013/xeniface/xeniface.vcxproj |   4 +
>  10 files changed, 2602 insertions(+), 277 deletions(-)
>  create mode 100644 src/xeniface/ioctl_evtchn.c
>  create mode 100644 src/xeniface/ioctl_gnttab.c
>  create mode 100644 src/xeniface/ioctl_store.c
>  create mode 100644 src/xeniface/irp_queue.c
>  create mode 100644 src/xeniface/irp_queue.h
> 
> diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
> index 51bda24..338c8da 100644
> --- a/src/xeniface/fdo.c
> +++ b/src/xeniface/fdo.c
> @@ -36,7 +36,8 @@
>  #include <stdlib.h>
> 
>  #include <store_interface.h>
> -
> +#include <evtchn_interface.h>
> +#include <gnttab_interface.h>
>  #include <suspend_interface.h>
> 
> 
> @@ -52,6 +53,7 @@
>  #include "ioctls.h"
>  #include "wmi.h"
>  #include "xeniface_ioctls.h"
> +#include "irp_queue.h"
> 
>  #define FDO_POOL 'ODF'
> 
> @@ -664,6 +666,25 @@ __FdoD3ToD0(
>      if (!NT_SUCCESS(status))
>          goto fail1;
> 
> +    status = XENBUS_EVTCHN(Acquire, &Fdo->EvtchnInterface);
> +    if (!NT_SUCCESS(status))
> +        goto fail2;
> +
> +    status = XENBUS_GNTTAB(Acquire, &Fdo->GnttabInterface);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    status = XENBUS_GNTTAB(CreateCache,
> +                           &Fdo->GnttabInterface,
> +                           "xeniface-gnttab",
> +                           0,
> +                           GnttabAcquireLock,
> +                           GnttabReleaseLock,
> +                           Fdo,
> +                           &Fdo->GnttabCache);
> +    if (!NT_SUCCESS(status))
> +        goto fail4;
> +
>      __FdoSetDevicePowerState(Fdo, PowerDeviceD0);
> 
>      PowerState.DeviceState = PowerDeviceD0;
> @@ -675,6 +696,18 @@ __FdoD3ToD0(
> 
>      return STATUS_SUCCESS;
> 
> +fail4:
> +    Error("fail4\n");
> +    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
> +
> +fail3:
> +    Error("fail3\n");
> +    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
> +
> +fail2:
> +    Error("fail2\n");
> +    XENBUS_STORE(Release, &Fdo->StoreInterface);
> +
>  fail1:
>      Error("fail1 (%08x)\n", status);
> 
> @@ -700,6 +733,9 @@ __FdoD0ToD3(
> 
>      __FdoSetDevicePowerState(Fdo, PowerDeviceD3);
> 
> +    XENBUS_GNTTAB(DestroyCache, &Fdo->GnttabInterface, Fdo-
> >GnttabCache);
> +    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
> +    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
>      XENBUS_STORE(Release, &Fdo->StoreInterface);
> 
>      Trace("<====\n");
> @@ -1991,27 +2027,25 @@ FdoDispatchDefault(
> 
>  NTSTATUS
>  FdoCreateFile (
> -    __in PXENIFACE_FDO fdoData,
> -    __inout PIRP Irp
> +    __in PXENIFACE_FDO  Fdo,
> +    __inout PIRP        Irp
>      )
>  {
> -    NTSTATUS     status;
> -
> +    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
> +    NTSTATUS            status;
> 
> -    XenIfaceDebugPrint(TRACE, "Create \n");
> +    XenIfaceDebugPrint(TRACE, "FO %p, Process %p\n", Stack->FileObject,
> PsGetCurrentProcess());
> 
> -    if (Deleted == fdoData->Dx->DevicePnpState)
> -    {
> +    if (Deleted == Fdo->Dx->DevicePnpState) {
>          Irp->IoStatus.Status = STATUS_NO_SUCH_DEVICE;
> -        IoCompleteRequest (Irp, IO_NO_INCREMENT);
> +        IoCompleteRequest(Irp, IO_NO_INCREMENT);
>          return STATUS_NO_SUCH_DEVICE;
>      }
> 
> -
>      status = STATUS_SUCCESS;
>      Irp->IoStatus.Information = 0;
>      Irp->IoStatus.Status = status;
> -    IoCompleteRequest (Irp, IO_NO_INCREMENT);
> +    IoCompleteRequest(Irp, IO_NO_INCREMENT);
> 
>      return status;
>  }
> @@ -2019,20 +2053,22 @@ FdoCreateFile (
> 
>  NTSTATUS
>  FdoClose (
> -    __in PXENIFACE_FDO fdoData,
> -    __inout PIRP Irp
> +    __in PXENIFACE_FDO  Fdo,
> +    __inout PIRP        Irp
>      )
> 
>  {
> +    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
> +    NTSTATUS            status;
> 
> -    NTSTATUS     status;
> +    XenIfaceDebugPrint(TRACE, "FO %p, Process %p\n", Stack->FileObject,
> PsGetCurrentProcess());
> 
> -    XenIfaceDebugPrint(TRACE, "Close \n");
> +    XenIfaceCleanup(Fdo, Stack->FileObject);
> 
>      status = STATUS_SUCCESS;
>      Irp->IoStatus.Information = 0;
>      Irp->IoStatus.Status = status;
> -    IoCompleteRequest (Irp, IO_NO_INCREMENT);
> +    IoCompleteRequest(Irp, IO_NO_INCREMENT);
> 
>      return status;
>  }
> @@ -2080,9 +2116,9 @@ FdoDispatch(
>          status = FdoDispatchPower(Fdo, Irp);
>          break;
> 
> -	case IRP_MJ_DEVICE_CONTROL:
> -		status = XenIFaceIoctl(Fdo, Irp);
> -		break;
> +    case IRP_MJ_DEVICE_CONTROL:
> +        status = XenIfaceIoctl(Fdo, Irp);
> +        break;
> 
>  	case IRP_MJ_SYSTEM_CONTROL:
>  		status = XenIfaceSystemControl(Fdo, Irp);
> @@ -2206,6 +2242,7 @@ FdoCreate(
>      WCHAR               Name[MAXNAMELEN * sizeof (WCHAR)];
>      ULONG               Size;
>      NTSTATUS            status;
> +    ULONG               ProcessorCount;
> 
>  #pragma prefast(suppress:28197) // Possibly leaking memory
> 'FunctionDeviceObject'
>      status = IoCreateDevice(DriverObject,
> @@ -2296,6 +2333,24 @@ FdoCreate(
>      if (!NT_SUCCESS(status))
>          goto fail10;
> 
> +    status = FDO_QUERY_INTERFACE(Fdo,
> +                                 XENBUS,
> +                                 EVTCHN,
> +                                 (PINTERFACE)&Fdo->EvtchnInterface,
> +                                 sizeof(Fdo->EvtchnInterface),
> +                                 FALSE);
> +    if (!NT_SUCCESS(status))
> +        goto fail11;
> +
> +    status = FDO_QUERY_INTERFACE(Fdo,
> +                                 XENBUS,
> +                                 GNTTAB,
> +                                 (PINTERFACE)&Fdo->GnttabInterface,
> +                                 sizeof(Fdo->GnttabInterface),
> +                                 FALSE);
> +    if (!NT_SUCCESS(status))
> +        goto fail12;
> +
>      InitializeMutex(&Fdo->Mutex);
>      InitializeListHead(&Dx->ListEntry);
>      Fdo->References = 1;
> @@ -2304,9 +2359,46 @@ FdoCreate(
> 
>  	KeInitializeEvent(&Fdo->registryWriteEvent, NotificationEvent,
> FALSE);
> 
> -	status = ThreadCreate(FdoRegistryThreadHandler, Fdo, &Fdo-
> >registryThread);
> -	if (!NT_SUCCESS(status))
> -		goto fail11;
> +    status = ThreadCreate(FdoRegistryThreadHandler, Fdo, &Fdo-
> >registryThread);
> +    if (!NT_SUCCESS(status))
> +        goto fail13;
> +
> +    KeInitializeSpinLock(&Fdo->StoreWatchLock);
> +    InitializeListHead(&Fdo->StoreWatchList);
> +
> +    KeInitializeSpinLock(&Fdo->EvtchnLock);
> +    InitializeListHead(&Fdo->EvtchnList);
> +
> +    KeInitializeSpinLock(&Fdo->IrpQueueLock);
> +    InitializeListHead(&Fdo->IrpList);
> +
> +    KeInitializeSpinLock(&Fdo->GnttabCacheLock);
> +
> +    status = IoCsqInitializeEx(&Fdo->IrpQueue,
> +                               CsqInsertIrpEx,
> +                               CsqRemoveIrp,
> +                               CsqPeekNextIrp,
> +                               CsqAcquireLock,
> +                               CsqReleaseLock,
> +                               CsqCompleteCanceledIrp);
> +    if (!NT_SUCCESS(status))
> +        goto fail14;
> +
> +    ProcessorCount =
> KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
> +    status = STATUS_NO_MEMORY;

Need a blank line here, I think.

> +    Fdo->EvtchnDpc = __FdoAllocate(sizeof(KDPC) * ProcessorCount);
> +    if (Fdo->EvtchnDpc == NULL)
> +        goto fail15;
> +
> +    for (ULONG i = 0; i < ProcessorCount; i++) {

Let's not use C++-isms where we don't have to. Also use 'Index' or somesuch rather than 'i'.

> +        PROCESSOR_NUMBER ProcNumber;
> +
> +        status = KeGetProcessorNumberFromIndex(i, &ProcNumber);
> +        ASSERT(NT_SUCCESS(status));

Blank line here.

> +        KeInitializeDpc(&Fdo->EvtchnDpc[i], EvtchnNotificationDpc, NULL);
> +        status = KeSetTargetProcessorDpcEx(&Fdo->EvtchnDpc[i],
> &ProcNumber);
> +        ASSERT(NT_SUCCESS(status));
> +    }
> 
>      Info("%p (%s)\n",
>           FunctionDeviceObject,
> @@ -2317,7 +2409,28 @@ FdoCreate(
> 
>      return STATUS_SUCCESS;
> 
> -
> +fail15:
> +    Error("fail15\n");
> +
> +fail14:
> +    Error("fail14\n");
> +
> +    ThreadAlert(Fdo->registryThread);
> +    ThreadJoin(Fdo->registryThread);
> +    Fdo->registryThread = NULL;
> +
> +fail13:
> +    Error("fail13\n");
> +
> +    RtlZeroMemory(&Fdo->GnttabInterface,
> +                  sizeof (XENBUS_GNTTAB_INTERFACE));
> +
> +fail12:
> +    Error("fail12\n");
> +
> +    RtlZeroMemory(&Fdo->EvtchnInterface,
> +                  sizeof(XENBUS_EVTCHN_INTERFACE));
> +
>  fail11:
>  	Error("fail11\n");
> 
> @@ -2395,6 +2508,7 @@ FdoDestroy(
>  {
>      PXENIFACE_DX          Dx = Fdo->Dx;
>      PDEVICE_OBJECT      FunctionDeviceObject = Dx->DeviceObject;
> +    ULONG               ProcessorCount;
> 
>      ASSERT(IsListEmpty(&Dx->ListEntry));
>      ASSERT3U(Fdo->References, ==, 0);
> @@ -2408,9 +2522,33 @@ FdoDestroy(
> 
>      Dx->Fdo = NULL;
> 
> -    RtlZeroMemory(&Fdo->Mutex, sizeof (XENIFACE_MUTEX));
> +    ProcessorCount =
> KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
> +    RtlZeroMemory(Fdo->EvtchnDpc, sizeof(KDPC)*ProcessorCount);

Spaces around '*'. Also I don't think it's safe to use the active processor count. What if a processor came online since the FDO was created?

> +    __FdoFree(Fdo->EvtchnDpc);
> 
> -	Fdo->InterfacesAcquired = FALSE;
> +    RtlZeroMemory(&Fdo->GnttabCacheLock, sizeof(KSPIN_LOCK));
> +    ASSERT(IsListEmpty(&Fdo->IrpList));
> +    RtlZeroMemory(&Fdo->IrpList, sizeof(LIST_ENTRY));
> +    RtlZeroMemory(&Fdo->IrpQueueLock, sizeof(KSPIN_LOCK));
> +    RtlZeroMemory(&Fdo->IrpQueue, sizeof(IO_CSQ));
> +
> +    ASSERT(IsListEmpty(&Fdo->EvtchnList));
> +    RtlZeroMemory(&Fdo->EvtchnList, sizeof(LIST_ENTRY));
> +    RtlZeroMemory(&Fdo->EvtchnLock, sizeof(KSPIN_LOCK));
> +
> +    ASSERT(IsListEmpty(&Fdo->StoreWatchList));
> +    RtlZeroMemory(&Fdo->StoreWatchList, sizeof(LIST_ENTRY));
> +    RtlZeroMemory(&Fdo->StoreWatchLock, sizeof(KSPIN_LOCK));
> +
> +    RtlZeroMemory(&Fdo->Mutex, sizeof(XENIFACE_MUTEX));
> +
> +    Fdo->InterfacesAcquired = FALSE;
> +
> +    RtlZeroMemory(&Fdo->GnttabInterface,
> +                  sizeof(XENBUS_GNTTAB_INTERFACE));
> +
> +    RtlZeroMemory(&Fdo->EvtchnInterface,
> +                  sizeof(XENBUS_EVTCHN_INTERFACE));
> 
>      RtlZeroMemory(&Fdo->StoreInterface,
>                    sizeof (XENBUS_STORE_INTERFACE));
> diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
> index 4416064..cbe5de3 100644
> --- a/src/xeniface/fdo.h
> +++ b/src/xeniface/fdo.h
> @@ -34,6 +34,8 @@
> 
>  #include <ntifs.h>
>  #include <store_interface.h>
> +#include <evtchn_interface.h>
> +#include <gnttab_interface.h>
>  #include <suspend_interface.h>
>  #include <shared_info_interface.h>
> 
> @@ -73,17 +75,30 @@ typedef struct _XENIFACE_FDO {
> 
>      FDO_RESOURCE                    Resource[RESOURCE_COUNT];
> 
> -
>      XENBUS_STORE_INTERFACE          StoreInterface;
> -
>      XENBUS_SUSPEND_INTERFACE        SuspendInterface;
> -
> -	XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
> -
> +    XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
> +    XENBUS_EVTCHN_INTERFACE         EvtchnInterface;
> +    XENBUS_GNTTAB_INTERFACE         GnttabInterface;
>      PXENBUS_SUSPEND_CALLBACK        SuspendCallbackLate;
> 
>  	BOOLEAN
> InterfacesAcquired;
> 

Since you're fixing whitespace, could you fix the above to have sane tabbing?

> +    KSPIN_LOCK                      StoreWatchLock;
> +    LIST_ENTRY                      StoreWatchList;
> +
> +    KSPIN_LOCK                      EvtchnLock;
> +    LIST_ENTRY                      EvtchnList;
> +    PKDPC                           EvtchnDpc;
> +
> +    KSPIN_LOCK                      GnttabCacheLock;
> +
> +    IO_CSQ                          IrpQueue;
> +    KSPIN_LOCK                      IrpQueueLock;
> +    LIST_ENTRY                      IrpList;
> +
> +    PXENBUS_GNTTAB_CACHE            GnttabCache;
> +
>  	#define MAX_SESSIONS    (65536)
> 
>      int							    WmiReady;
> diff --git a/src/xeniface/ioctl_evtchn.c b/src/xeniface/ioctl_evtchn.c
> new file mode 100644
> index 0000000..d46894f
> --- /dev/null
> +++ b/src/xeniface/ioctl_evtchn.c
> @@ -0,0 +1,467 @@
> +/* Copyright (c) Citrix Systems Inc.
> + * All rights reserved.

You're not obliged to give Citrix copyright AFAIK. As long as it's BSD licensed I think we're all happy.

> + *
> + * 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 "driver.h"
> +#include "ioctls.h"
> +#include "..\..\include\xeniface_ioctls.h"

Hmm. I think you should really use

#include <xeniface_ioctls.h>

> +#include "log.h"
> +
> +_Function_class_(KDEFERRED_ROUTINE)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +_IRQL_requires_same_
> +VOID
> +EvtchnNotificationDpc(
> +    __in      PKDPC Dpc,
> +    __in_opt  PVOID _Context,
> +    __in_opt  PVOID Argument1,
> +    __in_opt  PVOID Argument2
> +    )
> +{
> +    PXENIFACE_EVTCHN_CONTEXT Context =
> (PXENIFACE_EVTCHN_CONTEXT)Argument1;
> +
> +    UNREFERENCED_PARAMETER(Dpc);
> +    UNREFERENCED_PARAMETER(_Context);
> +    UNREFERENCED_PARAMETER(Argument2);
> +
> +    ASSERT(Context);
> +
> +#if DBG
> +    XenIfaceDebugPrint(INFO, "Channel %p, LocalPort %d, Active %d, Cpu
> %lu\n",
> +                       Context->Channel, Context->LocalPort, Context->Active,
> KeGetCurrentProcessorNumber());
> +#endif
> +    if (Context->Active) {
> +        KeSetEvent(Context->Event, 0, FALSE);
> +
> +        XENBUS_EVTCHN(Unmask,
> +                      &Context->Fdo->EvtchnInterface,
> +                      Context->Channel,
> +                      FALSE);
> +    }
> +}
> +
> +_Function_class_(KSERVICE_ROUTINE)
> +_IRQL_requires_(HIGH_LEVEL)
> +_IRQL_requires_same_
> +static DECLSPEC_NOINLINE
> +BOOLEAN
> +EvtchnInterruptHandler(
> +    __in      PKINTERRUPT Interrupt,
> +    __in_opt  PVOID Argument
> +    )
> +{
> +    PXENIFACE_EVTCHN_CONTEXT Context =
> (PXENIFACE_EVTCHN_CONTEXT)Argument;
> +    PROCESSOR_NUMBER ProcNumber;
> +    ULONG ProcIndex;
> +
> +    UNREFERENCED_PARAMETER(Interrupt);
> +    ASSERT(Context);
> +
> +    KeGetCurrentProcessorNumberEx(&ProcNumber);
> +    ProcIndex = KeGetProcessorIndexFromNumber(&ProcNumber);
> +    if (Context->Active)
> +        KeInsertQueueDpc(&Context->Fdo->EvtchnDpc[ProcIndex], Context,
> NULL);
> +
> +    return TRUE;
> +}
> +
> +_IRQL_requires_(PASSIVE_LEVEL) // needed for KeFlushQueuedDpcs
> +VOID
> +EvtchnFree(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_EVTCHN_CONTEXT Context
> +    )
> +{
> +    ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
> +
> +    XenIfaceDebugPrint(TRACE, "Context %p, LocalPort %d, FO %p\n",
> +                       Context, Context->LocalPort, Context->FileObject);
> +
> +    InterlockedExchange8(&Context->Active, 0);
> +
> +    XENBUS_EVTCHN(Close,
> +                  &Fdo->EvtchnInterface,
> +                  Context->Channel);
> +
> +    // There may still be a pending event at this time.
> +    // Wait for our DPCs to complete.
> +    KeFlushQueuedDpcs();
> +
> +    ObDereferenceObject(Context->Event);
> +    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));

'sizeof' is a keyword so it really should be sizeof (), similar to if () or for ().

> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +}
> +
> +_Requires_exclusive_lock_held_(Fdo->EvtchnLock)
> +static
> +PXENIFACE_EVTCHN_CONTEXT
> +EvtchnFindChannel(
> +    __in      PXENIFACE_FDO Fdo,
> +    __in      ULONG         LocalPort,
> +    __in_opt  PFILE_OBJECT  FileObject
> +    )
> +{
> +    PXENIFACE_EVTCHN_CONTEXT Context, Found = NULL;
> +    PLIST_ENTRY Node;
> +
> +    Node = Fdo->EvtchnList.Flink;
> +    while (Node->Flink != Fdo->EvtchnList.Flink) {
> +        Context = CONTAINING_RECORD(Node, XENIFACE_EVTCHN_CONTEXT,
> Entry);
> +
> +        Node = Node->Flink;
> +        if (Context->LocalPort != LocalPort)
> +            continue;
> +
> +        if (FileObject != NULL && Context->FileObject != FileObject)
> +            continue;
> +
> +        Found = Context;
> +        break;
> +    }
> +
> +    return Found;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnBindUnbound(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_BIND_UNBOUND_IN In = Buffer;
> +    PXENIFACE_EVTCHN_BIND_UNBOUND_OUT Out = Buffer;
> +    PXENIFACE_EVTCHN_CONTEXT Context;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_IN) || OutLen !=
> sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_OUT))

Break this line at the '||'.

> +        goto fail1;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context = ExAllocatePoolWithTag(NonPagedPool,
> sizeof(XENIFACE_EVTCHN_CONTEXT), XENIFACE_POOL_TAG);
> +    if (Context == NULL)
> +        goto fail2;
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
> +    Context->FileObject = FileObject;
> +
> +    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, Mask %d, FO %p\n",
> +                       In->RemoteDomain, In->Mask, FileObject);
> +
> +    status = ObReferenceObjectByHandle(In->Event,
> EVENT_MODIFY_STATE, *ExEventObjectType, UserMode, &Context->Event,
> NULL);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    status = STATUS_UNSUCCESSFUL;
> +    Context->Channel = XENBUS_EVTCHN(Open,
> +                                     &Fdo->EvtchnInterface,
> +                                     XENBUS_EVTCHN_TYPE_UNBOUND,
> +                                     EvtchnInterruptHandler,
> +                                     Context,
> +                                     In->RemoteDomain,
> +                                     TRUE);
> +    if (Context->Channel == NULL)
> +        goto fail4;
> +
> +    Context->LocalPort = XENBUS_EVTCHN(GetPort,
> +                                       &Fdo->EvtchnInterface,
> +                                       Context->Channel);
> +
> +    Context->Fdo = Fdo;
> +
> +    ExInterlockedInsertTailList(&Fdo->EvtchnList, &Context->Entry, &Fdo-
> >EvtchnLock);
> +
> +    InterlockedExchange8(&Context->Active, 1);
> +    Out->LocalPort = Context->LocalPort;
> +    *Info = sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_OUT);
> +
> +    if (!In->Mask) {
> +        XENBUS_EVTCHN(Unmask,
> +                      &Fdo->EvtchnInterface,
> +                      Context->Channel,
> +                      FALSE);
> +    }
> +
> +    XenIfaceDebugPrint(TRACE, "< LocalPort %lu, Context %p\n", Context-
> >LocalPort, Context);
> +    return STATUS_SUCCESS;
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +    ObDereferenceObject(Context->Event);
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnBindInterdomain(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_BIND_INTERDOMAIN_IN In = Buffer;
> +    PXENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT Out = Buffer;
> +    PXENIFACE_EVTCHN_CONTEXT Context;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN) ||
> OutLen != sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT))
> +        goto fail1;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context = ExAllocatePoolWithTag(NonPagedPool,
> sizeof(XENIFACE_EVTCHN_CONTEXT), XENIFACE_POOL_TAG);
> +    if (Context == NULL)
> +        goto fail2;
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
> +    Context->FileObject = FileObject;
> +
> +    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, RemotePort %lu,
> Mask %d, FO %p\n",
> +                       In->RemoteDomain, In->RemotePort, In->Mask, FileObject);
> +
> +    status = ObReferenceObjectByHandle(In->Event,
> EVENT_MODIFY_STATE, *ExEventObjectType, UserMode, &Context->Event,
> NULL);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    status = STATUS_UNSUCCESSFUL;
> +    Context->Channel = XENBUS_EVTCHN(Open,
> +                                     &Fdo->EvtchnInterface,
> +                                     XENBUS_EVTCHN_TYPE_INTER_DOMAIN,
> +                                     EvtchnInterruptHandler,
> +                                     Context,
> +                                     In->RemoteDomain,
> +                                     In->RemotePort,
> +                                     TRUE);
> +    if (Context->Channel == NULL)
> +        goto fail4;
> +
> +    Context->LocalPort = XENBUS_EVTCHN(GetPort,
> +                                       &Fdo->EvtchnInterface,
> +                                       Context->Channel);
> +
> +    Context->Fdo = Fdo;
> +
> +    ExInterlockedInsertTailList(&Fdo->EvtchnList, &Context->Entry, &Fdo-
> >EvtchnLock);
> +
> +    InterlockedExchange8(&Context->Active, 1);
> +    Out->LocalPort = Context->LocalPort;
> +    *Info = sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT);
> +
> +    if (!In->Mask) {
> +        XENBUS_EVTCHN(Unmask,
> +                      &Fdo->EvtchnInterface,
> +                      Context->Channel,
> +                      FALSE);
> +    }
> +
> +    XenIfaceDebugPrint(TRACE, "< LocalPort %lu, Context %p\n", Context-
> >LocalPort, Context);
> +
> +    return STATUS_SUCCESS;
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +    ObDereferenceObject(Context->Event);
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnClose(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_CLOSE_IN In = Buffer;
> +    PXENIFACE_EVTCHN_CONTEXT Context = NULL;
> +    KIRQL Irql;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_EVTCHN_CLOSE_IN) || OutLen != 0)
> +        goto fail1;
> +
> +    XenIfaceDebugPrint(TRACE, "> LocalPort %lu, FO %p\n", In->LocalPort,
> FileObject);
> +
> +    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
> +    Context = EvtchnFindChannel(Fdo, In->LocalPort, FileObject);
> +    if (Context != NULL)

Could you not go straight to fail2 here (and drop the lock there) and thus get rid of the tests for Context == or != NULL below?

> +        RemoveEntryList(&Context->Entry);
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +    if (Context != NULL)
> +        EvtchnFree(Fdo, Context);
> +
> +    status = STATUS_NOT_FOUND;
> +    if (Context == NULL)
> +        goto fail2;
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +_Requires_lock_not_held_(Fdo->EvtchnLock)
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +EvtchnNotify(
> +    __in      PXENIFACE_FDO Fdo,
> +    __in      ULONG         LocalPort,
> +    __in_opt  PFILE_OBJECT  FileObject
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_CONTEXT Context = NULL;
> +    KIRQL Irql;
> +
> +    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
> +
> +    Context = EvtchnFindChannel(Fdo, LocalPort, FileObject);
> +
> +    status = STATUS_NOT_FOUND;
> +    if (Context == NULL)
> +        goto fail1;
> +
> +    XENBUS_EVTCHN(Send,
> +                  &Fdo->EvtchnInterface,
> +                  Context->Channel);
> +
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +
> +    return STATUS_SUCCESS;
> +
> +fail1:
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnNotify(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_NOTIFY_IN In = Buffer;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_EVTCHN_NOTIFY_IN) || OutLen != 0)
> +        goto fail1;
> +#if DBG
> +    XenIfaceDebugPrint(INFO, "> LocalPort %d, FO %p\n", In->LocalPort,
> FileObject);
> +#endif
> +
> +    return EvtchnNotify(Fdo, In->LocalPort, FileObject);
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnUnmask(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_UNMASK_IN In = Buffer;
> +    PXENIFACE_EVTCHN_CONTEXT Context = NULL;
> +    KIRQL Irql;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_EVTCHN_UNMASK_IN) || OutLen != 0)
> +        goto fail1;
> +
> +    XenIfaceDebugPrint(TRACE, "> LocalPort %d, FO %p\n", In->LocalPort,
> FileObject);
> +
> +    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
> +
> +    Context = EvtchnFindChannel(Fdo, In->LocalPort, FileObject);
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (Context == NULL)
> +        goto fail2;
> +
> +    XENBUS_EVTCHN(Unmask,
> +                  &Fdo->EvtchnInterface,
> +                  Context->Channel,
> +                  FALSE);
> +
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> diff --git a/src/xeniface/ioctl_gnttab.c b/src/xeniface/ioctl_gnttab.c
> new file mode 100644
> index 0000000..a279b77
> --- /dev/null
> +++ b/src/xeniface/ioctl_gnttab.c
> @@ -0,0 +1,765 @@
> +/* 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 "driver.h"
> +#include "ioctls.h"
> +#include "..\..\include\xeniface_ioctls.h"

Use <> too.

> +#include "log.h"
> +#include "irp_queue.h"
> +
> +// Complete a canceled gnttab IRP, cleanup associated grant/map.
> +_Function_class_(IO_WORKITEM_ROUTINE)
> +VOID
> +CompleteGnttabIrp(
> +    __in      PDEVICE_OBJECT DeviceObject,
> +    __in_opt  PVOID          Context
> +    )
> +{
> +    PXENIFACE_DX Dx = (PXENIFACE_DX)DeviceObject->DeviceExtension;
> +    PXENIFACE_FDO Fdo = Dx->Fdo;
> +    PIRP Irp = Context;
> +    PXENIFACE_CONTEXT_ID Id;
> +    PIO_WORKITEM WorkItem;
> +    KAPC_STATE ApcState;
> +    BOOLEAN ChangeProcess;
> +
> +    ASSERT(Context != NULL);
> +
> +    Id = Irp->Tail.Overlay.DriverContext[0];
> +    WorkItem = Irp->Tail.Overlay.DriverContext[1];
> +
> +    // We are not guaranteed to be in the context of the process that
> initiated the IRP,
> +    // but we need to be there to unmap memory.
> +    ChangeProcess = PsGetCurrentProcess() != Id->Process;
> +    if (ChangeProcess) {
> +        XenIfaceDebugPrint(TRACE, "Changing process from %p to %p\n",
> PsGetCurrentProcess(), Id->Process);
> +        KeStackAttachProcess(Id->Process, &ApcState);
> +    }
> +
> +    XenIfaceDebugPrint(TRACE, "Irp %p, Process %p, Id %lu, Type %d, IRQL
> %d\n",
> +                       Irp, Id->Process, Id->RequestId, Id->Type, KeGetCurrentIrql());
> +
> +    switch (Id->Type) {
> +
> +    case XENIFACE_CONTEXT_GRANT:
> +        GnttabFreeGrant(Fdo, CONTAINING_RECORD(Id,
> XENIFACE_GRANT_CONTEXT, Id));
> +        break;
> +
> +    case XENIFACE_CONTEXT_MAP:
> +        GnttabFreeMap(Fdo, CONTAINING_RECORD(Id,
> XENIFACE_MAP_CONTEXT, Id));
> +        break;
> +
> +    default:
> +        ASSERT(FALSE);
> +    }
> +
> +    if (ChangeProcess)
> +        KeUnstackDetachProcess(&ApcState);
> +
> +    IoFreeWorkItem(WorkItem);
> +
> +    Irp->IoStatus.Status = STATUS_CANCELLED;
> +    Irp->IoStatus.Information = 0;
> +    IoCompleteRequest(Irp, IO_NO_INCREMENT);
> +}
> +
> +_Acquires_exclusive_lock_(((PXENIFACE_FDO)Argument)-
> >GnttabCacheLock)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +VOID
> +GnttabAcquireLock(
> +    __in  PVOID Argument
> +    )
> +{
> +    PXENIFACE_FDO Fdo = Argument;
> +
> +    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
> +
> +    KeAcquireSpinLockAtDpcLevel(&Fdo->GnttabCacheLock);
> +}
> +
> +_Releases_exclusive_lock_(((PXENIFACE_FDO)Argument)-
> >GnttabCacheLock)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +VOID
> +GnttabReleaseLock(
> +    __in  PVOID Argument
> +    )
> +{
> +    PXENIFACE_FDO Fdo = Argument;
> +
> +    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
> +
> +    KeReleaseSpinLockFromDpcLevel(&Fdo->GnttabCacheLock);
> +}
> +
> +_Requires_lock_not_held_(Fdo->IrpQueueLock)
> +static
> +PIRP
> +FindGnttabIrp(
> +    __in  PXENIFACE_FDO Fdo,
> +    __in  PXENIFACE_CONTEXT_ID Id
> +    )
> +{
> +    KIRQL Irql;
> +    PIRP Irp;
> +
> +    CsqAcquireLock(&Fdo->IrpQueue, &Irql);
> +    Irp = CsqPeekNextIrp(&Fdo->IrpQueue, NULL, Id);
> +    CsqReleaseLock(&Fdo->IrpQueue, Irql);
> +    return Irp;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabPermitForeignAccess(
> +    __in     PXENIFACE_FDO  Fdo,
> +    __in     PVOID          Buffer,
> +    __in     ULONG          InLen,
> +    __in     ULONG          OutLen,
> +    __inout  PIRP           Irp
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN In = Buffer;
> +    PXENIFACE_GRANT_CONTEXT Context;
> +    ULONG Page;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN) ||
> OutLen != 0)
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if ((In->NumberPages == 0) || (In->NumberPages > 1024 * 1024) ||
> +        ((In->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) && (In-
> >NotifyOffset >= In->NumberPages * PAGE_SIZE))
> +        )
> +        goto fail2;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context = ExAllocatePoolWithTag(NonPagedPool,
> sizeof(XENIFACE_GRANT_CONTEXT), XENIFACE_POOL_TAG);
> +    if (Context == NULL)
> +        goto fail3;
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
> +    Context->Id.Type = XENIFACE_CONTEXT_GRANT;
> +    Context->Id.Process = PsGetCurrentProcess();

Careful. I don't think Wndows guarantees that METHOD_BUFFERED ioctls will be handled in the issuers process context. See the sentence:

" After the I/O manager has created a system-space buffer for the driver, the requesting user-mode thread can be swapped out and its physical memory can be reused by another thread, possibly by a thread belonging to another process."

at https://msdn.microsoft.com/en-us/library/windows/hardware/ff565356%28v=vs.85%29.aspx.

You should probably consider using METHOD_NEITHER. That may also allow you to play tricks like injecting the results of the operation into the user-space buffer without completing the ioctl possibly negating the need for a 'get results' ioctl.

  Paul

> +    Context->Id.RequestId = In->RequestId;
> +    Context->RemoteDomain = In->RemoteDomain;
> +    Context->NumberPages = In->NumberPages;
> +    Context->Flags = In->Flags;
> +    Context->NotifyOffset = In->NotifyOffset;
> +    Context->NotifyPort = In->NotifyPort;
> +
> +    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, NumberPages %lu,
> Flags 0x%x, Offset 0x%x, Port %d, Process %p, Id %lu\n",
> +                       Context->RemoteDomain, Context->NumberPages, Context-
> >Flags, Context->NotifyOffset, Context->NotifyPort,
> +                       Context->Id.Process, Context->Id.RequestId);
> +
> +    // Check if the request ID is unique.
> +    // This doesn't protect us from simultaneous requests with the same ID
> arriving here
> +    // but another check for duplicate ID is performed when the context/IRP
> is queued at the end.
> +    // Ideally we would lock the whole section but that's not really an option
> since we touch user memory.
> +    status = STATUS_INVALID_PARAMETER;
> +    if (FindGnttabIrp(Fdo, &Context->Id) != NULL)
> +        goto fail4;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context->Grants = ExAllocatePoolWithTag(NonPagedPool, Context-
> >NumberPages * sizeof(PXENBUS_GNTTAB_ENTRY),
> XENIFACE_POOL_TAG);
> +    if (Context->Grants == NULL)
> +        goto fail5;
> +
> +    RtlZeroMemory(Context->Grants, Context->NumberPages *
> sizeof(PXENBUS_GNTTAB_ENTRY));
> +
> +    // allocate memory to share
> +    status = STATUS_NO_MEMORY;
> +    Context->KernelVa = ExAllocatePoolWithTag(NonPagedPool, Context-
> >NumberPages * PAGE_SIZE, XENIFACE_POOL_TAG);
> +    if (Context->KernelVa == NULL)
> +        goto fail6;
> +
> +    RtlZeroMemory(Context->KernelVa, Context->NumberPages *
> PAGE_SIZE);
> +    Context->Mdl = IoAllocateMdl(Context->KernelVa, Context-
> >NumberPages * PAGE_SIZE, FALSE, FALSE, NULL);
> +    if (Context->Mdl == NULL)
> +        goto fail7;
> +
> +    MmBuildMdlForNonPagedPool(Context->Mdl);
> +    ASSERT(MmGetMdlByteCount(Context->Mdl) == Context-
> >NumberPages * PAGE_SIZE);
> +
> +    // perform sharing
> +    for (Page = 0; Page < Context->NumberPages; Page++) {
> +        status = XENBUS_GNTTAB(PermitForeignAccess,
> +                               &Fdo->GnttabInterface,
> +                               Fdo->GnttabCache,
> +                               FALSE,
> +                               Context->RemoteDomain,
> +                               MmGetMdlPfnArray(Context->Mdl)[Page],
> +                               (Context->Flags & XENIFACE_GNTTAB_READONLY) != 0,
> +                               &(Context->Grants[Page]));
> +
> +// prefast somehow thinks that this call can modify Page...
> +#pragma prefast(suppress:6385)
> +        XenIfaceDebugPrint(INFO, "Grants[%lu] = %p\n", Page, Context-
> >Grants[Page]);
> +        if (!NT_SUCCESS(status))
> +            goto fail8;
> +    }
> +
> +    // map into user mode
> +#pragma prefast(suppress:6320) // we want to catch all exceptions
> +    __try {
> +        Context->UserVa = MmMapLockedPagesSpecifyCache(Context->Mdl,
> UserMode, MmCached, NULL, FALSE, NormalPagePriority);
> +    }
> +    __except (EXCEPTION_EXECUTE_HANDLER) {
> +        status = GetExceptionCode();
> +        goto fail9;
> +    }
> +
> +    status = STATUS_UNSUCCESSFUL;
> +    if (Context->UserVa == NULL)
> +        goto fail10;
> +
> +    XenIfaceDebugPrint(TRACE, "< Context %p, Irp %p, KernelVa %p, UserVa
> %p\n", Context, Irp, Context->KernelVa, Context->UserVa);
> +
> +    // Insert the IRP/context into the pending queue.
> +    // This also checks (again) if the request ID is unique.
> +    Irp->Tail.Overlay.DriverContext[0] = &Context->Id;
> +    status = IoCsqInsertIrpEx(&Fdo->IrpQueue, Irp, NULL, &Context->Id);
> +    if (!NT_SUCCESS(status))
> +        goto fail11;
> +
> +    return STATUS_PENDING;
> +
> +fail11:
> +    XenIfaceDebugPrint(ERROR, "Fail11\n");
> +    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
> +
> +fail10:
> +    XenIfaceDebugPrint(ERROR, "Fail10\n");
> +
> +fail9:
> +    XenIfaceDebugPrint(ERROR, "Fail9\n");
> +
> +fail8:
> +    XenIfaceDebugPrint(ERROR, "Fail8: Page = %lu\n", Page);
> +
> +    while (Page > 0) {
> +        ASSERT(NT_SUCCESS(XENBUS_GNTTAB(RevokeForeignAccess,
> +                                        &Fdo->GnttabInterface,
> +                                        Fdo->GnttabCache,
> +                                        FALSE,
> +                                        Context->Grants[Page - 1])));
> +
> +        --Page;
> +    }
> +    IoFreeMdl(Context->Mdl);
> +
> +fail7:
> +    XenIfaceDebugPrint(ERROR, "Fail7\n");
> +    ExFreePoolWithTag(Context->KernelVa, XENIFACE_POOL_TAG);
> +
> +fail6:
> +    XenIfaceDebugPrint(ERROR, "Fail6\n");
> +    ExFreePoolWithTag(Context->Grants, XENIFACE_POOL_TAG);
> +
> +fail5:
> +    XenIfaceDebugPrint(ERROR, "Fail5\n");
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabGetGrantResult(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_GNTTAB_GET_GRANT_RESULT_IN In = Buffer;
> +    PXENIFACE_GNTTAB_GET_GRANT_RESULT_OUT Out = Buffer;
> +    XENIFACE_CONTEXT_ID Id;
> +    KIRQL Irql;
> +    PIRP Irp;
> +    PXENIFACE_CONTEXT_ID ContextId;
> +    PXENIFACE_GRANT_CONTEXT Context;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_GNTTAB_GET_GRANT_RESULT_IN))
> +        goto fail1;
> +
> +    Id.Process = PsGetCurrentProcess();
> +    Id.RequestId = In->RequestId;
> +    Id.Type = XENIFACE_CONTEXT_GRANT;
> +
> +    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process,
> Id.RequestId);
> +
> +    CsqAcquireLock(&Fdo->IrpQueue, &Irql);
> +    Irp = CsqPeekNextIrp(&Fdo->IrpQueue, NULL, &Id);
> +
> +    status = STATUS_NOT_FOUND;
> +    if (Irp == NULL)
> +        goto fail2;
> +
> +    ContextId = Irp->Tail.Overlay.DriverContext[0];
> +    Context = CONTAINING_RECORD(ContextId,
> XENIFACE_GRANT_CONTEXT, Id);
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (OutLen != (sizeof(XENIFACE_GNTTAB_GET_GRANT_RESULT_OUT) +
> sizeof(ULONG) * Context->NumberPages))
> +        goto fail3;
> +
> +    Out->Address = Context->UserVa;
> +    XenIfaceDebugPrint(TRACE, "< Address %p, Irp %p\n", Context->UserVa,
> Irp);
> +
> +    for (ULONG Page = 0; Page < Context->NumberPages; Page++) {
> +        Out->References[Page] = XENBUS_GNTTAB(GetReference,
> +                                              &Fdo->GnttabInterface,
> +                                              Context->Grants[Page]);
> +        XenIfaceDebugPrint(INFO, "Ref[%lu] = %lu\n", Page, Out-
> >References[Page]);
> +    }
> +
> +    CsqReleaseLock(&Fdo->IrpQueue, Irql);
> +    *Info = OutLen;
> +
> +    return STATUS_SUCCESS;
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +    CsqReleaseLock(&Fdo->IrpQueue, Irql);
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +_IRQL_requires_max_(APC_LEVEL)
> +VOID
> +GnttabFreeGrant(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_GRANT_CONTEXT Context
> +)
> +{
> +    NTSTATUS status;
> +    ULONG Page;
> +
> +    ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
> +
> +    XenIfaceDebugPrint(TRACE, "Context %p\n", Context);
> +
> +    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) {
> +        ((PCHAR)Context->KernelVa)[Context->NotifyOffset] = 0;
> +    }
> +
> +    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_PORT) {
> +        status = EvtchnNotify(Fdo, Context->NotifyPort, NULL);
> +
> +        if (!NT_SUCCESS(status)) // non-fatal, we must free memory
> +            XenIfaceDebugPrint(ERROR, "failed to notify port %lu: 0x%x\n",
> Context->NotifyPort, status);
> +    }
> +
> +    // unmap from user address space
> +    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
> +
> +    // stop sharing
> +    for (Page = 0; Page < Context->NumberPages; Page++) {
> +        status = XENBUS_GNTTAB(RevokeForeignAccess,
> +                               &Fdo->GnttabInterface,
> +                               Fdo->GnttabCache,
> +                               FALSE,
> +                               Context->Grants[Page]);
> +
> +        ASSERT(NT_SUCCESS(status)); // failure here is fatal, something
> must've gone catastrophically wrong
> +    }
> +
> +    IoFreeMdl(Context->Mdl);
> +
> +    RtlZeroMemory(Context->KernelVa, Context->NumberPages *
> PAGE_SIZE);
> +    ExFreePoolWithTag(Context->KernelVa, XENIFACE_POOL_TAG);
> +
> +    RtlZeroMemory(Context->Grants, Context->NumberPages *
> sizeof(PXENBUS_GNTTAB_ENTRY));
> +    ExFreePoolWithTag(Context->Grants, XENIFACE_POOL_TAG);
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabRevokeForeignAccess(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN In = Buffer;
> +    PXENIFACE_GRANT_CONTEXT Context = NULL;
> +    XENIFACE_CONTEXT_ID Id;
> +    PIRP PendingIrp;
> +    PXENIFACE_CONTEXT_ID ContextId;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN))
> +        goto fail1;
> +
> +    Id.Type = XENIFACE_CONTEXT_GRANT;
> +    Id.Process = PsGetCurrentProcess();
> +    Id.RequestId = In->RequestId;
> +
> +    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process,
> Id.RequestId);
> +
> +    status = STATUS_NOT_FOUND;
> +    PendingIrp = IoCsqRemoveNextIrp(&Fdo->IrpQueue, &Id);
> +    if (PendingIrp == NULL)
> +        goto fail2;
> +
> +    ContextId = PendingIrp->Tail.Overlay.DriverContext[0];
> +    Context = CONTAINING_RECORD(ContextId,
> XENIFACE_GRANT_CONTEXT, Id);
> +    GnttabFreeGrant(Fdo, Context);
> +
> +    PendingIrp->IoStatus.Status = STATUS_SUCCESS;
> +    PendingIrp->IoStatus.Information = 0;
> +    IoCompleteRequest(PendingIrp, IO_NO_INCREMENT);
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabMapForeignPages(
> +    __in     PXENIFACE_FDO     Fdo,
> +    __in     PVOID             Buffer,
> +    __in     ULONG             InLen,
> +    __in     ULONG             OutLen,
> +    __inout  PIRP           Irp
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN In = Buffer;
> +    PXENIFACE_MAP_CONTEXT Context;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen < sizeof(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN) ||
> OutLen != 0)
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if ((In->NumberPages == 0) || (In->NumberPages > 1024 * 1024) ||
> +        ((In->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) && (In-
> >NotifyOffset >= In->NumberPages * PAGE_SIZE))
> +        )
> +        goto fail2;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN) +
> sizeof(ULONG) * In->NumberPages)
> +        goto fail3;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context = ExAllocatePoolWithTag(NonPagedPool,
> sizeof(XENIFACE_MAP_CONTEXT), XENIFACE_POOL_TAG);
> +    if (Context == NULL)
> +        goto fail4;
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
> +    Context->Id.Type = XENIFACE_CONTEXT_MAP;
> +    Context->Id.Process = PsGetCurrentProcess();
> +    Context->Id.RequestId = In->RequestId;
> +    Context->RemoteDomain = In->RemoteDomain;
> +    Context->NumberPages = In->NumberPages;
> +    Context->Flags = In->Flags;
> +    Context->NotifyOffset = In->NotifyOffset;
> +    Context->NotifyPort = In->NotifyPort;
> +
> +    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, NumberPages %lu,
> Flags 0x%x, Offset 0x%x, Port %d, Process %p, Id %lu\n",
> +                       Context->RemoteDomain, Context->NumberPages, Context-
> >Flags, Context->NotifyOffset, Context->NotifyPort,
> +                       Context->Id.Process, Context->Id.RequestId);
> +
> +    for (ULONG i = 0; i < In->NumberPages; i++)
> +        XenIfaceDebugPrint(INFO, "> Ref %d\n", In->References[i]);
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (FindGnttabIrp(Fdo, &Context->Id) != NULL)
> +        goto fail5;
> +
> +    status = XENBUS_GNTTAB(MapForeignPages,
> +                           &Fdo->GnttabInterface,
> +                           Context->RemoteDomain,
> +                           Context->NumberPages,
> +                           In->References,
> +                           Context->Flags & XENIFACE_GNTTAB_READONLY,
> +                           &Context->Address);
> +
> +    if (!NT_SUCCESS(status))
> +        goto fail6;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context->KernelVa = MmMapIoSpace(Context->Address, Context-
> >NumberPages * PAGE_SIZE, MmCached);
> +    if (Context->KernelVa == NULL)
> +        goto fail7;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context->Mdl = IoAllocateMdl(Context->KernelVa, Context-
> >NumberPages * PAGE_SIZE, FALSE, FALSE, NULL);
> +    if (Context->Mdl == NULL)
> +        goto fail8;
> +
> +    MmBuildMdlForNonPagedPool(Context->Mdl);
> +
> +    // map into user mode
> +#pragma prefast(suppress: 6320) // we want to catch all exceptions
> +    __try {
> +        Context->UserVa = MmMapLockedPagesSpecifyCache(Context->Mdl,
> UserMode, MmCached, NULL, FALSE, NormalPagePriority);
> +    }
> +    __except (EXCEPTION_EXECUTE_HANDLER) {
> +        status = GetExceptionCode();
> +        goto fail9;
> +    }
> +
> +    status = STATUS_UNSUCCESSFUL;
> +    if (Context->UserVa == NULL)
> +        goto fail10;
> +
> +    XenIfaceDebugPrint(TRACE, "< Context %p, Irp %p, Address %p, KernelVa
> %p, UserVa %p\n",
> +                       Context, Irp, Context->Address, Context->KernelVa, Context-
> >UserVa);
> +
> +    // Insert the IRP/context into the pending queue.
> +    // This also checks (again) if the request ID is unique.
> +    Irp->Tail.Overlay.DriverContext[0] = &Context->Id;
> +    status = IoCsqInsertIrpEx(&Fdo->IrpQueue, Irp, NULL, &Context->Id);
> +    if (!NT_SUCCESS(status))
> +        goto fail11;
> +
> +    return STATUS_PENDING;
> +
> +fail11:
> +    XenIfaceDebugPrint(ERROR, "Fail11\n");
> +    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
> +
> +fail10:
> +    XenIfaceDebugPrint(ERROR, "Fail10\n");
> +
> +fail9:
> +    XenIfaceDebugPrint(ERROR, "Fail9\n");
> +    IoFreeMdl(Context->Mdl);
> +
> +fail8:
> +    XenIfaceDebugPrint(ERROR, "Fail8\n");
> +    MmUnmapIoSpace(Context->KernelVa, Context->NumberPages *
> PAGE_SIZE);
> +
> +fail7:
> +    XenIfaceDebugPrint(ERROR, "Fail7\n");
> +    ASSERT(NT_SUCCESS(XENBUS_GNTTAB(UnmapForeignPages,
> +                                    &Fdo->GnttabInterface,
> +                                    Context->Address
> +                                    )));
> +
> +fail6:
> +    XenIfaceDebugPrint(ERROR, "Fail6\n");
> +
> +fail5:
> +    XenIfaceDebugPrint(ERROR, "Fail5\n");
> +    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabGetMapResult(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_GNTTAB_GET_MAP_RESULT_IN In = Buffer;
> +    PXENIFACE_GNTTAB_GET_MAP_RESULT_OUT Out = Buffer;
> +    XENIFACE_CONTEXT_ID Id;
> +    KIRQL Irql;
> +    PIRP Irp;
> +    PXENIFACE_MAP_CONTEXT Context;
> +    PXENIFACE_CONTEXT_ID ContextId;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_GNTTAB_GET_MAP_RESULT_IN) || OutLen
> != sizeof(XENIFACE_GNTTAB_GET_MAP_RESULT_OUT))
> +        goto fail1;
> +
> +    Id.Type = XENIFACE_CONTEXT_MAP;
> +    Id.Process = PsGetCurrentProcess();
> +    Id.RequestId = In->RequestId;
> +
> +    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process,
> Id.RequestId);
> +
> +    CsqAcquireLock(&Fdo->IrpQueue, &Irql);
> +    Irp = CsqPeekNextIrp(&Fdo->IrpQueue, NULL, &Id);
> +
> +    status = STATUS_NOT_FOUND;
> +    if (Irp == NULL)
> +        goto fail2;
> +
> +    ContextId = Irp->Tail.Overlay.DriverContext[0];
> +    Context = CONTAINING_RECORD(ContextId, XENIFACE_MAP_CONTEXT,
> Id);
> +
> +    Out->Address = Context->UserVa;
> +    XenIfaceDebugPrint(TRACE, "< Address %p, Irp %p\n", Context->UserVa,
> Irp);
> +
> +    CsqReleaseLock(&Fdo->IrpQueue, Irql);
> +    *Info = OutLen;
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +    CsqReleaseLock(&Fdo->IrpQueue, Irql);
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +_IRQL_requires_max_(APC_LEVEL)
> +DECLSPEC_NOINLINE
> +VOID
> +GnttabFreeMap(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_MAP_CONTEXT Context
> +    )
> +{
> +    NTSTATUS status;
> +
> +    ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
> +
> +    XenIfaceDebugPrint(TRACE, "Context %p\n", Context);
> +
> +    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) {
> +        ((PCHAR)Context->KernelVa)[Context->NotifyOffset] = 0;
> +    }
> +
> +    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_PORT) {
> +        status = EvtchnNotify(Fdo, Context->NotifyPort, NULL);
> +
> +        if (!NT_SUCCESS(status)) // non-fatal, we must free memory
> +            XenIfaceDebugPrint(ERROR, "failed to notify port %lu: 0x%x\n",
> Context->NotifyPort, status);
> +    }
> +
> +    // unmap from user address space
> +    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
> +
> +    IoFreeMdl(Context->Mdl);
> +
> +    // unmap from system space
> +    MmUnmapIoSpace(Context->KernelVa, Context->NumberPages *
> PAGE_SIZE);
> +
> +    // undo mapping
> +    status = XENBUS_GNTTAB(UnmapForeignPages,
> +                           &Fdo->GnttabInterface,
> +                           Context->Address);
> +
> +    ASSERT(NT_SUCCESS(status));
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabUnmapForeignPages(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN In = Buffer;
> +    PXENIFACE_MAP_CONTEXT Context = NULL;
> +    XENIFACE_CONTEXT_ID Id;
> +    PIRP PendingIrp;
> +    PXENIFACE_CONTEXT_ID ContextId;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN) &&
> OutLen != 0)
> +        goto fail1;
> +
> +    Id.Type = XENIFACE_CONTEXT_MAP;
> +    Id.Process = PsGetCurrentProcess();
> +    Id.RequestId = In->RequestId;
> +
> +    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process,
> Id.RequestId);
> +
> +    status = STATUS_NOT_FOUND;
> +    PendingIrp = IoCsqRemoveNextIrp(&Fdo->IrpQueue, &Id);
> +    if (PendingIrp == NULL)
> +        goto fail2;
> +
> +    ContextId = PendingIrp->Tail.Overlay.DriverContext[0];
> +    Context = CONTAINING_RECORD(ContextId, XENIFACE_MAP_CONTEXT,
> Id);
> +    GnttabFreeMap(Fdo, Context);
> +
> +    PendingIrp->IoStatus.Status = STATUS_SUCCESS;
> +    PendingIrp->IoStatus.Information = 0;
> +    IoCompleteRequest(PendingIrp, IO_NO_INCREMENT);
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> diff --git a/src/xeniface/ioctl_store.c b/src/xeniface/ioctl_store.c
> new file mode 100644
> index 0000000..181c706
> --- /dev/null
> +++ b/src/xeniface/ioctl_store.c
> @@ -0,0 +1,574 @@
> +/* 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 "driver.h"
> +#include "ioctls.h"
> +#include "..\..\include\xeniface_ioctls.h"
> +#include "log.h"
> +
> +#define XENSTORE_ABS_PATH_MAX 3072
> +#define XENSTORE_REL_PATH_MAX 2048
> +
> +static
> +NTSTATUS
> +__CaptureUserBuffer(
> +    __in  PVOID Buffer,
> +    __in  ULONG Length,
> +    __out PVOID *CapturedBuffer
> +    )
> +{
> +    NTSTATUS Status;
> +    PVOID TempBuffer = NULL;
> +
> +    if (Length == 0) {
> +        *CapturedBuffer = NULL;
> +        return STATUS_SUCCESS;
> +    }
> +
> +    Status = STATUS_NO_MEMORY;
> +    TempBuffer = ExAllocatePoolWithTag(NonPagedPool, Length,
> XENIFACE_POOL_TAG);
> +    if (TempBuffer == NULL)
> +        return STATUS_INSUFFICIENT_RESOURCES;
> +
> +    Status = STATUS_SUCCESS;
> +
> +#pragma prefast(suppress: 6320) // we want to catch all exceptions
> +    try {
> +        ProbeForRead(Buffer, Length, 1);
> +        RtlCopyMemory(TempBuffer, Buffer, Length);
> +    } except(EXCEPTION_EXECUTE_HANDLER) {
> +        XenIfaceDebugPrint(ERROR, "Exception while probing/reading buffer at
> %p, size 0x%lx\n", Buffer, Length);
> +        ExFreePoolWithTag(TempBuffer, XENIFACE_POOL_TAG);
> +        TempBuffer = NULL;
> +        Status = GetExceptionCode();
> +    }
> +
> +    *CapturedBuffer = TempBuffer;
> +
> +    return Status;
> + }
> +
> +static
> +VOID
> +__FreeCapturedBuffer(
> +    __in  PVOID CapturedBuffer
> +    )
> +{
> +    if (CapturedBuffer != NULL) {
> +        ExFreePoolWithTag(CapturedBuffer, XENIFACE_POOL_TAG);
> +    }
> +}
> +
> +static FORCEINLINE
> +BOOLEAN
> +__IsValidStr(
> +    __in  PCHAR             Str,
> +    __in  ULONG             Len
> +    )
> +{
> +    for ( ; Len--; ++Str) {
> +        if (*Str == '\0')
> +            return TRUE;
> +        if (!isprint((unsigned char)*Str))
> +            break;
> +    }
> +    return FALSE;
> +}
> +
> +static FORCEINLINE
> +ULONG
> +__MultiSzLen(
> +    __in  PCHAR             Str,
> +    __out PULONG            Count
> +    )
> +{
> +    ULONG Length = 0;
> +    if (Count)  *Count = 0;
> +    do {
> +        for ( ; *Str; ++Str, ++Length) ;
> +        ++Str; ++Length;
> +        if (*Count) ++(*Count);
> +    } while (*Str);
> +    return Length;
> +}
> +
> +static FORCEINLINE
> +VOID
> +__DisplayMultiSz(
> +    __in PCHAR              Caller,
> +    __in PCHAR              Str
> +    )
> +{
> +    PCHAR   Ptr;
> +    ULONG   Idx;
> +    ULONG   Len;
> +
> +    for (Ptr = Str, Idx = 0; *Ptr; ++Idx) {
> +        Len = (ULONG)strlen(Ptr);
> +        XenIfaceDebugPrint(TRACE, "|%s: [%d]=(%d)->\"%s\"\n", Caller, Idx,
> Len, Ptr);
> +        Ptr += (Len + 1);
> +    }
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRead(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS    status;
> +    PCHAR       Value;
> +    ULONG       Length;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen == 0)
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (!__IsValidStr(Buffer, InLen))
> +        goto fail2;
> +
> +    status = XENBUS_STORE(Read, &Fdo->StoreInterface, NULL, NULL,
> Buffer, &Value);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    Length = (ULONG)strlen(Value) + 1;
> +
> +    status = STATUS_BUFFER_OVERFLOW;
> +    if (OutLen == 0) {
> +        XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)\n", Buffer, Length);
> +        goto done;
> +    }
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (OutLen < Length)
> +        goto fail4;
> +
> +    XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)->\"%s\"\n", Buffer, Length,
> Value);
> +
> +    RtlCopyMemory(Buffer, Value, Length);
> +    Buffer[Length - 1] = 0;
> +    status = STATUS_SUCCESS;
> +
> +done:
> +    *Info = (ULONG_PTR)Length;
> +    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> +    return status;
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")=(%d < %d)\n", Buffer,
> OutLen, Length);
> +    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreWrite(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    )
> +{
> +    NTSTATUS    status;
> +    PCHAR       Value;
> +    ULONG       Length;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen == 0 || OutLen != 0)
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (!__IsValidStr(Buffer, InLen))
> +        goto fail2;
> +
> +    Length = (ULONG)strlen(Buffer) + 1;
> +    Value = Buffer + Length;
> +
> +    if (!__IsValidStr(Value, InLen - Length))
> +        goto fail3;
> +
> +    status = XENBUS_STORE(Printf, &Fdo->StoreInterface, NULL, NULL,
> Buffer, Value);
> +    if (!NT_SUCCESS(status))
> +        goto fail4;
> +
> +    XenIfaceDebugPrint(TRACE, "(\"%s\"=\"%s\")\n", Buffer, Value);
> +    return status;
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")\n", Value);
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreDirectory(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS    status;
> +    PCHAR       Value;
> +    ULONG       Length;
> +    ULONG       Count;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen == 0)
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (!__IsValidStr(Buffer, InLen))
> +        goto fail2;
> +
> +    status = XENBUS_STORE(Directory, &Fdo->StoreInterface, NULL, NULL,
> Buffer, &Value);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    Length = __MultiSzLen(Value, &Count) + 1;
> +
> +    status = STATUS_BUFFER_OVERFLOW;
> +    if (OutLen == 0) {
> +        XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)(%d)\n", Buffer, Length,
> Count);
> +        goto done;
> +    }
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (OutLen < Length)
> +        goto fail4;
> +
> +    XenIfaceDebugPrint(INFO, "(\"%s\")=(%d)(%d)\n", Buffer, Length,
> Count);
> +#if DBG
> +    __DisplayMultiSz(__FUNCTION__, Value);
> +#endif
> +
> +    RtlCopyMemory(Buffer, Value, Length);
> +    Buffer[Length - 2] = 0;
> +    Buffer[Length - 1] = 0;
> +    status = STATUS_SUCCESS;
> +
> +done:
> +    *Info = (ULONG_PTR)Length;
> +    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> +    return status;
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")=(%d < %d)\n", Buffer,
> OutLen, Length);
> +    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRemove(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    )
> +{
> +    NTSTATUS    status;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen == 0 || OutLen != 0)
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (!__IsValidStr(Buffer, InLen))
> +        goto fail2;
> +
> +    status = XENBUS_STORE(Remove, &Fdo->StoreInterface, NULL, NULL,
> Buffer);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    XenIfaceDebugPrint(TRACE, "(\"%s\")\n", Buffer);
> +    return status;
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreSetPermissions(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_STORE_SET_PERMISSIONS_IN In = Buffer;
> +    ULONG Index;
> +    PCHAR Path;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen < sizeof(XENIFACE_STORE_SET_PERMISSIONS_IN) || OutLen !=
> 0)
> +        goto fail1;
> +
> +    if (InLen < sizeof(XENIFACE_STORE_SET_PERMISSIONS_IN) + In-
> >NumberPermissions * sizeof(XENBUS_STORE_PERMISSION))
> +        goto fail2;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (In->PathLength == 0 || In->PathLength > XENSTORE_ABS_PATH_MAX)
> +        goto fail3;
> +
> +    status = __CaptureUserBuffer(In->Path, In->PathLength, &Path);
> +    if (!NT_SUCCESS(status))
> +        goto fail4;
> +
> +    Path[In->PathLength - 1] = 0;
> +    XenIfaceDebugPrint(TRACE, "> Path '%s', NumberPermissions %lu\n",
> Path, In->NumberPermissions);
> +
> +    for (Index = 0; Index < In->NumberPermissions; Index++) {
> +        XenIfaceDebugPrint(TRACE, "> %lu: Domain %d, Mask 0x%x\n", Index,
> In->Permissions[Index].Domain, In->Permissions[Index].Mask);
> +        if ((In->Permissions[Index].Mask &
> ~XENIFACE_STORE_ALLOWED_PERMISSIONS) != 0)
> +            goto fail5;
> +    }
> +
> +    status = XENBUS_STORE(PermissionsSet,
> +                          &Fdo->StoreInterface,
> +                          NULL, // transaction
> +                          NULL, // prefix
> +                          Path,
> +                          In->Permissions,
> +                          In->NumberPermissions);
> +
> +    if (!NT_SUCCESS(status))
> +        goto fail6;
> +
> +    __FreeCapturedBuffer(Path);
> +    return status;
> +
> +fail6:
> +    XenIfaceDebugPrint(ERROR, "Fail6\n");
> +fail5:
> +    XenIfaceDebugPrint(ERROR, "Fail5\n");
> +    __FreeCapturedBuffer(Path);
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreAddWatch(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_STORE_ADD_WATCH_IN In = Buffer;
> +    PXENIFACE_STORE_ADD_WATCH_OUT Out = Buffer;
> +    PCHAR Path;
> +    PXENIFACE_STORE_CONTEXT Context;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_STORE_ADD_WATCH_IN) || OutLen !=
> sizeof(XENIFACE_STORE_ADD_WATCH_OUT))
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (In->PathLength == 0 || In->PathLength > XENSTORE_ABS_PATH_MAX)
> +        goto fail2;
> +
> +    status = __CaptureUserBuffer(In->Path, In->PathLength, &Path);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    Path[In->PathLength - 1] = 0;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context = ExAllocatePoolWithTag(NonPagedPool,
> sizeof(XENIFACE_STORE_CONTEXT), XENIFACE_POOL_TAG);
> +    if (Context == NULL)
> +        goto fail4;
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
> +
> +    Context->FileObject = FileObject;
> +
> +    status = ObReferenceObjectByHandle(In->Event,
> EVENT_MODIFY_STATE, *ExEventObjectType, UserMode, &Context->Event,
> NULL);
> +    if (!NT_SUCCESS(status))
> +        goto fail5;
> +
> +    XenIfaceDebugPrint(TRACE, "> Path '%s', Event %p, FO %p\n", Path, In-
> >Event, FileObject);
> +
> +    status = XENBUS_STORE(WatchAdd,
> +                          &Fdo->StoreInterface,
> +                          NULL, // prefix
> +                          Path,
> +                          Context->Event,
> +                          &Context->Watch);
> +
> +    if (!NT_SUCCESS(status))
> +        goto fail6;
> +
> +    __FreeCapturedBuffer(Path);
> +
> +    ExInterlockedInsertTailList(&Fdo->StoreWatchList, &Context->Entry,
> &Fdo->StoreWatchLock);
> +
> +    XenIfaceDebugPrint(TRACE, "< Context %p, Watch %p\n", Context,
> Context->Watch);
> +
> +    Out->Context = Context;
> +    *Info = sizeof(XENIFACE_STORE_ADD_WATCH_OUT);
> +
> +    return status;
> +
> +fail6:
> +    XenIfaceDebugPrint(ERROR, "Fail6\n");
> +    ObDereferenceObject(Context->Event);
> +fail5:
> +    XenIfaceDebugPrint(ERROR, "Fail5\n");
> +    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +    __FreeCapturedBuffer(Path);
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +VOID
> +StoreFreeWatch(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_STORE_CONTEXT Context
> +    )
> +{
> +    NTSTATUS status;
> +
> +    XenIfaceDebugPrint(TRACE, "Context %p, Watch %p, FO %p\n",
> +                       Context, Context->Watch, Context->FileObject);
> +
> +    status = XENBUS_STORE(WatchRemove,
> +                          &Fdo->StoreInterface,
> +                          Context->Watch);
> +
> +    ASSERT(NT_SUCCESS(status)); // this is fatal since we'd leave an active
> watch without cleaning it up
> +
> +    ObDereferenceObject(Context->Event);
> +    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRemoveWatch(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_STORE_REMOVE_WATCH_IN In = Buffer;
> +    PXENIFACE_STORE_CONTEXT Context = NULL;
> +    KIRQL Irql;
> +    PLIST_ENTRY Node;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_STORE_REMOVE_WATCH_IN) || OutLen !=
> 0)
> +        goto fail1;
> +
> +    XenIfaceDebugPrint(TRACE, "> Context %p, FO %p\n", In->Context,
> FileObject);
> +
> +    KeAcquireSpinLock(&Fdo->StoreWatchLock, &Irql);
> +    Node = Fdo->StoreWatchList.Flink;
> +    while (Node->Flink != Fdo->StoreWatchList.Flink) {
> +        Context = CONTAINING_RECORD(Node, XENIFACE_STORE_CONTEXT,
> Entry);
> +
> +        Node = Node->Flink;
> +        if (Context != In->Context || Context->FileObject != FileObject)
> +            continue;
> +
> +        RemoveEntryList(&Context->Entry);
> +        break;
> +    }
> +    KeReleaseSpinLock(&Fdo->StoreWatchLock, Irql);
> +
> +    status = STATUS_NOT_FOUND;
> +    if (Context == NULL || Context != In->Context)
> +        goto fail2;
> +
> +    StoreFreeWatch(Fdo, Context);
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> diff --git a/src/xeniface/ioctls.c b/src/xeniface/ioctls.c
> index 3bef9ea..e20b7dc 100644
> --- a/src/xeniface/ioctls.c
> +++ b/src/xeniface/ioctls.c
> @@ -35,287 +35,156 @@
>  #include "..\..\include\xeniface_ioctls.h"
>  #include "log.h"
> 
> -static FORCEINLINE BOOLEAN
> -__IsValidStr(
> -    __in  PCHAR             Str,
> -    __in  ULONG             Len
> -    )
> -{
> -    for ( ; Len--; ++Str) {
> -        if (*Str == '\0')
> -            return TRUE;
> -        if (!isprint((unsigned char)*Str))
> -            break;
> -    }
> -    return FALSE;
> -}
> -static FORCEINLINE ULONG
> -__MultiSzLen(
> -    __in  PCHAR             Str,
> -    __out PULONG            Count
> -    )
> -{
> -    ULONG Length = 0;
> -    if (Count)  *Count = 0;
> -    do {
> -        for ( ; *Str; ++Str, ++Length) ;
> -        ++Str; ++Length;
> -        if (*Count) ++(*Count);
> -    } while (*Str);
> -    return Length;
> -}
> -static FORCEINLINE VOID
> -__DisplayMultiSz(
> -    __in PCHAR              Caller,
> -    __in PCHAR              Str
> -    )
> -{
> -    PCHAR   Ptr;
> -    ULONG   Idx;
> -    ULONG   Len;
> -
> -    for (Ptr = Str, Idx = 0; *Ptr; ++Idx) {
> -        Len = (ULONG)strlen(Ptr);
> -        XenIfaceDebugPrint(INFO, "|%s: [%d]=(%d)->\"%s\"\n", Caller, Idx,
> Len, Ptr);
> -        Ptr += (Len + 1);
> -    }
> -}
> -
> -
> -static DECLSPEC_NOINLINE NTSTATUS
> -IoctlRead(
> +// Cleanup store watches and event channels, called on file object close.
> +_IRQL_requires_(PASSIVE_LEVEL) // EvtchnFree calls KeFlushQueuedDpcs
> +VOID
> +XenIfaceCleanup(
>      __in  PXENIFACE_FDO         Fdo,
> -    __in  PCHAR             Buffer,
> -    __in  ULONG             InLen,
> -    __in  ULONG             OutLen,
> -    __out PULONG_PTR        Info
> +    __in  PFILE_OBJECT  FileObject
>      )
>  {
> -    NTSTATUS    status;
> -    PCHAR       Value;
> -    ULONG       Length;
> -
> -    status = STATUS_INVALID_BUFFER_SIZE;
> -    if (InLen == 0)
> -        goto fail1;
> -
> -    status = STATUS_INVALID_PARAMETER;
> -    if (!__IsValidStr(Buffer, InLen))
> -        goto fail2;
> -
> -    status = XENBUS_STORE(Read, &Fdo->StoreInterface, NULL, NULL,
> Buffer, &Value);
> -    if (!NT_SUCCESS(status))
> -        goto fail3;
> -
> -    Length = (ULONG)strlen(Value) + 1;
> -
> -    status = STATUS_BUFFER_OVERFLOW;
> -    if (OutLen == 0) {
> -        XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)\n", __FUNCTION__,
> Buffer, Length);
> -        goto done;
> +    PLIST_ENTRY Node;
> +    PXENIFACE_STORE_CONTEXT StoreContext;
> +    PXENIFACE_EVTCHN_CONTEXT EvtchnContext;
> +    KIRQL Irql;
> +    LIST_ENTRY ToFree;
> +
> +    XenIfaceDebugPrint(TRACE, "FO %p, IRQL %d, Cpu %lu\n", FileObject,
> KeGetCurrentIrql(), KeGetCurrentProcessorNumber());
> +
> +    // store watches
> +    KeAcquireSpinLock(&Fdo->StoreWatchLock, &Irql);
> +    Node = Fdo->StoreWatchList.Flink;
> +    while (Node->Flink != Fdo->StoreWatchList.Flink) {
> +        StoreContext = CONTAINING_RECORD(Node,
> XENIFACE_STORE_CONTEXT, Entry);
> +
> +        Node = Node->Flink;
> +        if (StoreContext->FileObject != FileObject)
> +            continue;
> +
> +        XenIfaceDebugPrint(TRACE, "Store context %p\n", StoreContext);
> +        RemoveEntryList(&StoreContext->Entry);
> +        StoreFreeWatch(Fdo, StoreContext);
>      }
> +    KeReleaseSpinLock(&Fdo->StoreWatchLock, Irql);
> 
> -    status = STATUS_INVALID_PARAMETER;
> -    if (OutLen < Length)
> -        goto fail4;
> -
> -    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)->\"%s\"\n",
> __FUNCTION__, Buffer, Length, Value);
> -
> -    RtlCopyMemory(Buffer, Value, Length);
> -    Buffer[Length - 1] = 0;
> -    status = STATUS_SUCCESS;
> +    // event channels
> +    InitializeListHead(&ToFree);
> +    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
> +    Node = Fdo->EvtchnList.Flink;
> +    while (Node->Flink != Fdo->EvtchnList.Flink) {
> +        EvtchnContext = CONTAINING_RECORD(Node,
> XENIFACE_EVTCHN_CONTEXT, Entry);
> +
> +        Node = Node->Flink;
> +        if (EvtchnContext->FileObject != FileObject)
> +            continue;
> +
> +        XenIfaceDebugPrint(TRACE, "Evtchn context %p\n", EvtchnContext);
> +        RemoveEntryList(&EvtchnContext->Entry);
> +        // EvtchnFree requires PASSIVE_LEVEL and we're inside a lock
> +        InsertTailList(&ToFree, &EvtchnContext->Entry);
> +    }
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> 
> -done:
> -    *Info = (ULONG_PTR)Length;
> -    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> -    return status;
> +    Node = ToFree.Flink;
> +    while (Node->Flink != ToFree.Flink) {
> +        EvtchnContext = CONTAINING_RECORD(Node,
> XENIFACE_EVTCHN_CONTEXT, Entry);
> +        Node = Node->Flink;
> 
> -fail4:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")=(%d < %d)\n",
> __FUNCTION__, Buffer, OutLen, Length);
> -    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> -fail3:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__,
> Buffer);
> -fail2:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
> -fail1:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__,
> status);
> -    return status;
> +        RemoveEntryList(&EvtchnContext->Entry);
> +        EvtchnFree(Fdo, EvtchnContext);
>  }
> -
> -static DECLSPEC_NOINLINE NTSTATUS
> -IoctlWrite(
> -    __in  PXENIFACE_FDO         Fdo,
> -    __in  PCHAR             Buffer,
> -    __in  ULONG             InLen,
> -    __in  ULONG             OutLen
> -    )
> -{
> -    NTSTATUS    status;
> -    PCHAR       Value;
> -    ULONG       Length;
> -
> -    status = STATUS_INVALID_BUFFER_SIZE;
> -    if (InLen == 0 || OutLen != 0)
> -        goto fail1;
> -
> -    status = STATUS_INVALID_PARAMETER;
> -    if (!__IsValidStr(Buffer, InLen))
> -        goto fail2;
> -
> -    Length = (ULONG)strlen(Buffer) + 1;
> -    Value = Buffer + Length;
> -
> -    if (!__IsValidStr(Value, InLen - Length))
> -        goto fail3;
> -
> -    status = XENBUS_STORE(Printf, &Fdo->StoreInterface, NULL, NULL,
> Buffer, Value);
> -    if (!NT_SUCCESS(status))
> -        goto fail4;
> -
> -    XenIfaceDebugPrint(INFO, "|%s: (\"%s\"=\"%s\")\n", __FUNCTION__,
> Buffer, Value);
> -    return status;
> -
> -fail4:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")\n", __FUNCTION__,
> Value);
> -fail3:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__,
> Buffer);
> -fail2:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
> -fail1:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__,
> status);
> -    return status;
>  }
> 
> -static DECLSPEC_NOINLINE NTSTATUS
> -IoctlDirectory(
> +NTSTATUS
> +XenIfaceIoctl(
>      __in  PXENIFACE_FDO         Fdo,
> -    __in  PCHAR             Buffer,
> -    __in  ULONG             InLen,
> -    __in  ULONG             OutLen,
> -    __out PULONG_PTR        Info
> +    __inout  PIRP              Irp
>      )
>  {
>      NTSTATUS    status;
> -    PCHAR       Value;
> -    ULONG       Length;
> -    ULONG       Count;
> -
> -    status = STATUS_INVALID_BUFFER_SIZE;
> -    if (InLen == 0)
> -        goto fail1;
> -
> -    status = STATUS_INVALID_PARAMETER;
> -    if (!__IsValidStr(Buffer, InLen))
> -        goto fail2;
> -
> -    status = XENBUS_STORE(Directory, &Fdo->StoreInterface, NULL, NULL,
> Buffer, &Value);
> -    if (!NT_SUCCESS(status))
> -        goto fail3;
> -
> -    Length = __MultiSzLen(Value, &Count) + 1;
> +    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
> +    PVOID               Buffer = Irp->AssociatedIrp.SystemBuffer;
> +    ULONG               InLen = Stack-
> >Parameters.DeviceIoControl.InputBufferLength;
> +    ULONG               OutLen = Stack-
> >Parameters.DeviceIoControl.OutputBufferLength;
> 
> -    status = STATUS_BUFFER_OVERFLOW;
> -    if (OutLen == 0) {
> -        XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)(%d)\n",
> __FUNCTION__, Buffer, Length, Count);
> +    status = STATUS_DEVICE_NOT_READY;
> +    if (Fdo->InterfacesAcquired == FALSE)
>          goto done;
> -    }
> 
> -    status = STATUS_INVALID_PARAMETER;
> -    if (OutLen < Length)
> -        goto fail4;
> +    switch (Stack->Parameters.DeviceIoControl.IoControlCode) {
> +        // store
> +    case IOCTL_XENIFACE_STORE_READ:
> +        status = IoctlStoreRead(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp-
> >IoStatus.Information);
> +        break;
> 
> -    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)(%d)\n", __FUNCTION__,
> Buffer, Length, Count);
> -#if DBG
> -    __DisplayMultiSz(__FUNCTION__, Value);
> -#endif
> +    case IOCTL_XENIFACE_STORE_WRITE:
> +        status = IoctlStoreWrite(Fdo, (PCHAR)Buffer, InLen, OutLen);
> +        break;
> 
> -    RtlCopyMemory(Buffer, Value, Length);
> -    Buffer[Length - 2] = 0;
> -    Buffer[Length - 1] = 0;
> -    status = STATUS_SUCCESS;
> +    case IOCTL_XENIFACE_STORE_DIRECTORY:
> +        status = IoctlStoreDirectory(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp-
> >IoStatus.Information);
> +        break;
> 
> -done:
> -    *Info = (ULONG_PTR)Length;
> -    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> -    return status;
> +    case IOCTL_XENIFACE_STORE_REMOVE:
> +        status = IoctlStoreRemove(Fdo, (PCHAR)Buffer, InLen, OutLen);
> +        break;
> 
> -fail4:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")=(%d < %d)\n",
> __FUNCTION__, Buffer, OutLen, Length);
> -    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> -fail3:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__,
> Buffer);
> -fail2:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
> -fail1:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__,
> status);
> -    return status;
> -}
> +    case IOCTL_XENIFACE_STORE_SET_PERMISSIONS:
> +        status = IoctlStoreSetPermissions(Fdo, Buffer, InLen, OutLen);
> +        break;
> 
> -static DECLSPEC_NOINLINE NTSTATUS
> -IoctlRemove(
> -    __in  PXENIFACE_FDO         Fdo,
> -    __in  PCHAR             Buffer,
> -    __in  ULONG             InLen,
> -    __in  ULONG             OutLen
> -    )
> -{
> -    NTSTATUS    status;
> +    case IOCTL_XENIFACE_STORE_ADD_WATCH:
> +        status = IoctlStoreAddWatch(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject, &Irp->IoStatus.Information);
> +        break;
> 
> -    status = STATUS_INVALID_BUFFER_SIZE;
> -    if (InLen == 0 || OutLen != 0)
> -        goto fail1;
> +    case IOCTL_XENIFACE_STORE_REMOVE_WATCH:
> +        status = IoctlStoreRemoveWatch(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject);
> +        break;
> 
> -    status = STATUS_INVALID_PARAMETER;
> -    if (!__IsValidStr(Buffer, InLen))
> -        goto fail2;
> +        // evtchn
> +    case IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND:
> +        status = IoctlEvtchnBindUnbound(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject, &Irp->IoStatus.Information);
> +        break;
> 
> -    status = XENBUS_STORE(Remove, &Fdo->StoreInterface, NULL, NULL,
> Buffer);
> -    if (!NT_SUCCESS(status))
> -        goto fail3;
> +    case IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN:
> +        status = IoctlEvtchnBindInterdomain(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject, &Irp->IoStatus.Information);
> +        break;
> 
> -    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")\n", __FUNCTION__, Buffer);
> -    return status;
> +    case IOCTL_XENIFACE_EVTCHN_CLOSE:
> +        status = IoctlEvtchnClose(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject);
> +        break;
> 
> -fail3:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__,
> Buffer);
> -fail2:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
> -fail1:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__,
> status);
> -    return status;
> -}
> +    case IOCTL_XENIFACE_EVTCHN_NOTIFY:
> +        status = IoctlEvtchnNotify(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject);
> +        break;
> 
> -NTSTATUS
> -XenIFaceIoctl(
> -    __in  PXENIFACE_FDO         Fdo,
> -    __in  PIRP              Irp
> -    )
> -{
> -    NTSTATUS            status;
> -    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
> -    PVOID               Buffer = Irp->AssociatedIrp.SystemBuffer;
> -    ULONG               InLen = Stack-
> >Parameters.DeviceIoControl.InputBufferLength;
> -    ULONG               OutLen = Stack-
> >Parameters.DeviceIoControl.OutputBufferLength;
> +    case IOCTL_XENIFACE_EVTCHN_UNMASK:
> +        status = IoctlEvtchnUnmask(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject);
> +        break;
> 
> -    status = STATUS_DEVICE_NOT_READY;
> -    if (Fdo->InterfacesAcquired == FALSE)
> -        goto done;
> +        // gnttab
> +    case IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS:
> +        status = IoctlGnttabPermitForeignAccess(Fdo, Buffer, InLen, OutLen,
> Irp);
> +        break;
> 
> -    switch (Stack->Parameters.DeviceIoControl.IoControlCode) {
> -    case IOCTL_XENIFACE_STORE_READ:
> -        status = IoctlRead(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp-
> >IoStatus.Information);
> +    case IOCTL_XENIFACE_GNTTAB_GET_GRANT_RESULT:
> +        status = IoctlGnttabGetGrantResult(Fdo, Buffer, InLen, OutLen, &Irp-
> >IoStatus.Information);
>          break;
> 
> -    case IOCTL_XENIFACE_STORE_WRITE:
> -        status = IoctlWrite(Fdo, (PCHAR)Buffer, InLen, OutLen);
> +    case IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS:
> +        status = IoctlGnttabRevokeForeignAccess(Fdo, Buffer, InLen, OutLen);
>          break;
> 
> -    case IOCTL_XENIFACE_STORE_DIRECTORY:
> -        status = IoctlDirectory(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp-
> >IoStatus.Information);
> +    case IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES:
> +        status = IoctlGnttabMapForeignPages(Fdo, Buffer, InLen, OutLen, Irp);
>          break;
> 
> -    case IOCTL_XENIFACE_STORE_REMOVE:
> -        status = IoctlRemove(Fdo, (PCHAR)Buffer, InLen, OutLen);
> +    case IOCTL_XENIFACE_GNTTAB_GET_MAP_RESULT:
> +        status = IoctlGnttabGetMapResult(Fdo, Buffer, InLen, OutLen, &Irp-
> >IoStatus.Information);
> +        break;
> +
> +    case IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES:
> +        status = IoctlGnttabUnmapForeignPages(Fdo, Buffer, InLen, OutLen);
>          break;
> 
>      default:
> @@ -327,6 +196,7 @@ done:
> 
>  	Irp->IoStatus.Status = status;
> 
> +    if (status != STATUS_PENDING)
>  	IoCompleteRequest(Irp, IO_NO_INCREMENT);
> 
>      return status;
> diff --git a/src/xeniface/ioctls.h b/src/xeniface/ioctls.h
> index 7ee7801..00e11e4 100644
> --- a/src/xeniface/ioctls.h
> +++ b/src/xeniface/ioctls.h
> @@ -33,11 +33,322 @@
>  #define _IOCTLS_H_
> 
>  #define XENIFACE_KERNEL_MODE
> +#include "xeniface_ioctls.h"
> 
> +typedef enum _XENIFACE_CONTEXT_TYPE {
> +    XENIFACE_CONTEXT_GRANT = 1,
> +    XENIFACE_CONTEXT_MAP
> +} XENIFACE_CONTEXT_TYPE;
> +
> +typedef struct _XENIFACE_CONTEXT_ID {
> +    XENIFACE_CONTEXT_TYPE  Type;
> +    ULONG                  RequestId;
> +    PEPROCESS              Process;
> +} XENIFACE_CONTEXT_ID, *PXENIFACE_CONTEXT_ID;
> +
> +typedef struct _XENIFACE_STORE_CONTEXT {
> +    LIST_ENTRY             Entry;
> +    PXENBUS_STORE_WATCH    Watch;
> +    PKEVENT                Event;
> +    PVOID                  FileObject;
> +} XENIFACE_STORE_CONTEXT, *PXENIFACE_STORE_CONTEXT;
> +
> +typedef struct _XENIFACE_EVTCHN_CONTEXT {
> +    LIST_ENTRY             Entry;
> +    PXENBUS_EVTCHN_CHANNEL Channel;
> +    ULONG                  LocalPort;
> +    PKEVENT                Event;
> +    PXENIFACE_FDO          Fdo;
> +    BOOLEAN                Active;
> +    PVOID                  FileObject;
> +} XENIFACE_EVTCHN_CONTEXT, *PXENIFACE_EVTCHN_CONTEXT;
> +
> +typedef struct _XENIFACE_GRANT_CONTEXT {
> +    XENIFACE_CONTEXT_ID        Id;
> +    LIST_ENTRY                 Entry;
> +    PXENBUS_GNTTAB_ENTRY       *Grants;
> +    USHORT                     RemoteDomain;
> +    ULONG                      NumberPages;
> +    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
> +    ULONG                      NotifyOffset;
> +    ULONG                      NotifyPort;
> +    PVOID                      KernelVa;
> +    PVOID                      UserVa;
> +    PMDL                       Mdl;
> +} XENIFACE_GRANT_CONTEXT, *PXENIFACE_GRANT_CONTEXT;
> +
> +typedef struct _XENIFACE_MAP_CONTEXT {
> +    XENIFACE_CONTEXT_ID        Id;
> +    LIST_ENTRY                 Entry;
> +    USHORT                     RemoteDomain;
> +    ULONG                      NumberPages;
> +    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
> +    ULONG                      NotifyOffset;
> +    ULONG                      NotifyPort;
> +    PHYSICAL_ADDRESS           Address;
> +    PVOID                      KernelVa;
> +    PVOID                      UserVa;
> +    PMDL                       Mdl;
> +} XENIFACE_MAP_CONTEXT, *PXENIFACE_MAP_CONTEXT;
> +
> +NTSTATUS
> +XenIfaceIoctl(
> +    __in     PXENIFACE_FDO     Fdo,
> +    __inout  PIRP              Irp
> +    );
> +
> +_IRQL_requires_(PASSIVE_LEVEL)
> +VOID
> +XenIfaceCleanup(
> +    __in  PXENIFACE_FDO Fdo,
> +    __in  PFILE_OBJECT  FileObject
> +    );
> +
> +DECLSPEC_NOINLINE
>  NTSTATUS
> -XenIFaceIoctl(
> +IoctlStoreRead(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreWrite(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreDirectory(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRemove(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreSetPermissions(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreAddWatch(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRemoveWatch(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    );
> +
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +VOID
> +StoreFreeWatch(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_STORE_CONTEXT Context
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnBindUnbound(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnBindInterdomain(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnClose(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnNotify(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnUnmask(
>      __in  PXENIFACE_FDO         Fdo,
> -    __in  PIRP              Irp
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    );
> +
> +_Requires_lock_not_held_(Fdo->EvtchnLock)
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +EvtchnNotify(
> +    __in      PXENIFACE_FDO Fdo,
> +    __in      ULONG         LocalPort,
> +    __in_opt  PFILE_OBJECT  FileObject
> +    );
> +
> +_Function_class_(KDEFERRED_ROUTINE)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +_IRQL_requires_same_
> +VOID
> +EvtchnNotificationDpc(
> +    __in      PKDPC Dpc,
> +    __in_opt  PVOID Context,
> +    __in_opt  PVOID Argument1,
> +    __in_opt  PVOID Argument2
> +    );
> +
> +_IRQL_requires_(PASSIVE_LEVEL)
> +VOID
> +EvtchnFree(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_EVTCHN_CONTEXT Context
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabPermitForeignAccess(
> +    __in     PXENIFACE_FDO  Fdo,
> +    __in     PVOID          Buffer,
> +    __in     ULONG          InLen,
> +    __in     ULONG          OutLen,
> +    __inout  PIRP           Irp
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabGetGrantResult(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabRevokeForeignAccess(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabMapForeignPages(
> +    __in     PXENIFACE_FDO     Fdo,
> +    __in     PVOID             Buffer,
> +    __in     ULONG             InLen,
> +    __in     ULONG             OutLen,
> +    __inout  PIRP              Irp
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabGetMapResult(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabUnmapForeignPages(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    );
> +
> +_Acquires_exclusive_lock_(((PXENIFACE_FDO)Argument)-
> >GnttabCacheLock)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +VOID
> +GnttabAcquireLock(
> +    __in  PVOID Argument
> +    );
> +
> +_Releases_exclusive_lock_(((PXENIFACE_FDO)Argument)-
> >GnttabCacheLock)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +VOID
> +GnttabReleaseLock(
> +    __in  PVOID Argument
> +    );
> +
> +_Function_class_(IO_WORKITEM_ROUTINE)
> +VOID
> +CompleteGnttabIrp(
> +    __in      PDEVICE_OBJECT DeviceObject,
> +    __in_opt  PVOID          Context
> +    );
> +
> +_IRQL_requires_max_(APC_LEVEL)
> +VOID
> +GnttabFreeGrant(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_GRANT_CONTEXT Context
> +    );
> +
> +_IRQL_requires_max_(APC_LEVEL)
> +VOID
> +GnttabFreeMap(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_MAP_CONTEXT Context
>      );
> 
>  #endif // _IOCTLS_H_
> diff --git a/src/xeniface/irp_queue.c b/src/xeniface/irp_queue.c
> new file mode 100644
> index 0000000..c3bf86c
> --- /dev/null
> +++ b/src/xeniface/irp_queue.c
> @@ -0,0 +1,131 @@
> +#include "driver.h"
> +#include "irp_queue.h"
> +#include "log.h"
> +#include "ioctls.h"
> +
> +// Cancel-safe IRP queue implementation
> +
> +NTSTATUS
> +CsqInsertIrpEx(
> +    _In_  PIO_CSQ Csq,
> +    _In_  PIRP    Irp,
> +    _In_  PVOID   InsertContext // PXENIFACE_CONTEXT_ID
> +    )
> +{
> +    PXENIFACE_FDO Fdo;
> +
> +    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
> +
> +    // Fail if a request with the same ID already exists.
> +    if (CsqPeekNextIrp(Csq, NULL, InsertContext) != NULL)
> +        return STATUS_INVALID_PARAMETER;
> +
> +    InsertTailList(&Fdo->IrpList, &Irp->Tail.Overlay.ListEntry);
> +    return STATUS_SUCCESS;
> +}
> +
> +VOID
> +CsqRemoveIrp(
> +    _In_  PIO_CSQ Csq,
> +    _In_  PIRP    Irp
> +    )
> +{
> +    UNREFERENCED_PARAMETER(Csq);
> +
> +    RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
> +}
> +
> +PIRP
> +CsqPeekNextIrp(
> +    _In_      PIO_CSQ Csq,
> +    _In_opt_  PIRP    Irp,
> +    _In_opt_  PVOID   PeekContext // PXENIFACE_CONTEXT_ID
> +    )
> +{
> +    PXENIFACE_FDO        Fdo;
> +    PIRP                 NextIrp = NULL;
> +    PLIST_ENTRY          Head, NextEntry;
> +    PXENIFACE_CONTEXT_ID Id, TargetId;
> +
> +    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
> +    TargetId = PeekContext;
> +    Head = &Fdo->IrpList;
> +
> +    // If the IRP is NULL, we will start peeking from the list head,
> +    // else we will start from that IRP onwards. This is done under the
> +    // assumption that new IRPs are always inserted at the tail.
> +
> +    if (Irp == NULL) {
> +        NextEntry = Head->Flink;
> +    } else {
> +        NextEntry = Irp->Tail.Overlay.ListEntry.Flink;
> +    }
> +
> +    while (NextEntry != Head) {
> +        NextIrp = CONTAINING_RECORD(NextEntry, IRP, Tail.Overlay.ListEntry);
> +
> +        if (PeekContext) {
> +            Id = NextIrp->Tail.Overlay.DriverContext[0];
> +            if (Id->RequestId == TargetId->RequestId && Id->Process ==
> TargetId->Process)
> +                break;
> +        } else {
> +            break;
> +        }
> +        NextIrp = NULL;
> +        NextEntry = NextEntry->Flink;
> +    }
> +
> +    return NextIrp;
> +}
> +
> +_IRQL_raises_(DISPATCH_LEVEL)
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +_Acquires_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)-
> >IrpQueueLock)
> +VOID
> +CsqAcquireLock(
> +    _In_                                       PIO_CSQ Csq,
> +    _Out_ _At_(*Irql, _Post_ _IRQL_saves_)     PKIRQL  Irql
> +    )
> +{
> +    PXENIFACE_FDO Fdo;
> +
> +    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
> +
> +    KeAcquireSpinLock(&Fdo->IrpQueueLock, Irql);
> +}
> +
> +_IRQL_requires_(DISPATCH_LEVEL)
> +_Releases_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)-
> >IrpQueueLock)
> +VOID
> +CsqReleaseLock(
> +    _In_                    PIO_CSQ Csq,
> +    _In_ _IRQL_restores_    KIRQL   Irql
> +    )
> +{
> +    PXENIFACE_FDO Fdo;
> +
> +    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
> +
> +    KeReleaseSpinLock(&Fdo->IrpQueueLock, Irql);
> +}
> +
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +VOID
> +CsqCompleteCanceledIrp(
> +    _In_  PIO_CSQ Csq,
> +    _In_  PIRP    Irp
> +    )
> +{
> +    PXENIFACE_FDO Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO,
> IrpQueue);
> +    PIO_WORKITEM WorkItem;
> +
> +    XenIfaceDebugPrint(TRACE, "Irp %p, IRQL %d\n",
> +                       Irp, KeGetCurrentIrql());
> +
> +    // This is not guaranteed to run at PASSIVE_LEVEL, so queue a work item
> +    // to perform actual cleanup/IRP completion.
> +
> +    WorkItem = IoAllocateWorkItem(Fdo->Dx->DeviceObject);
> +    Irp->Tail.Overlay.DriverContext[1] = WorkItem; // store so the work item
> can free it
> +    IoQueueWorkItem(WorkItem, CompleteGnttabIrp, DelayedWorkQueue,
> Irp);
> +}
> diff --git a/src/xeniface/irp_queue.h b/src/xeniface/irp_queue.h
> new file mode 100644
> index 0000000..746ee19
> --- /dev/null
> +++ b/src/xeniface/irp_queue.h
> @@ -0,0 +1,50 @@
> +#ifndef _IRP_QUEUE_H_
> +#define _IRP_QUEUE_H_
> +
> +#include <ntddk.h>
> +
> +NTSTATUS
> +CsqInsertIrpEx(
> +    _In_  PIO_CSQ Csq,
> +    _In_  PIRP    Irp,
> +    _In_  PVOID   InsertContext
> +    );
> +
> +VOID
> +CsqRemoveIrp(
> +    _In_  PIO_CSQ Csq,
> +    _In_  PIRP    Irp
> +    );
> +
> +PIRP
> +CsqPeekNextIrp(
> +    _In_      PIO_CSQ Csq,
> +    _In_opt_  PIRP    Irp,
> +    _In_opt_  PVOID   PeekContext // PXENIFACE_CONTEXT_ID
> +    );
> +
> +_IRQL_raises_(DISPATCH_LEVEL)
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +_Acquires_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)-
> >IrpQueueLock)
> +VOID
> +CsqAcquireLock(
> +    _In_                                       PIO_CSQ Csq,
> +    _Out_ _At_(*Irql, _Post_ _IRQL_saves_)     PKIRQL  Irql
> +    );
> +
> +_IRQL_requires_(DISPATCH_LEVEL)
> +_Releases_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)-
> >IrpQueueLock)
> +VOID
> +CsqReleaseLock(
> +    _In_                    PIO_CSQ Csq,
> +    _In_ _IRQL_restores_    KIRQL   Irql
> +    );
> +
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +VOID
> +CsqCompleteCanceledIrp(
> +    _In_  PIO_CSQ             Csq,
> +    _In_  PIRP                Irp
> +    );
> +
> +#endif
> diff --git a/vs2013/xeniface/xeniface.vcxproj
> b/vs2013/xeniface/xeniface.vcxproj
> index fea2ad1..14f1338 100644
> --- a/vs2013/xeniface/xeniface.vcxproj
> +++ b/vs2013/xeniface/xeniface.vcxproj
> @@ -131,6 +131,10 @@
>      <ClCompile Include="../../src/xeniface/fdo.c" />
>      <ClCompile Include="../../src/xeniface/registry.c" />
>      <ClCompile Include="../../src\xeniface/thread.c" />
> +    <ClCompile Include="..\..\src\xeniface\ioctl_evtchn.c" />
> +    <ClCompile Include="..\..\src\xeniface\ioctl_gnttab.c" />
> +    <ClCompile Include="..\..\src\xeniface\ioctl_store.c" />
> +    <ClCompile Include="..\..\src\xeniface\irp_queue.c" />
>    </ItemGroup>
>    <ItemGroup>
>      <Mofcomp Include="../../src/xeniface/wmi.mof">
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Oct 14 10:36:13 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 14 Oct 2015 10:36: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 1ZmJPm-0005uT-TD; Wed, 14 Oct 2015 10:36:10 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72274ee0c=Paul.Durrant@citrix.com>)
	id 1ZmJPk-0005uJ-Vl
	for win-pv-devel@lists.xenproject.org; Wed, 14 Oct 2015 10:36:09 +0000
Received: from [85.158.137.68] by server-4.bemta-3.messagelabs.com id
	6C/6A-09570-2103E165; Wed, 14 Oct 2015 10:36:02 +0000
X-Env-Sender: prvs=72274ee0c=Paul.Durrant@citrix.com
X-Msg-Ref: server-12.tower-31.messagelabs.com!1444818956!16207816!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30535 invoked from network); 14 Oct 2015 10:35:56 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-12.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2015 10:35:56 -0000
X-IronPort-AV: E=Sophos;i="5.17,681,1437436800"; 
   d="scan'208";a="5192048"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 4/5] Implement new IOCTL handlers
Thread-Index: AQHRALuLOFp9rRciJk6eY/nrf9sjEJ5qx0ZQ
Date: Wed, 14 Oct 2015 10:35:54 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F611101@AMSPEX01CL01.citrite.net>
References: <5614A431.2020704@invisiblethingslab.com>
In-Reply-To: <5614A431.2020704@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] [PATCH 4/5] Implement new IOCTL handlers
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 Rafal Wojdyla
> Sent: 07 October 2015 05:49
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 4/5] Implement new IOCTL handlers
> 
> This patch implements new store, evtchn and gnttab IOCTLs.
> Handlers are split into separate files for readability.
> 
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
> ---
>  src/xeniface/fdo.c               | 188 ++++++++--
>  src/xeniface/fdo.h               |  25 +-
>  src/xeniface/ioctl_evtchn.c      | 467 ++++++++++++++++++++++++
>  src/xeniface/ioctl_gnttab.c      | 765
> +++++++++++++++++++++++++++++++++++++++
>  src/xeniface/ioctl_store.c       | 574 +++++++++++++++++++++++++++++
>  src/xeniface/ioctls.c            | 360 ++++++------------
>  src/xeniface/ioctls.h            | 315 +++++++++++++++-
>  src/xeniface/irp_queue.c         | 131 +++++++
>  src/xeniface/irp_queue.h         |  50 +++
>  vs2013/xeniface/xeniface.vcxproj |   4 +
>  10 files changed, 2602 insertions(+), 277 deletions(-)
>  create mode 100644 src/xeniface/ioctl_evtchn.c
>  create mode 100644 src/xeniface/ioctl_gnttab.c
>  create mode 100644 src/xeniface/ioctl_store.c
>  create mode 100644 src/xeniface/irp_queue.c
>  create mode 100644 src/xeniface/irp_queue.h
> 
> diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
> index 51bda24..338c8da 100644
> --- a/src/xeniface/fdo.c
> +++ b/src/xeniface/fdo.c
> @@ -36,7 +36,8 @@
>  #include <stdlib.h>
> 
>  #include <store_interface.h>
> -
> +#include <evtchn_interface.h>
> +#include <gnttab_interface.h>
>  #include <suspend_interface.h>
> 
> 
> @@ -52,6 +53,7 @@
>  #include "ioctls.h"
>  #include "wmi.h"
>  #include "xeniface_ioctls.h"
> +#include "irp_queue.h"
> 
>  #define FDO_POOL 'ODF'
> 
> @@ -664,6 +666,25 @@ __FdoD3ToD0(
>      if (!NT_SUCCESS(status))
>          goto fail1;
> 
> +    status = XENBUS_EVTCHN(Acquire, &Fdo->EvtchnInterface);
> +    if (!NT_SUCCESS(status))
> +        goto fail2;
> +
> +    status = XENBUS_GNTTAB(Acquire, &Fdo->GnttabInterface);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    status = XENBUS_GNTTAB(CreateCache,
> +                           &Fdo->GnttabInterface,
> +                           "xeniface-gnttab",
> +                           0,
> +                           GnttabAcquireLock,
> +                           GnttabReleaseLock,
> +                           Fdo,
> +                           &Fdo->GnttabCache);
> +    if (!NT_SUCCESS(status))
> +        goto fail4;
> +
>      __FdoSetDevicePowerState(Fdo, PowerDeviceD0);
> 
>      PowerState.DeviceState = PowerDeviceD0;
> @@ -675,6 +696,18 @@ __FdoD3ToD0(
> 
>      return STATUS_SUCCESS;
> 
> +fail4:
> +    Error("fail4\n");
> +    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
> +
> +fail3:
> +    Error("fail3\n");
> +    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
> +
> +fail2:
> +    Error("fail2\n");
> +    XENBUS_STORE(Release, &Fdo->StoreInterface);
> +
>  fail1:
>      Error("fail1 (%08x)\n", status);
> 
> @@ -700,6 +733,9 @@ __FdoD0ToD3(
> 
>      __FdoSetDevicePowerState(Fdo, PowerDeviceD3);
> 
> +    XENBUS_GNTTAB(DestroyCache, &Fdo->GnttabInterface, Fdo-
> >GnttabCache);
> +    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
> +    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
>      XENBUS_STORE(Release, &Fdo->StoreInterface);
> 
>      Trace("<====\n");
> @@ -1991,27 +2027,25 @@ FdoDispatchDefault(
> 
>  NTSTATUS
>  FdoCreateFile (
> -    __in PXENIFACE_FDO fdoData,
> -    __inout PIRP Irp
> +    __in PXENIFACE_FDO  Fdo,
> +    __inout PIRP        Irp
>      )
>  {
> -    NTSTATUS     status;
> -
> +    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
> +    NTSTATUS            status;
> 
> -    XenIfaceDebugPrint(TRACE, "Create \n");
> +    XenIfaceDebugPrint(TRACE, "FO %p, Process %p\n", Stack->FileObject,
> PsGetCurrentProcess());
> 
> -    if (Deleted == fdoData->Dx->DevicePnpState)
> -    {
> +    if (Deleted == Fdo->Dx->DevicePnpState) {
>          Irp->IoStatus.Status = STATUS_NO_SUCH_DEVICE;
> -        IoCompleteRequest (Irp, IO_NO_INCREMENT);
> +        IoCompleteRequest(Irp, IO_NO_INCREMENT);
>          return STATUS_NO_SUCH_DEVICE;
>      }
> 
> -
>      status = STATUS_SUCCESS;
>      Irp->IoStatus.Information = 0;
>      Irp->IoStatus.Status = status;
> -    IoCompleteRequest (Irp, IO_NO_INCREMENT);
> +    IoCompleteRequest(Irp, IO_NO_INCREMENT);
> 
>      return status;
>  }
> @@ -2019,20 +2053,22 @@ FdoCreateFile (
> 
>  NTSTATUS
>  FdoClose (
> -    __in PXENIFACE_FDO fdoData,
> -    __inout PIRP Irp
> +    __in PXENIFACE_FDO  Fdo,
> +    __inout PIRP        Irp
>      )
> 
>  {
> +    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
> +    NTSTATUS            status;
> 
> -    NTSTATUS     status;
> +    XenIfaceDebugPrint(TRACE, "FO %p, Process %p\n", Stack->FileObject,
> PsGetCurrentProcess());
> 
> -    XenIfaceDebugPrint(TRACE, "Close \n");
> +    XenIfaceCleanup(Fdo, Stack->FileObject);
> 
>      status = STATUS_SUCCESS;
>      Irp->IoStatus.Information = 0;
>      Irp->IoStatus.Status = status;
> -    IoCompleteRequest (Irp, IO_NO_INCREMENT);
> +    IoCompleteRequest(Irp, IO_NO_INCREMENT);
> 
>      return status;
>  }
> @@ -2080,9 +2116,9 @@ FdoDispatch(
>          status = FdoDispatchPower(Fdo, Irp);
>          break;
> 
> -	case IRP_MJ_DEVICE_CONTROL:
> -		status = XenIFaceIoctl(Fdo, Irp);
> -		break;
> +    case IRP_MJ_DEVICE_CONTROL:
> +        status = XenIfaceIoctl(Fdo, Irp);
> +        break;
> 
>  	case IRP_MJ_SYSTEM_CONTROL:
>  		status = XenIfaceSystemControl(Fdo, Irp);
> @@ -2206,6 +2242,7 @@ FdoCreate(
>      WCHAR               Name[MAXNAMELEN * sizeof (WCHAR)];
>      ULONG               Size;
>      NTSTATUS            status;
> +    ULONG               ProcessorCount;
> 
>  #pragma prefast(suppress:28197) // Possibly leaking memory
> 'FunctionDeviceObject'
>      status = IoCreateDevice(DriverObject,
> @@ -2296,6 +2333,24 @@ FdoCreate(
>      if (!NT_SUCCESS(status))
>          goto fail10;
> 
> +    status = FDO_QUERY_INTERFACE(Fdo,
> +                                 XENBUS,
> +                                 EVTCHN,
> +                                 (PINTERFACE)&Fdo->EvtchnInterface,
> +                                 sizeof(Fdo->EvtchnInterface),
> +                                 FALSE);
> +    if (!NT_SUCCESS(status))
> +        goto fail11;
> +
> +    status = FDO_QUERY_INTERFACE(Fdo,
> +                                 XENBUS,
> +                                 GNTTAB,
> +                                 (PINTERFACE)&Fdo->GnttabInterface,
> +                                 sizeof(Fdo->GnttabInterface),
> +                                 FALSE);
> +    if (!NT_SUCCESS(status))
> +        goto fail12;
> +
>      InitializeMutex(&Fdo->Mutex);
>      InitializeListHead(&Dx->ListEntry);
>      Fdo->References = 1;
> @@ -2304,9 +2359,46 @@ FdoCreate(
> 
>  	KeInitializeEvent(&Fdo->registryWriteEvent, NotificationEvent,
> FALSE);
> 
> -	status = ThreadCreate(FdoRegistryThreadHandler, Fdo, &Fdo-
> >registryThread);
> -	if (!NT_SUCCESS(status))
> -		goto fail11;
> +    status = ThreadCreate(FdoRegistryThreadHandler, Fdo, &Fdo-
> >registryThread);
> +    if (!NT_SUCCESS(status))
> +        goto fail13;
> +
> +    KeInitializeSpinLock(&Fdo->StoreWatchLock);
> +    InitializeListHead(&Fdo->StoreWatchList);
> +
> +    KeInitializeSpinLock(&Fdo->EvtchnLock);
> +    InitializeListHead(&Fdo->EvtchnList);
> +
> +    KeInitializeSpinLock(&Fdo->IrpQueueLock);
> +    InitializeListHead(&Fdo->IrpList);
> +
> +    KeInitializeSpinLock(&Fdo->GnttabCacheLock);
> +
> +    status = IoCsqInitializeEx(&Fdo->IrpQueue,
> +                               CsqInsertIrpEx,
> +                               CsqRemoveIrp,
> +                               CsqPeekNextIrp,
> +                               CsqAcquireLock,
> +                               CsqReleaseLock,
> +                               CsqCompleteCanceledIrp);
> +    if (!NT_SUCCESS(status))
> +        goto fail14;
> +
> +    ProcessorCount =
> KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
> +    status = STATUS_NO_MEMORY;

Need a blank line here, I think.

> +    Fdo->EvtchnDpc = __FdoAllocate(sizeof(KDPC) * ProcessorCount);
> +    if (Fdo->EvtchnDpc == NULL)
> +        goto fail15;
> +
> +    for (ULONG i = 0; i < ProcessorCount; i++) {

Let's not use C++-isms where we don't have to. Also use 'Index' or somesuch rather than 'i'.

> +        PROCESSOR_NUMBER ProcNumber;
> +
> +        status = KeGetProcessorNumberFromIndex(i, &ProcNumber);
> +        ASSERT(NT_SUCCESS(status));

Blank line here.

> +        KeInitializeDpc(&Fdo->EvtchnDpc[i], EvtchnNotificationDpc, NULL);
> +        status = KeSetTargetProcessorDpcEx(&Fdo->EvtchnDpc[i],
> &ProcNumber);
> +        ASSERT(NT_SUCCESS(status));
> +    }
> 
>      Info("%p (%s)\n",
>           FunctionDeviceObject,
> @@ -2317,7 +2409,28 @@ FdoCreate(
> 
>      return STATUS_SUCCESS;
> 
> -
> +fail15:
> +    Error("fail15\n");
> +
> +fail14:
> +    Error("fail14\n");
> +
> +    ThreadAlert(Fdo->registryThread);
> +    ThreadJoin(Fdo->registryThread);
> +    Fdo->registryThread = NULL;
> +
> +fail13:
> +    Error("fail13\n");
> +
> +    RtlZeroMemory(&Fdo->GnttabInterface,
> +                  sizeof (XENBUS_GNTTAB_INTERFACE));
> +
> +fail12:
> +    Error("fail12\n");
> +
> +    RtlZeroMemory(&Fdo->EvtchnInterface,
> +                  sizeof(XENBUS_EVTCHN_INTERFACE));
> +
>  fail11:
>  	Error("fail11\n");
> 
> @@ -2395,6 +2508,7 @@ FdoDestroy(
>  {
>      PXENIFACE_DX          Dx = Fdo->Dx;
>      PDEVICE_OBJECT      FunctionDeviceObject = Dx->DeviceObject;
> +    ULONG               ProcessorCount;
> 
>      ASSERT(IsListEmpty(&Dx->ListEntry));
>      ASSERT3U(Fdo->References, ==, 0);
> @@ -2408,9 +2522,33 @@ FdoDestroy(
> 
>      Dx->Fdo = NULL;
> 
> -    RtlZeroMemory(&Fdo->Mutex, sizeof (XENIFACE_MUTEX));
> +    ProcessorCount =
> KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
> +    RtlZeroMemory(Fdo->EvtchnDpc, sizeof(KDPC)*ProcessorCount);

Spaces around '*'. Also I don't think it's safe to use the active processor count. What if a processor came online since the FDO was created?

> +    __FdoFree(Fdo->EvtchnDpc);
> 
> -	Fdo->InterfacesAcquired = FALSE;
> +    RtlZeroMemory(&Fdo->GnttabCacheLock, sizeof(KSPIN_LOCK));
> +    ASSERT(IsListEmpty(&Fdo->IrpList));
> +    RtlZeroMemory(&Fdo->IrpList, sizeof(LIST_ENTRY));
> +    RtlZeroMemory(&Fdo->IrpQueueLock, sizeof(KSPIN_LOCK));
> +    RtlZeroMemory(&Fdo->IrpQueue, sizeof(IO_CSQ));
> +
> +    ASSERT(IsListEmpty(&Fdo->EvtchnList));
> +    RtlZeroMemory(&Fdo->EvtchnList, sizeof(LIST_ENTRY));
> +    RtlZeroMemory(&Fdo->EvtchnLock, sizeof(KSPIN_LOCK));
> +
> +    ASSERT(IsListEmpty(&Fdo->StoreWatchList));
> +    RtlZeroMemory(&Fdo->StoreWatchList, sizeof(LIST_ENTRY));
> +    RtlZeroMemory(&Fdo->StoreWatchLock, sizeof(KSPIN_LOCK));
> +
> +    RtlZeroMemory(&Fdo->Mutex, sizeof(XENIFACE_MUTEX));
> +
> +    Fdo->InterfacesAcquired = FALSE;
> +
> +    RtlZeroMemory(&Fdo->GnttabInterface,
> +                  sizeof(XENBUS_GNTTAB_INTERFACE));
> +
> +    RtlZeroMemory(&Fdo->EvtchnInterface,
> +                  sizeof(XENBUS_EVTCHN_INTERFACE));
> 
>      RtlZeroMemory(&Fdo->StoreInterface,
>                    sizeof (XENBUS_STORE_INTERFACE));
> diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
> index 4416064..cbe5de3 100644
> --- a/src/xeniface/fdo.h
> +++ b/src/xeniface/fdo.h
> @@ -34,6 +34,8 @@
> 
>  #include <ntifs.h>
>  #include <store_interface.h>
> +#include <evtchn_interface.h>
> +#include <gnttab_interface.h>
>  #include <suspend_interface.h>
>  #include <shared_info_interface.h>
> 
> @@ -73,17 +75,30 @@ typedef struct _XENIFACE_FDO {
> 
>      FDO_RESOURCE                    Resource[RESOURCE_COUNT];
> 
> -
>      XENBUS_STORE_INTERFACE          StoreInterface;
> -
>      XENBUS_SUSPEND_INTERFACE        SuspendInterface;
> -
> -	XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
> -
> +    XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
> +    XENBUS_EVTCHN_INTERFACE         EvtchnInterface;
> +    XENBUS_GNTTAB_INTERFACE         GnttabInterface;
>      PXENBUS_SUSPEND_CALLBACK        SuspendCallbackLate;
> 
>  	BOOLEAN
> InterfacesAcquired;
> 

Since you're fixing whitespace, could you fix the above to have sane tabbing?

> +    KSPIN_LOCK                      StoreWatchLock;
> +    LIST_ENTRY                      StoreWatchList;
> +
> +    KSPIN_LOCK                      EvtchnLock;
> +    LIST_ENTRY                      EvtchnList;
> +    PKDPC                           EvtchnDpc;
> +
> +    KSPIN_LOCK                      GnttabCacheLock;
> +
> +    IO_CSQ                          IrpQueue;
> +    KSPIN_LOCK                      IrpQueueLock;
> +    LIST_ENTRY                      IrpList;
> +
> +    PXENBUS_GNTTAB_CACHE            GnttabCache;
> +
>  	#define MAX_SESSIONS    (65536)
> 
>      int							    WmiReady;
> diff --git a/src/xeniface/ioctl_evtchn.c b/src/xeniface/ioctl_evtchn.c
> new file mode 100644
> index 0000000..d46894f
> --- /dev/null
> +++ b/src/xeniface/ioctl_evtchn.c
> @@ -0,0 +1,467 @@
> +/* Copyright (c) Citrix Systems Inc.
> + * All rights reserved.

You're not obliged to give Citrix copyright AFAIK. As long as it's BSD licensed I think we're all happy.

> + *
> + * 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 "driver.h"
> +#include "ioctls.h"
> +#include "..\..\include\xeniface_ioctls.h"

Hmm. I think you should really use

#include <xeniface_ioctls.h>

> +#include "log.h"
> +
> +_Function_class_(KDEFERRED_ROUTINE)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +_IRQL_requires_same_
> +VOID
> +EvtchnNotificationDpc(
> +    __in      PKDPC Dpc,
> +    __in_opt  PVOID _Context,
> +    __in_opt  PVOID Argument1,
> +    __in_opt  PVOID Argument2
> +    )
> +{
> +    PXENIFACE_EVTCHN_CONTEXT Context =
> (PXENIFACE_EVTCHN_CONTEXT)Argument1;
> +
> +    UNREFERENCED_PARAMETER(Dpc);
> +    UNREFERENCED_PARAMETER(_Context);
> +    UNREFERENCED_PARAMETER(Argument2);
> +
> +    ASSERT(Context);
> +
> +#if DBG
> +    XenIfaceDebugPrint(INFO, "Channel %p, LocalPort %d, Active %d, Cpu
> %lu\n",
> +                       Context->Channel, Context->LocalPort, Context->Active,
> KeGetCurrentProcessorNumber());
> +#endif
> +    if (Context->Active) {
> +        KeSetEvent(Context->Event, 0, FALSE);
> +
> +        XENBUS_EVTCHN(Unmask,
> +                      &Context->Fdo->EvtchnInterface,
> +                      Context->Channel,
> +                      FALSE);
> +    }
> +}
> +
> +_Function_class_(KSERVICE_ROUTINE)
> +_IRQL_requires_(HIGH_LEVEL)
> +_IRQL_requires_same_
> +static DECLSPEC_NOINLINE
> +BOOLEAN
> +EvtchnInterruptHandler(
> +    __in      PKINTERRUPT Interrupt,
> +    __in_opt  PVOID Argument
> +    )
> +{
> +    PXENIFACE_EVTCHN_CONTEXT Context =
> (PXENIFACE_EVTCHN_CONTEXT)Argument;
> +    PROCESSOR_NUMBER ProcNumber;
> +    ULONG ProcIndex;
> +
> +    UNREFERENCED_PARAMETER(Interrupt);
> +    ASSERT(Context);
> +
> +    KeGetCurrentProcessorNumberEx(&ProcNumber);
> +    ProcIndex = KeGetProcessorIndexFromNumber(&ProcNumber);
> +    if (Context->Active)
> +        KeInsertQueueDpc(&Context->Fdo->EvtchnDpc[ProcIndex], Context,
> NULL);
> +
> +    return TRUE;
> +}
> +
> +_IRQL_requires_(PASSIVE_LEVEL) // needed for KeFlushQueuedDpcs
> +VOID
> +EvtchnFree(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_EVTCHN_CONTEXT Context
> +    )
> +{
> +    ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
> +
> +    XenIfaceDebugPrint(TRACE, "Context %p, LocalPort %d, FO %p\n",
> +                       Context, Context->LocalPort, Context->FileObject);
> +
> +    InterlockedExchange8(&Context->Active, 0);
> +
> +    XENBUS_EVTCHN(Close,
> +                  &Fdo->EvtchnInterface,
> +                  Context->Channel);
> +
> +    // There may still be a pending event at this time.
> +    // Wait for our DPCs to complete.
> +    KeFlushQueuedDpcs();
> +
> +    ObDereferenceObject(Context->Event);
> +    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));

'sizeof' is a keyword so it really should be sizeof (), similar to if () or for ().

> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +}
> +
> +_Requires_exclusive_lock_held_(Fdo->EvtchnLock)
> +static
> +PXENIFACE_EVTCHN_CONTEXT
> +EvtchnFindChannel(
> +    __in      PXENIFACE_FDO Fdo,
> +    __in      ULONG         LocalPort,
> +    __in_opt  PFILE_OBJECT  FileObject
> +    )
> +{
> +    PXENIFACE_EVTCHN_CONTEXT Context, Found = NULL;
> +    PLIST_ENTRY Node;
> +
> +    Node = Fdo->EvtchnList.Flink;
> +    while (Node->Flink != Fdo->EvtchnList.Flink) {
> +        Context = CONTAINING_RECORD(Node, XENIFACE_EVTCHN_CONTEXT,
> Entry);
> +
> +        Node = Node->Flink;
> +        if (Context->LocalPort != LocalPort)
> +            continue;
> +
> +        if (FileObject != NULL && Context->FileObject != FileObject)
> +            continue;
> +
> +        Found = Context;
> +        break;
> +    }
> +
> +    return Found;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnBindUnbound(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_BIND_UNBOUND_IN In = Buffer;
> +    PXENIFACE_EVTCHN_BIND_UNBOUND_OUT Out = Buffer;
> +    PXENIFACE_EVTCHN_CONTEXT Context;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_IN) || OutLen !=
> sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_OUT))

Break this line at the '||'.

> +        goto fail1;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context = ExAllocatePoolWithTag(NonPagedPool,
> sizeof(XENIFACE_EVTCHN_CONTEXT), XENIFACE_POOL_TAG);
> +    if (Context == NULL)
> +        goto fail2;
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
> +    Context->FileObject = FileObject;
> +
> +    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, Mask %d, FO %p\n",
> +                       In->RemoteDomain, In->Mask, FileObject);
> +
> +    status = ObReferenceObjectByHandle(In->Event,
> EVENT_MODIFY_STATE, *ExEventObjectType, UserMode, &Context->Event,
> NULL);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    status = STATUS_UNSUCCESSFUL;
> +    Context->Channel = XENBUS_EVTCHN(Open,
> +                                     &Fdo->EvtchnInterface,
> +                                     XENBUS_EVTCHN_TYPE_UNBOUND,
> +                                     EvtchnInterruptHandler,
> +                                     Context,
> +                                     In->RemoteDomain,
> +                                     TRUE);
> +    if (Context->Channel == NULL)
> +        goto fail4;
> +
> +    Context->LocalPort = XENBUS_EVTCHN(GetPort,
> +                                       &Fdo->EvtchnInterface,
> +                                       Context->Channel);
> +
> +    Context->Fdo = Fdo;
> +
> +    ExInterlockedInsertTailList(&Fdo->EvtchnList, &Context->Entry, &Fdo-
> >EvtchnLock);
> +
> +    InterlockedExchange8(&Context->Active, 1);
> +    Out->LocalPort = Context->LocalPort;
> +    *Info = sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_OUT);
> +
> +    if (!In->Mask) {
> +        XENBUS_EVTCHN(Unmask,
> +                      &Fdo->EvtchnInterface,
> +                      Context->Channel,
> +                      FALSE);
> +    }
> +
> +    XenIfaceDebugPrint(TRACE, "< LocalPort %lu, Context %p\n", Context-
> >LocalPort, Context);
> +    return STATUS_SUCCESS;
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +    ObDereferenceObject(Context->Event);
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnBindInterdomain(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_BIND_INTERDOMAIN_IN In = Buffer;
> +    PXENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT Out = Buffer;
> +    PXENIFACE_EVTCHN_CONTEXT Context;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN) ||
> OutLen != sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT))
> +        goto fail1;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context = ExAllocatePoolWithTag(NonPagedPool,
> sizeof(XENIFACE_EVTCHN_CONTEXT), XENIFACE_POOL_TAG);
> +    if (Context == NULL)
> +        goto fail2;
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
> +    Context->FileObject = FileObject;
> +
> +    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, RemotePort %lu,
> Mask %d, FO %p\n",
> +                       In->RemoteDomain, In->RemotePort, In->Mask, FileObject);
> +
> +    status = ObReferenceObjectByHandle(In->Event,
> EVENT_MODIFY_STATE, *ExEventObjectType, UserMode, &Context->Event,
> NULL);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    status = STATUS_UNSUCCESSFUL;
> +    Context->Channel = XENBUS_EVTCHN(Open,
> +                                     &Fdo->EvtchnInterface,
> +                                     XENBUS_EVTCHN_TYPE_INTER_DOMAIN,
> +                                     EvtchnInterruptHandler,
> +                                     Context,
> +                                     In->RemoteDomain,
> +                                     In->RemotePort,
> +                                     TRUE);
> +    if (Context->Channel == NULL)
> +        goto fail4;
> +
> +    Context->LocalPort = XENBUS_EVTCHN(GetPort,
> +                                       &Fdo->EvtchnInterface,
> +                                       Context->Channel);
> +
> +    Context->Fdo = Fdo;
> +
> +    ExInterlockedInsertTailList(&Fdo->EvtchnList, &Context->Entry, &Fdo-
> >EvtchnLock);
> +
> +    InterlockedExchange8(&Context->Active, 1);
> +    Out->LocalPort = Context->LocalPort;
> +    *Info = sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT);
> +
> +    if (!In->Mask) {
> +        XENBUS_EVTCHN(Unmask,
> +                      &Fdo->EvtchnInterface,
> +                      Context->Channel,
> +                      FALSE);
> +    }
> +
> +    XenIfaceDebugPrint(TRACE, "< LocalPort %lu, Context %p\n", Context-
> >LocalPort, Context);
> +
> +    return STATUS_SUCCESS;
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +    ObDereferenceObject(Context->Event);
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnClose(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_CLOSE_IN In = Buffer;
> +    PXENIFACE_EVTCHN_CONTEXT Context = NULL;
> +    KIRQL Irql;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_EVTCHN_CLOSE_IN) || OutLen != 0)
> +        goto fail1;
> +
> +    XenIfaceDebugPrint(TRACE, "> LocalPort %lu, FO %p\n", In->LocalPort,
> FileObject);
> +
> +    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
> +    Context = EvtchnFindChannel(Fdo, In->LocalPort, FileObject);
> +    if (Context != NULL)

Could you not go straight to fail2 here (and drop the lock there) and thus get rid of the tests for Context == or != NULL below?

> +        RemoveEntryList(&Context->Entry);
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +    if (Context != NULL)
> +        EvtchnFree(Fdo, Context);
> +
> +    status = STATUS_NOT_FOUND;
> +    if (Context == NULL)
> +        goto fail2;
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +_Requires_lock_not_held_(Fdo->EvtchnLock)
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +EvtchnNotify(
> +    __in      PXENIFACE_FDO Fdo,
> +    __in      ULONG         LocalPort,
> +    __in_opt  PFILE_OBJECT  FileObject
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_CONTEXT Context = NULL;
> +    KIRQL Irql;
> +
> +    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
> +
> +    Context = EvtchnFindChannel(Fdo, LocalPort, FileObject);
> +
> +    status = STATUS_NOT_FOUND;
> +    if (Context == NULL)
> +        goto fail1;
> +
> +    XENBUS_EVTCHN(Send,
> +                  &Fdo->EvtchnInterface,
> +                  Context->Channel);
> +
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +
> +    return STATUS_SUCCESS;
> +
> +fail1:
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnNotify(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_NOTIFY_IN In = Buffer;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_EVTCHN_NOTIFY_IN) || OutLen != 0)
> +        goto fail1;
> +#if DBG
> +    XenIfaceDebugPrint(INFO, "> LocalPort %d, FO %p\n", In->LocalPort,
> FileObject);
> +#endif
> +
> +    return EvtchnNotify(Fdo, In->LocalPort, FileObject);
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnUnmask(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_UNMASK_IN In = Buffer;
> +    PXENIFACE_EVTCHN_CONTEXT Context = NULL;
> +    KIRQL Irql;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_EVTCHN_UNMASK_IN) || OutLen != 0)
> +        goto fail1;
> +
> +    XenIfaceDebugPrint(TRACE, "> LocalPort %d, FO %p\n", In->LocalPort,
> FileObject);
> +
> +    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
> +
> +    Context = EvtchnFindChannel(Fdo, In->LocalPort, FileObject);
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (Context == NULL)
> +        goto fail2;
> +
> +    XENBUS_EVTCHN(Unmask,
> +                  &Fdo->EvtchnInterface,
> +                  Context->Channel,
> +                  FALSE);
> +
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> diff --git a/src/xeniface/ioctl_gnttab.c b/src/xeniface/ioctl_gnttab.c
> new file mode 100644
> index 0000000..a279b77
> --- /dev/null
> +++ b/src/xeniface/ioctl_gnttab.c
> @@ -0,0 +1,765 @@
> +/* 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 "driver.h"
> +#include "ioctls.h"
> +#include "..\..\include\xeniface_ioctls.h"

Use <> too.

> +#include "log.h"
> +#include "irp_queue.h"
> +
> +// Complete a canceled gnttab IRP, cleanup associated grant/map.
> +_Function_class_(IO_WORKITEM_ROUTINE)
> +VOID
> +CompleteGnttabIrp(
> +    __in      PDEVICE_OBJECT DeviceObject,
> +    __in_opt  PVOID          Context
> +    )
> +{
> +    PXENIFACE_DX Dx = (PXENIFACE_DX)DeviceObject->DeviceExtension;
> +    PXENIFACE_FDO Fdo = Dx->Fdo;
> +    PIRP Irp = Context;
> +    PXENIFACE_CONTEXT_ID Id;
> +    PIO_WORKITEM WorkItem;
> +    KAPC_STATE ApcState;
> +    BOOLEAN ChangeProcess;
> +
> +    ASSERT(Context != NULL);
> +
> +    Id = Irp->Tail.Overlay.DriverContext[0];
> +    WorkItem = Irp->Tail.Overlay.DriverContext[1];
> +
> +    // We are not guaranteed to be in the context of the process that
> initiated the IRP,
> +    // but we need to be there to unmap memory.
> +    ChangeProcess = PsGetCurrentProcess() != Id->Process;
> +    if (ChangeProcess) {
> +        XenIfaceDebugPrint(TRACE, "Changing process from %p to %p\n",
> PsGetCurrentProcess(), Id->Process);
> +        KeStackAttachProcess(Id->Process, &ApcState);
> +    }
> +
> +    XenIfaceDebugPrint(TRACE, "Irp %p, Process %p, Id %lu, Type %d, IRQL
> %d\n",
> +                       Irp, Id->Process, Id->RequestId, Id->Type, KeGetCurrentIrql());
> +
> +    switch (Id->Type) {
> +
> +    case XENIFACE_CONTEXT_GRANT:
> +        GnttabFreeGrant(Fdo, CONTAINING_RECORD(Id,
> XENIFACE_GRANT_CONTEXT, Id));
> +        break;
> +
> +    case XENIFACE_CONTEXT_MAP:
> +        GnttabFreeMap(Fdo, CONTAINING_RECORD(Id,
> XENIFACE_MAP_CONTEXT, Id));
> +        break;
> +
> +    default:
> +        ASSERT(FALSE);
> +    }
> +
> +    if (ChangeProcess)
> +        KeUnstackDetachProcess(&ApcState);
> +
> +    IoFreeWorkItem(WorkItem);
> +
> +    Irp->IoStatus.Status = STATUS_CANCELLED;
> +    Irp->IoStatus.Information = 0;
> +    IoCompleteRequest(Irp, IO_NO_INCREMENT);
> +}
> +
> +_Acquires_exclusive_lock_(((PXENIFACE_FDO)Argument)-
> >GnttabCacheLock)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +VOID
> +GnttabAcquireLock(
> +    __in  PVOID Argument
> +    )
> +{
> +    PXENIFACE_FDO Fdo = Argument;
> +
> +    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
> +
> +    KeAcquireSpinLockAtDpcLevel(&Fdo->GnttabCacheLock);
> +}
> +
> +_Releases_exclusive_lock_(((PXENIFACE_FDO)Argument)-
> >GnttabCacheLock)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +VOID
> +GnttabReleaseLock(
> +    __in  PVOID Argument
> +    )
> +{
> +    PXENIFACE_FDO Fdo = Argument;
> +
> +    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
> +
> +    KeReleaseSpinLockFromDpcLevel(&Fdo->GnttabCacheLock);
> +}
> +
> +_Requires_lock_not_held_(Fdo->IrpQueueLock)
> +static
> +PIRP
> +FindGnttabIrp(
> +    __in  PXENIFACE_FDO Fdo,
> +    __in  PXENIFACE_CONTEXT_ID Id
> +    )
> +{
> +    KIRQL Irql;
> +    PIRP Irp;
> +
> +    CsqAcquireLock(&Fdo->IrpQueue, &Irql);
> +    Irp = CsqPeekNextIrp(&Fdo->IrpQueue, NULL, Id);
> +    CsqReleaseLock(&Fdo->IrpQueue, Irql);
> +    return Irp;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabPermitForeignAccess(
> +    __in     PXENIFACE_FDO  Fdo,
> +    __in     PVOID          Buffer,
> +    __in     ULONG          InLen,
> +    __in     ULONG          OutLen,
> +    __inout  PIRP           Irp
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN In = Buffer;
> +    PXENIFACE_GRANT_CONTEXT Context;
> +    ULONG Page;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN) ||
> OutLen != 0)
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if ((In->NumberPages == 0) || (In->NumberPages > 1024 * 1024) ||
> +        ((In->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) && (In-
> >NotifyOffset >= In->NumberPages * PAGE_SIZE))
> +        )
> +        goto fail2;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context = ExAllocatePoolWithTag(NonPagedPool,
> sizeof(XENIFACE_GRANT_CONTEXT), XENIFACE_POOL_TAG);
> +    if (Context == NULL)
> +        goto fail3;
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
> +    Context->Id.Type = XENIFACE_CONTEXT_GRANT;
> +    Context->Id.Process = PsGetCurrentProcess();

Careful. I don't think Wndows guarantees that METHOD_BUFFERED ioctls will be handled in the issuers process context. See the sentence:

" After the I/O manager has created a system-space buffer for the driver, the requesting user-mode thread can be swapped out and its physical memory can be reused by another thread, possibly by a thread belonging to another process."

at https://msdn.microsoft.com/en-us/library/windows/hardware/ff565356%28v=vs.85%29.aspx.

You should probably consider using METHOD_NEITHER. That may also allow you to play tricks like injecting the results of the operation into the user-space buffer without completing the ioctl possibly negating the need for a 'get results' ioctl.

  Paul

> +    Context->Id.RequestId = In->RequestId;
> +    Context->RemoteDomain = In->RemoteDomain;
> +    Context->NumberPages = In->NumberPages;
> +    Context->Flags = In->Flags;
> +    Context->NotifyOffset = In->NotifyOffset;
> +    Context->NotifyPort = In->NotifyPort;
> +
> +    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, NumberPages %lu,
> Flags 0x%x, Offset 0x%x, Port %d, Process %p, Id %lu\n",
> +                       Context->RemoteDomain, Context->NumberPages, Context-
> >Flags, Context->NotifyOffset, Context->NotifyPort,
> +                       Context->Id.Process, Context->Id.RequestId);
> +
> +    // Check if the request ID is unique.
> +    // This doesn't protect us from simultaneous requests with the same ID
> arriving here
> +    // but another check for duplicate ID is performed when the context/IRP
> is queued at the end.
> +    // Ideally we would lock the whole section but that's not really an option
> since we touch user memory.
> +    status = STATUS_INVALID_PARAMETER;
> +    if (FindGnttabIrp(Fdo, &Context->Id) != NULL)
> +        goto fail4;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context->Grants = ExAllocatePoolWithTag(NonPagedPool, Context-
> >NumberPages * sizeof(PXENBUS_GNTTAB_ENTRY),
> XENIFACE_POOL_TAG);
> +    if (Context->Grants == NULL)
> +        goto fail5;
> +
> +    RtlZeroMemory(Context->Grants, Context->NumberPages *
> sizeof(PXENBUS_GNTTAB_ENTRY));
> +
> +    // allocate memory to share
> +    status = STATUS_NO_MEMORY;
> +    Context->KernelVa = ExAllocatePoolWithTag(NonPagedPool, Context-
> >NumberPages * PAGE_SIZE, XENIFACE_POOL_TAG);
> +    if (Context->KernelVa == NULL)
> +        goto fail6;
> +
> +    RtlZeroMemory(Context->KernelVa, Context->NumberPages *
> PAGE_SIZE);
> +    Context->Mdl = IoAllocateMdl(Context->KernelVa, Context-
> >NumberPages * PAGE_SIZE, FALSE, FALSE, NULL);
> +    if (Context->Mdl == NULL)
> +        goto fail7;
> +
> +    MmBuildMdlForNonPagedPool(Context->Mdl);
> +    ASSERT(MmGetMdlByteCount(Context->Mdl) == Context-
> >NumberPages * PAGE_SIZE);
> +
> +    // perform sharing
> +    for (Page = 0; Page < Context->NumberPages; Page++) {
> +        status = XENBUS_GNTTAB(PermitForeignAccess,
> +                               &Fdo->GnttabInterface,
> +                               Fdo->GnttabCache,
> +                               FALSE,
> +                               Context->RemoteDomain,
> +                               MmGetMdlPfnArray(Context->Mdl)[Page],
> +                               (Context->Flags & XENIFACE_GNTTAB_READONLY) != 0,
> +                               &(Context->Grants[Page]));
> +
> +// prefast somehow thinks that this call can modify Page...
> +#pragma prefast(suppress:6385)
> +        XenIfaceDebugPrint(INFO, "Grants[%lu] = %p\n", Page, Context-
> >Grants[Page]);
> +        if (!NT_SUCCESS(status))
> +            goto fail8;
> +    }
> +
> +    // map into user mode
> +#pragma prefast(suppress:6320) // we want to catch all exceptions
> +    __try {
> +        Context->UserVa = MmMapLockedPagesSpecifyCache(Context->Mdl,
> UserMode, MmCached, NULL, FALSE, NormalPagePriority);
> +    }
> +    __except (EXCEPTION_EXECUTE_HANDLER) {
> +        status = GetExceptionCode();
> +        goto fail9;
> +    }
> +
> +    status = STATUS_UNSUCCESSFUL;
> +    if (Context->UserVa == NULL)
> +        goto fail10;
> +
> +    XenIfaceDebugPrint(TRACE, "< Context %p, Irp %p, KernelVa %p, UserVa
> %p\n", Context, Irp, Context->KernelVa, Context->UserVa);
> +
> +    // Insert the IRP/context into the pending queue.
> +    // This also checks (again) if the request ID is unique.
> +    Irp->Tail.Overlay.DriverContext[0] = &Context->Id;
> +    status = IoCsqInsertIrpEx(&Fdo->IrpQueue, Irp, NULL, &Context->Id);
> +    if (!NT_SUCCESS(status))
> +        goto fail11;
> +
> +    return STATUS_PENDING;
> +
> +fail11:
> +    XenIfaceDebugPrint(ERROR, "Fail11\n");
> +    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
> +
> +fail10:
> +    XenIfaceDebugPrint(ERROR, "Fail10\n");
> +
> +fail9:
> +    XenIfaceDebugPrint(ERROR, "Fail9\n");
> +
> +fail8:
> +    XenIfaceDebugPrint(ERROR, "Fail8: Page = %lu\n", Page);
> +
> +    while (Page > 0) {
> +        ASSERT(NT_SUCCESS(XENBUS_GNTTAB(RevokeForeignAccess,
> +                                        &Fdo->GnttabInterface,
> +                                        Fdo->GnttabCache,
> +                                        FALSE,
> +                                        Context->Grants[Page - 1])));
> +
> +        --Page;
> +    }
> +    IoFreeMdl(Context->Mdl);
> +
> +fail7:
> +    XenIfaceDebugPrint(ERROR, "Fail7\n");
> +    ExFreePoolWithTag(Context->KernelVa, XENIFACE_POOL_TAG);
> +
> +fail6:
> +    XenIfaceDebugPrint(ERROR, "Fail6\n");
> +    ExFreePoolWithTag(Context->Grants, XENIFACE_POOL_TAG);
> +
> +fail5:
> +    XenIfaceDebugPrint(ERROR, "Fail5\n");
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabGetGrantResult(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_GNTTAB_GET_GRANT_RESULT_IN In = Buffer;
> +    PXENIFACE_GNTTAB_GET_GRANT_RESULT_OUT Out = Buffer;
> +    XENIFACE_CONTEXT_ID Id;
> +    KIRQL Irql;
> +    PIRP Irp;
> +    PXENIFACE_CONTEXT_ID ContextId;
> +    PXENIFACE_GRANT_CONTEXT Context;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_GNTTAB_GET_GRANT_RESULT_IN))
> +        goto fail1;
> +
> +    Id.Process = PsGetCurrentProcess();
> +    Id.RequestId = In->RequestId;
> +    Id.Type = XENIFACE_CONTEXT_GRANT;
> +
> +    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process,
> Id.RequestId);
> +
> +    CsqAcquireLock(&Fdo->IrpQueue, &Irql);
> +    Irp = CsqPeekNextIrp(&Fdo->IrpQueue, NULL, &Id);
> +
> +    status = STATUS_NOT_FOUND;
> +    if (Irp == NULL)
> +        goto fail2;
> +
> +    ContextId = Irp->Tail.Overlay.DriverContext[0];
> +    Context = CONTAINING_RECORD(ContextId,
> XENIFACE_GRANT_CONTEXT, Id);
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (OutLen != (sizeof(XENIFACE_GNTTAB_GET_GRANT_RESULT_OUT) +
> sizeof(ULONG) * Context->NumberPages))
> +        goto fail3;
> +
> +    Out->Address = Context->UserVa;
> +    XenIfaceDebugPrint(TRACE, "< Address %p, Irp %p\n", Context->UserVa,
> Irp);
> +
> +    for (ULONG Page = 0; Page < Context->NumberPages; Page++) {
> +        Out->References[Page] = XENBUS_GNTTAB(GetReference,
> +                                              &Fdo->GnttabInterface,
> +                                              Context->Grants[Page]);
> +        XenIfaceDebugPrint(INFO, "Ref[%lu] = %lu\n", Page, Out-
> >References[Page]);
> +    }
> +
> +    CsqReleaseLock(&Fdo->IrpQueue, Irql);
> +    *Info = OutLen;
> +
> +    return STATUS_SUCCESS;
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +    CsqReleaseLock(&Fdo->IrpQueue, Irql);
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +_IRQL_requires_max_(APC_LEVEL)
> +VOID
> +GnttabFreeGrant(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_GRANT_CONTEXT Context
> +)
> +{
> +    NTSTATUS status;
> +    ULONG Page;
> +
> +    ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
> +
> +    XenIfaceDebugPrint(TRACE, "Context %p\n", Context);
> +
> +    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) {
> +        ((PCHAR)Context->KernelVa)[Context->NotifyOffset] = 0;
> +    }
> +
> +    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_PORT) {
> +        status = EvtchnNotify(Fdo, Context->NotifyPort, NULL);
> +
> +        if (!NT_SUCCESS(status)) // non-fatal, we must free memory
> +            XenIfaceDebugPrint(ERROR, "failed to notify port %lu: 0x%x\n",
> Context->NotifyPort, status);
> +    }
> +
> +    // unmap from user address space
> +    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
> +
> +    // stop sharing
> +    for (Page = 0; Page < Context->NumberPages; Page++) {
> +        status = XENBUS_GNTTAB(RevokeForeignAccess,
> +                               &Fdo->GnttabInterface,
> +                               Fdo->GnttabCache,
> +                               FALSE,
> +                               Context->Grants[Page]);
> +
> +        ASSERT(NT_SUCCESS(status)); // failure here is fatal, something
> must've gone catastrophically wrong
> +    }
> +
> +    IoFreeMdl(Context->Mdl);
> +
> +    RtlZeroMemory(Context->KernelVa, Context->NumberPages *
> PAGE_SIZE);
> +    ExFreePoolWithTag(Context->KernelVa, XENIFACE_POOL_TAG);
> +
> +    RtlZeroMemory(Context->Grants, Context->NumberPages *
> sizeof(PXENBUS_GNTTAB_ENTRY));
> +    ExFreePoolWithTag(Context->Grants, XENIFACE_POOL_TAG);
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabRevokeForeignAccess(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN In = Buffer;
> +    PXENIFACE_GRANT_CONTEXT Context = NULL;
> +    XENIFACE_CONTEXT_ID Id;
> +    PIRP PendingIrp;
> +    PXENIFACE_CONTEXT_ID ContextId;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN))
> +        goto fail1;
> +
> +    Id.Type = XENIFACE_CONTEXT_GRANT;
> +    Id.Process = PsGetCurrentProcess();
> +    Id.RequestId = In->RequestId;
> +
> +    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process,
> Id.RequestId);
> +
> +    status = STATUS_NOT_FOUND;
> +    PendingIrp = IoCsqRemoveNextIrp(&Fdo->IrpQueue, &Id);
> +    if (PendingIrp == NULL)
> +        goto fail2;
> +
> +    ContextId = PendingIrp->Tail.Overlay.DriverContext[0];
> +    Context = CONTAINING_RECORD(ContextId,
> XENIFACE_GRANT_CONTEXT, Id);
> +    GnttabFreeGrant(Fdo, Context);
> +
> +    PendingIrp->IoStatus.Status = STATUS_SUCCESS;
> +    PendingIrp->IoStatus.Information = 0;
> +    IoCompleteRequest(PendingIrp, IO_NO_INCREMENT);
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabMapForeignPages(
> +    __in     PXENIFACE_FDO     Fdo,
> +    __in     PVOID             Buffer,
> +    __in     ULONG             InLen,
> +    __in     ULONG             OutLen,
> +    __inout  PIRP           Irp
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN In = Buffer;
> +    PXENIFACE_MAP_CONTEXT Context;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen < sizeof(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN) ||
> OutLen != 0)
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if ((In->NumberPages == 0) || (In->NumberPages > 1024 * 1024) ||
> +        ((In->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) && (In-
> >NotifyOffset >= In->NumberPages * PAGE_SIZE))
> +        )
> +        goto fail2;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN) +
> sizeof(ULONG) * In->NumberPages)
> +        goto fail3;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context = ExAllocatePoolWithTag(NonPagedPool,
> sizeof(XENIFACE_MAP_CONTEXT), XENIFACE_POOL_TAG);
> +    if (Context == NULL)
> +        goto fail4;
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
> +    Context->Id.Type = XENIFACE_CONTEXT_MAP;
> +    Context->Id.Process = PsGetCurrentProcess();
> +    Context->Id.RequestId = In->RequestId;
> +    Context->RemoteDomain = In->RemoteDomain;
> +    Context->NumberPages = In->NumberPages;
> +    Context->Flags = In->Flags;
> +    Context->NotifyOffset = In->NotifyOffset;
> +    Context->NotifyPort = In->NotifyPort;
> +
> +    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, NumberPages %lu,
> Flags 0x%x, Offset 0x%x, Port %d, Process %p, Id %lu\n",
> +                       Context->RemoteDomain, Context->NumberPages, Context-
> >Flags, Context->NotifyOffset, Context->NotifyPort,
> +                       Context->Id.Process, Context->Id.RequestId);
> +
> +    for (ULONG i = 0; i < In->NumberPages; i++)
> +        XenIfaceDebugPrint(INFO, "> Ref %d\n", In->References[i]);
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (FindGnttabIrp(Fdo, &Context->Id) != NULL)
> +        goto fail5;
> +
> +    status = XENBUS_GNTTAB(MapForeignPages,
> +                           &Fdo->GnttabInterface,
> +                           Context->RemoteDomain,
> +                           Context->NumberPages,
> +                           In->References,
> +                           Context->Flags & XENIFACE_GNTTAB_READONLY,
> +                           &Context->Address);
> +
> +    if (!NT_SUCCESS(status))
> +        goto fail6;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context->KernelVa = MmMapIoSpace(Context->Address, Context-
> >NumberPages * PAGE_SIZE, MmCached);
> +    if (Context->KernelVa == NULL)
> +        goto fail7;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context->Mdl = IoAllocateMdl(Context->KernelVa, Context-
> >NumberPages * PAGE_SIZE, FALSE, FALSE, NULL);
> +    if (Context->Mdl == NULL)
> +        goto fail8;
> +
> +    MmBuildMdlForNonPagedPool(Context->Mdl);
> +
> +    // map into user mode
> +#pragma prefast(suppress: 6320) // we want to catch all exceptions
> +    __try {
> +        Context->UserVa = MmMapLockedPagesSpecifyCache(Context->Mdl,
> UserMode, MmCached, NULL, FALSE, NormalPagePriority);
> +    }
> +    __except (EXCEPTION_EXECUTE_HANDLER) {
> +        status = GetExceptionCode();
> +        goto fail9;
> +    }
> +
> +    status = STATUS_UNSUCCESSFUL;
> +    if (Context->UserVa == NULL)
> +        goto fail10;
> +
> +    XenIfaceDebugPrint(TRACE, "< Context %p, Irp %p, Address %p, KernelVa
> %p, UserVa %p\n",
> +                       Context, Irp, Context->Address, Context->KernelVa, Context-
> >UserVa);
> +
> +    // Insert the IRP/context into the pending queue.
> +    // This also checks (again) if the request ID is unique.
> +    Irp->Tail.Overlay.DriverContext[0] = &Context->Id;
> +    status = IoCsqInsertIrpEx(&Fdo->IrpQueue, Irp, NULL, &Context->Id);
> +    if (!NT_SUCCESS(status))
> +        goto fail11;
> +
> +    return STATUS_PENDING;
> +
> +fail11:
> +    XenIfaceDebugPrint(ERROR, "Fail11\n");
> +    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
> +
> +fail10:
> +    XenIfaceDebugPrint(ERROR, "Fail10\n");
> +
> +fail9:
> +    XenIfaceDebugPrint(ERROR, "Fail9\n");
> +    IoFreeMdl(Context->Mdl);
> +
> +fail8:
> +    XenIfaceDebugPrint(ERROR, "Fail8\n");
> +    MmUnmapIoSpace(Context->KernelVa, Context->NumberPages *
> PAGE_SIZE);
> +
> +fail7:
> +    XenIfaceDebugPrint(ERROR, "Fail7\n");
> +    ASSERT(NT_SUCCESS(XENBUS_GNTTAB(UnmapForeignPages,
> +                                    &Fdo->GnttabInterface,
> +                                    Context->Address
> +                                    )));
> +
> +fail6:
> +    XenIfaceDebugPrint(ERROR, "Fail6\n");
> +
> +fail5:
> +    XenIfaceDebugPrint(ERROR, "Fail5\n");
> +    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabGetMapResult(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_GNTTAB_GET_MAP_RESULT_IN In = Buffer;
> +    PXENIFACE_GNTTAB_GET_MAP_RESULT_OUT Out = Buffer;
> +    XENIFACE_CONTEXT_ID Id;
> +    KIRQL Irql;
> +    PIRP Irp;
> +    PXENIFACE_MAP_CONTEXT Context;
> +    PXENIFACE_CONTEXT_ID ContextId;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_GNTTAB_GET_MAP_RESULT_IN) || OutLen
> != sizeof(XENIFACE_GNTTAB_GET_MAP_RESULT_OUT))
> +        goto fail1;
> +
> +    Id.Type = XENIFACE_CONTEXT_MAP;
> +    Id.Process = PsGetCurrentProcess();
> +    Id.RequestId = In->RequestId;
> +
> +    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process,
> Id.RequestId);
> +
> +    CsqAcquireLock(&Fdo->IrpQueue, &Irql);
> +    Irp = CsqPeekNextIrp(&Fdo->IrpQueue, NULL, &Id);
> +
> +    status = STATUS_NOT_FOUND;
> +    if (Irp == NULL)
> +        goto fail2;
> +
> +    ContextId = Irp->Tail.Overlay.DriverContext[0];
> +    Context = CONTAINING_RECORD(ContextId, XENIFACE_MAP_CONTEXT,
> Id);
> +
> +    Out->Address = Context->UserVa;
> +    XenIfaceDebugPrint(TRACE, "< Address %p, Irp %p\n", Context->UserVa,
> Irp);
> +
> +    CsqReleaseLock(&Fdo->IrpQueue, Irql);
> +    *Info = OutLen;
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +    CsqReleaseLock(&Fdo->IrpQueue, Irql);
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +_IRQL_requires_max_(APC_LEVEL)
> +DECLSPEC_NOINLINE
> +VOID
> +GnttabFreeMap(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_MAP_CONTEXT Context
> +    )
> +{
> +    NTSTATUS status;
> +
> +    ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
> +
> +    XenIfaceDebugPrint(TRACE, "Context %p\n", Context);
> +
> +    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) {
> +        ((PCHAR)Context->KernelVa)[Context->NotifyOffset] = 0;
> +    }
> +
> +    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_PORT) {
> +        status = EvtchnNotify(Fdo, Context->NotifyPort, NULL);
> +
> +        if (!NT_SUCCESS(status)) // non-fatal, we must free memory
> +            XenIfaceDebugPrint(ERROR, "failed to notify port %lu: 0x%x\n",
> Context->NotifyPort, status);
> +    }
> +
> +    // unmap from user address space
> +    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
> +
> +    IoFreeMdl(Context->Mdl);
> +
> +    // unmap from system space
> +    MmUnmapIoSpace(Context->KernelVa, Context->NumberPages *
> PAGE_SIZE);
> +
> +    // undo mapping
> +    status = XENBUS_GNTTAB(UnmapForeignPages,
> +                           &Fdo->GnttabInterface,
> +                           Context->Address);
> +
> +    ASSERT(NT_SUCCESS(status));
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabUnmapForeignPages(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN In = Buffer;
> +    PXENIFACE_MAP_CONTEXT Context = NULL;
> +    XENIFACE_CONTEXT_ID Id;
> +    PIRP PendingIrp;
> +    PXENIFACE_CONTEXT_ID ContextId;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN) &&
> OutLen != 0)
> +        goto fail1;
> +
> +    Id.Type = XENIFACE_CONTEXT_MAP;
> +    Id.Process = PsGetCurrentProcess();
> +    Id.RequestId = In->RequestId;
> +
> +    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process,
> Id.RequestId);
> +
> +    status = STATUS_NOT_FOUND;
> +    PendingIrp = IoCsqRemoveNextIrp(&Fdo->IrpQueue, &Id);
> +    if (PendingIrp == NULL)
> +        goto fail2;
> +
> +    ContextId = PendingIrp->Tail.Overlay.DriverContext[0];
> +    Context = CONTAINING_RECORD(ContextId, XENIFACE_MAP_CONTEXT,
> Id);
> +    GnttabFreeMap(Fdo, Context);
> +
> +    PendingIrp->IoStatus.Status = STATUS_SUCCESS;
> +    PendingIrp->IoStatus.Information = 0;
> +    IoCompleteRequest(PendingIrp, IO_NO_INCREMENT);
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> diff --git a/src/xeniface/ioctl_store.c b/src/xeniface/ioctl_store.c
> new file mode 100644
> index 0000000..181c706
> --- /dev/null
> +++ b/src/xeniface/ioctl_store.c
> @@ -0,0 +1,574 @@
> +/* 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 "driver.h"
> +#include "ioctls.h"
> +#include "..\..\include\xeniface_ioctls.h"
> +#include "log.h"
> +
> +#define XENSTORE_ABS_PATH_MAX 3072
> +#define XENSTORE_REL_PATH_MAX 2048
> +
> +static
> +NTSTATUS
> +__CaptureUserBuffer(
> +    __in  PVOID Buffer,
> +    __in  ULONG Length,
> +    __out PVOID *CapturedBuffer
> +    )
> +{
> +    NTSTATUS Status;
> +    PVOID TempBuffer = NULL;
> +
> +    if (Length == 0) {
> +        *CapturedBuffer = NULL;
> +        return STATUS_SUCCESS;
> +    }
> +
> +    Status = STATUS_NO_MEMORY;
> +    TempBuffer = ExAllocatePoolWithTag(NonPagedPool, Length,
> XENIFACE_POOL_TAG);
> +    if (TempBuffer == NULL)
> +        return STATUS_INSUFFICIENT_RESOURCES;
> +
> +    Status = STATUS_SUCCESS;
> +
> +#pragma prefast(suppress: 6320) // we want to catch all exceptions
> +    try {
> +        ProbeForRead(Buffer, Length, 1);
> +        RtlCopyMemory(TempBuffer, Buffer, Length);
> +    } except(EXCEPTION_EXECUTE_HANDLER) {
> +        XenIfaceDebugPrint(ERROR, "Exception while probing/reading buffer at
> %p, size 0x%lx\n", Buffer, Length);
> +        ExFreePoolWithTag(TempBuffer, XENIFACE_POOL_TAG);
> +        TempBuffer = NULL;
> +        Status = GetExceptionCode();
> +    }
> +
> +    *CapturedBuffer = TempBuffer;
> +
> +    return Status;
> + }
> +
> +static
> +VOID
> +__FreeCapturedBuffer(
> +    __in  PVOID CapturedBuffer
> +    )
> +{
> +    if (CapturedBuffer != NULL) {
> +        ExFreePoolWithTag(CapturedBuffer, XENIFACE_POOL_TAG);
> +    }
> +}
> +
> +static FORCEINLINE
> +BOOLEAN
> +__IsValidStr(
> +    __in  PCHAR             Str,
> +    __in  ULONG             Len
> +    )
> +{
> +    for ( ; Len--; ++Str) {
> +        if (*Str == '\0')
> +            return TRUE;
> +        if (!isprint((unsigned char)*Str))
> +            break;
> +    }
> +    return FALSE;
> +}
> +
> +static FORCEINLINE
> +ULONG
> +__MultiSzLen(
> +    __in  PCHAR             Str,
> +    __out PULONG            Count
> +    )
> +{
> +    ULONG Length = 0;
> +    if (Count)  *Count = 0;
> +    do {
> +        for ( ; *Str; ++Str, ++Length) ;
> +        ++Str; ++Length;
> +        if (*Count) ++(*Count);
> +    } while (*Str);
> +    return Length;
> +}
> +
> +static FORCEINLINE
> +VOID
> +__DisplayMultiSz(
> +    __in PCHAR              Caller,
> +    __in PCHAR              Str
> +    )
> +{
> +    PCHAR   Ptr;
> +    ULONG   Idx;
> +    ULONG   Len;
> +
> +    for (Ptr = Str, Idx = 0; *Ptr; ++Idx) {
> +        Len = (ULONG)strlen(Ptr);
> +        XenIfaceDebugPrint(TRACE, "|%s: [%d]=(%d)->\"%s\"\n", Caller, Idx,
> Len, Ptr);
> +        Ptr += (Len + 1);
> +    }
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRead(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS    status;
> +    PCHAR       Value;
> +    ULONG       Length;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen == 0)
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (!__IsValidStr(Buffer, InLen))
> +        goto fail2;
> +
> +    status = XENBUS_STORE(Read, &Fdo->StoreInterface, NULL, NULL,
> Buffer, &Value);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    Length = (ULONG)strlen(Value) + 1;
> +
> +    status = STATUS_BUFFER_OVERFLOW;
> +    if (OutLen == 0) {
> +        XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)\n", Buffer, Length);
> +        goto done;
> +    }
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (OutLen < Length)
> +        goto fail4;
> +
> +    XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)->\"%s\"\n", Buffer, Length,
> Value);
> +
> +    RtlCopyMemory(Buffer, Value, Length);
> +    Buffer[Length - 1] = 0;
> +    status = STATUS_SUCCESS;
> +
> +done:
> +    *Info = (ULONG_PTR)Length;
> +    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> +    return status;
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")=(%d < %d)\n", Buffer,
> OutLen, Length);
> +    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreWrite(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    )
> +{
> +    NTSTATUS    status;
> +    PCHAR       Value;
> +    ULONG       Length;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen == 0 || OutLen != 0)
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (!__IsValidStr(Buffer, InLen))
> +        goto fail2;
> +
> +    Length = (ULONG)strlen(Buffer) + 1;
> +    Value = Buffer + Length;
> +
> +    if (!__IsValidStr(Value, InLen - Length))
> +        goto fail3;
> +
> +    status = XENBUS_STORE(Printf, &Fdo->StoreInterface, NULL, NULL,
> Buffer, Value);
> +    if (!NT_SUCCESS(status))
> +        goto fail4;
> +
> +    XenIfaceDebugPrint(TRACE, "(\"%s\"=\"%s\")\n", Buffer, Value);
> +    return status;
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")\n", Value);
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreDirectory(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS    status;
> +    PCHAR       Value;
> +    ULONG       Length;
> +    ULONG       Count;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen == 0)
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (!__IsValidStr(Buffer, InLen))
> +        goto fail2;
> +
> +    status = XENBUS_STORE(Directory, &Fdo->StoreInterface, NULL, NULL,
> Buffer, &Value);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    Length = __MultiSzLen(Value, &Count) + 1;
> +
> +    status = STATUS_BUFFER_OVERFLOW;
> +    if (OutLen == 0) {
> +        XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)(%d)\n", Buffer, Length,
> Count);
> +        goto done;
> +    }
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (OutLen < Length)
> +        goto fail4;
> +
> +    XenIfaceDebugPrint(INFO, "(\"%s\")=(%d)(%d)\n", Buffer, Length,
> Count);
> +#if DBG
> +    __DisplayMultiSz(__FUNCTION__, Value);
> +#endif
> +
> +    RtlCopyMemory(Buffer, Value, Length);
> +    Buffer[Length - 2] = 0;
> +    Buffer[Length - 1] = 0;
> +    status = STATUS_SUCCESS;
> +
> +done:
> +    *Info = (ULONG_PTR)Length;
> +    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> +    return status;
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")=(%d < %d)\n", Buffer,
> OutLen, Length);
> +    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRemove(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    )
> +{
> +    NTSTATUS    status;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen == 0 || OutLen != 0)
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (!__IsValidStr(Buffer, InLen))
> +        goto fail2;
> +
> +    status = XENBUS_STORE(Remove, &Fdo->StoreInterface, NULL, NULL,
> Buffer);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    XenIfaceDebugPrint(TRACE, "(\"%s\")\n", Buffer);
> +    return status;
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreSetPermissions(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_STORE_SET_PERMISSIONS_IN In = Buffer;
> +    ULONG Index;
> +    PCHAR Path;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen < sizeof(XENIFACE_STORE_SET_PERMISSIONS_IN) || OutLen !=
> 0)
> +        goto fail1;
> +
> +    if (InLen < sizeof(XENIFACE_STORE_SET_PERMISSIONS_IN) + In-
> >NumberPermissions * sizeof(XENBUS_STORE_PERMISSION))
> +        goto fail2;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (In->PathLength == 0 || In->PathLength > XENSTORE_ABS_PATH_MAX)
> +        goto fail3;
> +
> +    status = __CaptureUserBuffer(In->Path, In->PathLength, &Path);
> +    if (!NT_SUCCESS(status))
> +        goto fail4;
> +
> +    Path[In->PathLength - 1] = 0;
> +    XenIfaceDebugPrint(TRACE, "> Path '%s', NumberPermissions %lu\n",
> Path, In->NumberPermissions);
> +
> +    for (Index = 0; Index < In->NumberPermissions; Index++) {
> +        XenIfaceDebugPrint(TRACE, "> %lu: Domain %d, Mask 0x%x\n", Index,
> In->Permissions[Index].Domain, In->Permissions[Index].Mask);
> +        if ((In->Permissions[Index].Mask &
> ~XENIFACE_STORE_ALLOWED_PERMISSIONS) != 0)
> +            goto fail5;
> +    }
> +
> +    status = XENBUS_STORE(PermissionsSet,
> +                          &Fdo->StoreInterface,
> +                          NULL, // transaction
> +                          NULL, // prefix
> +                          Path,
> +                          In->Permissions,
> +                          In->NumberPermissions);
> +
> +    if (!NT_SUCCESS(status))
> +        goto fail6;
> +
> +    __FreeCapturedBuffer(Path);
> +    return status;
> +
> +fail6:
> +    XenIfaceDebugPrint(ERROR, "Fail6\n");
> +fail5:
> +    XenIfaceDebugPrint(ERROR, "Fail5\n");
> +    __FreeCapturedBuffer(Path);
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreAddWatch(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_STORE_ADD_WATCH_IN In = Buffer;
> +    PXENIFACE_STORE_ADD_WATCH_OUT Out = Buffer;
> +    PCHAR Path;
> +    PXENIFACE_STORE_CONTEXT Context;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_STORE_ADD_WATCH_IN) || OutLen !=
> sizeof(XENIFACE_STORE_ADD_WATCH_OUT))
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (In->PathLength == 0 || In->PathLength > XENSTORE_ABS_PATH_MAX)
> +        goto fail2;
> +
> +    status = __CaptureUserBuffer(In->Path, In->PathLength, &Path);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    Path[In->PathLength - 1] = 0;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context = ExAllocatePoolWithTag(NonPagedPool,
> sizeof(XENIFACE_STORE_CONTEXT), XENIFACE_POOL_TAG);
> +    if (Context == NULL)
> +        goto fail4;
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
> +
> +    Context->FileObject = FileObject;
> +
> +    status = ObReferenceObjectByHandle(In->Event,
> EVENT_MODIFY_STATE, *ExEventObjectType, UserMode, &Context->Event,
> NULL);
> +    if (!NT_SUCCESS(status))
> +        goto fail5;
> +
> +    XenIfaceDebugPrint(TRACE, "> Path '%s', Event %p, FO %p\n", Path, In-
> >Event, FileObject);
> +
> +    status = XENBUS_STORE(WatchAdd,
> +                          &Fdo->StoreInterface,
> +                          NULL, // prefix
> +                          Path,
> +                          Context->Event,
> +                          &Context->Watch);
> +
> +    if (!NT_SUCCESS(status))
> +        goto fail6;
> +
> +    __FreeCapturedBuffer(Path);
> +
> +    ExInterlockedInsertTailList(&Fdo->StoreWatchList, &Context->Entry,
> &Fdo->StoreWatchLock);
> +
> +    XenIfaceDebugPrint(TRACE, "< Context %p, Watch %p\n", Context,
> Context->Watch);
> +
> +    Out->Context = Context;
> +    *Info = sizeof(XENIFACE_STORE_ADD_WATCH_OUT);
> +
> +    return status;
> +
> +fail6:
> +    XenIfaceDebugPrint(ERROR, "Fail6\n");
> +    ObDereferenceObject(Context->Event);
> +fail5:
> +    XenIfaceDebugPrint(ERROR, "Fail5\n");
> +    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +    __FreeCapturedBuffer(Path);
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +VOID
> +StoreFreeWatch(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_STORE_CONTEXT Context
> +    )
> +{
> +    NTSTATUS status;
> +
> +    XenIfaceDebugPrint(TRACE, "Context %p, Watch %p, FO %p\n",
> +                       Context, Context->Watch, Context->FileObject);
> +
> +    status = XENBUS_STORE(WatchRemove,
> +                          &Fdo->StoreInterface,
> +                          Context->Watch);
> +
> +    ASSERT(NT_SUCCESS(status)); // this is fatal since we'd leave an active
> watch without cleaning it up
> +
> +    ObDereferenceObject(Context->Event);
> +    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRemoveWatch(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_STORE_REMOVE_WATCH_IN In = Buffer;
> +    PXENIFACE_STORE_CONTEXT Context = NULL;
> +    KIRQL Irql;
> +    PLIST_ENTRY Node;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_STORE_REMOVE_WATCH_IN) || OutLen !=
> 0)
> +        goto fail1;
> +
> +    XenIfaceDebugPrint(TRACE, "> Context %p, FO %p\n", In->Context,
> FileObject);
> +
> +    KeAcquireSpinLock(&Fdo->StoreWatchLock, &Irql);
> +    Node = Fdo->StoreWatchList.Flink;
> +    while (Node->Flink != Fdo->StoreWatchList.Flink) {
> +        Context = CONTAINING_RECORD(Node, XENIFACE_STORE_CONTEXT,
> Entry);
> +
> +        Node = Node->Flink;
> +        if (Context != In->Context || Context->FileObject != FileObject)
> +            continue;
> +
> +        RemoveEntryList(&Context->Entry);
> +        break;
> +    }
> +    KeReleaseSpinLock(&Fdo->StoreWatchLock, Irql);
> +
> +    status = STATUS_NOT_FOUND;
> +    if (Context == NULL || Context != In->Context)
> +        goto fail2;
> +
> +    StoreFreeWatch(Fdo, Context);
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> diff --git a/src/xeniface/ioctls.c b/src/xeniface/ioctls.c
> index 3bef9ea..e20b7dc 100644
> --- a/src/xeniface/ioctls.c
> +++ b/src/xeniface/ioctls.c
> @@ -35,287 +35,156 @@
>  #include "..\..\include\xeniface_ioctls.h"
>  #include "log.h"
> 
> -static FORCEINLINE BOOLEAN
> -__IsValidStr(
> -    __in  PCHAR             Str,
> -    __in  ULONG             Len
> -    )
> -{
> -    for ( ; Len--; ++Str) {
> -        if (*Str == '\0')
> -            return TRUE;
> -        if (!isprint((unsigned char)*Str))
> -            break;
> -    }
> -    return FALSE;
> -}
> -static FORCEINLINE ULONG
> -__MultiSzLen(
> -    __in  PCHAR             Str,
> -    __out PULONG            Count
> -    )
> -{
> -    ULONG Length = 0;
> -    if (Count)  *Count = 0;
> -    do {
> -        for ( ; *Str; ++Str, ++Length) ;
> -        ++Str; ++Length;
> -        if (*Count) ++(*Count);
> -    } while (*Str);
> -    return Length;
> -}
> -static FORCEINLINE VOID
> -__DisplayMultiSz(
> -    __in PCHAR              Caller,
> -    __in PCHAR              Str
> -    )
> -{
> -    PCHAR   Ptr;
> -    ULONG   Idx;
> -    ULONG   Len;
> -
> -    for (Ptr = Str, Idx = 0; *Ptr; ++Idx) {
> -        Len = (ULONG)strlen(Ptr);
> -        XenIfaceDebugPrint(INFO, "|%s: [%d]=(%d)->\"%s\"\n", Caller, Idx,
> Len, Ptr);
> -        Ptr += (Len + 1);
> -    }
> -}
> -
> -
> -static DECLSPEC_NOINLINE NTSTATUS
> -IoctlRead(
> +// Cleanup store watches and event channels, called on file object close.
> +_IRQL_requires_(PASSIVE_LEVEL) // EvtchnFree calls KeFlushQueuedDpcs
> +VOID
> +XenIfaceCleanup(
>      __in  PXENIFACE_FDO         Fdo,
> -    __in  PCHAR             Buffer,
> -    __in  ULONG             InLen,
> -    __in  ULONG             OutLen,
> -    __out PULONG_PTR        Info
> +    __in  PFILE_OBJECT  FileObject
>      )
>  {
> -    NTSTATUS    status;
> -    PCHAR       Value;
> -    ULONG       Length;
> -
> -    status = STATUS_INVALID_BUFFER_SIZE;
> -    if (InLen == 0)
> -        goto fail1;
> -
> -    status = STATUS_INVALID_PARAMETER;
> -    if (!__IsValidStr(Buffer, InLen))
> -        goto fail2;
> -
> -    status = XENBUS_STORE(Read, &Fdo->StoreInterface, NULL, NULL,
> Buffer, &Value);
> -    if (!NT_SUCCESS(status))
> -        goto fail3;
> -
> -    Length = (ULONG)strlen(Value) + 1;
> -
> -    status = STATUS_BUFFER_OVERFLOW;
> -    if (OutLen == 0) {
> -        XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)\n", __FUNCTION__,
> Buffer, Length);
> -        goto done;
> +    PLIST_ENTRY Node;
> +    PXENIFACE_STORE_CONTEXT StoreContext;
> +    PXENIFACE_EVTCHN_CONTEXT EvtchnContext;
> +    KIRQL Irql;
> +    LIST_ENTRY ToFree;
> +
> +    XenIfaceDebugPrint(TRACE, "FO %p, IRQL %d, Cpu %lu\n", FileObject,
> KeGetCurrentIrql(), KeGetCurrentProcessorNumber());
> +
> +    // store watches
> +    KeAcquireSpinLock(&Fdo->StoreWatchLock, &Irql);
> +    Node = Fdo->StoreWatchList.Flink;
> +    while (Node->Flink != Fdo->StoreWatchList.Flink) {
> +        StoreContext = CONTAINING_RECORD(Node,
> XENIFACE_STORE_CONTEXT, Entry);
> +
> +        Node = Node->Flink;
> +        if (StoreContext->FileObject != FileObject)
> +            continue;
> +
> +        XenIfaceDebugPrint(TRACE, "Store context %p\n", StoreContext);
> +        RemoveEntryList(&StoreContext->Entry);
> +        StoreFreeWatch(Fdo, StoreContext);
>      }
> +    KeReleaseSpinLock(&Fdo->StoreWatchLock, Irql);
> 
> -    status = STATUS_INVALID_PARAMETER;
> -    if (OutLen < Length)
> -        goto fail4;
> -
> -    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)->\"%s\"\n",
> __FUNCTION__, Buffer, Length, Value);
> -
> -    RtlCopyMemory(Buffer, Value, Length);
> -    Buffer[Length - 1] = 0;
> -    status = STATUS_SUCCESS;
> +    // event channels
> +    InitializeListHead(&ToFree);
> +    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
> +    Node = Fdo->EvtchnList.Flink;
> +    while (Node->Flink != Fdo->EvtchnList.Flink) {
> +        EvtchnContext = CONTAINING_RECORD(Node,
> XENIFACE_EVTCHN_CONTEXT, Entry);
> +
> +        Node = Node->Flink;
> +        if (EvtchnContext->FileObject != FileObject)
> +            continue;
> +
> +        XenIfaceDebugPrint(TRACE, "Evtchn context %p\n", EvtchnContext);
> +        RemoveEntryList(&EvtchnContext->Entry);
> +        // EvtchnFree requires PASSIVE_LEVEL and we're inside a lock
> +        InsertTailList(&ToFree, &EvtchnContext->Entry);
> +    }
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> 
> -done:
> -    *Info = (ULONG_PTR)Length;
> -    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> -    return status;
> +    Node = ToFree.Flink;
> +    while (Node->Flink != ToFree.Flink) {
> +        EvtchnContext = CONTAINING_RECORD(Node,
> XENIFACE_EVTCHN_CONTEXT, Entry);
> +        Node = Node->Flink;
> 
> -fail4:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")=(%d < %d)\n",
> __FUNCTION__, Buffer, OutLen, Length);
> -    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> -fail3:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__,
> Buffer);
> -fail2:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
> -fail1:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__,
> status);
> -    return status;
> +        RemoveEntryList(&EvtchnContext->Entry);
> +        EvtchnFree(Fdo, EvtchnContext);
>  }
> -
> -static DECLSPEC_NOINLINE NTSTATUS
> -IoctlWrite(
> -    __in  PXENIFACE_FDO         Fdo,
> -    __in  PCHAR             Buffer,
> -    __in  ULONG             InLen,
> -    __in  ULONG             OutLen
> -    )
> -{
> -    NTSTATUS    status;
> -    PCHAR       Value;
> -    ULONG       Length;
> -
> -    status = STATUS_INVALID_BUFFER_SIZE;
> -    if (InLen == 0 || OutLen != 0)
> -        goto fail1;
> -
> -    status = STATUS_INVALID_PARAMETER;
> -    if (!__IsValidStr(Buffer, InLen))
> -        goto fail2;
> -
> -    Length = (ULONG)strlen(Buffer) + 1;
> -    Value = Buffer + Length;
> -
> -    if (!__IsValidStr(Value, InLen - Length))
> -        goto fail3;
> -
> -    status = XENBUS_STORE(Printf, &Fdo->StoreInterface, NULL, NULL,
> Buffer, Value);
> -    if (!NT_SUCCESS(status))
> -        goto fail4;
> -
> -    XenIfaceDebugPrint(INFO, "|%s: (\"%s\"=\"%s\")\n", __FUNCTION__,
> Buffer, Value);
> -    return status;
> -
> -fail4:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")\n", __FUNCTION__,
> Value);
> -fail3:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__,
> Buffer);
> -fail2:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
> -fail1:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__,
> status);
> -    return status;
>  }
> 
> -static DECLSPEC_NOINLINE NTSTATUS
> -IoctlDirectory(
> +NTSTATUS
> +XenIfaceIoctl(
>      __in  PXENIFACE_FDO         Fdo,
> -    __in  PCHAR             Buffer,
> -    __in  ULONG             InLen,
> -    __in  ULONG             OutLen,
> -    __out PULONG_PTR        Info
> +    __inout  PIRP              Irp
>      )
>  {
>      NTSTATUS    status;
> -    PCHAR       Value;
> -    ULONG       Length;
> -    ULONG       Count;
> -
> -    status = STATUS_INVALID_BUFFER_SIZE;
> -    if (InLen == 0)
> -        goto fail1;
> -
> -    status = STATUS_INVALID_PARAMETER;
> -    if (!__IsValidStr(Buffer, InLen))
> -        goto fail2;
> -
> -    status = XENBUS_STORE(Directory, &Fdo->StoreInterface, NULL, NULL,
> Buffer, &Value);
> -    if (!NT_SUCCESS(status))
> -        goto fail3;
> -
> -    Length = __MultiSzLen(Value, &Count) + 1;
> +    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
> +    PVOID               Buffer = Irp->AssociatedIrp.SystemBuffer;
> +    ULONG               InLen = Stack-
> >Parameters.DeviceIoControl.InputBufferLength;
> +    ULONG               OutLen = Stack-
> >Parameters.DeviceIoControl.OutputBufferLength;
> 
> -    status = STATUS_BUFFER_OVERFLOW;
> -    if (OutLen == 0) {
> -        XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)(%d)\n",
> __FUNCTION__, Buffer, Length, Count);
> +    status = STATUS_DEVICE_NOT_READY;
> +    if (Fdo->InterfacesAcquired == FALSE)
>          goto done;
> -    }
> 
> -    status = STATUS_INVALID_PARAMETER;
> -    if (OutLen < Length)
> -        goto fail4;
> +    switch (Stack->Parameters.DeviceIoControl.IoControlCode) {
> +        // store
> +    case IOCTL_XENIFACE_STORE_READ:
> +        status = IoctlStoreRead(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp-
> >IoStatus.Information);
> +        break;
> 
> -    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)(%d)\n", __FUNCTION__,
> Buffer, Length, Count);
> -#if DBG
> -    __DisplayMultiSz(__FUNCTION__, Value);
> -#endif
> +    case IOCTL_XENIFACE_STORE_WRITE:
> +        status = IoctlStoreWrite(Fdo, (PCHAR)Buffer, InLen, OutLen);
> +        break;
> 
> -    RtlCopyMemory(Buffer, Value, Length);
> -    Buffer[Length - 2] = 0;
> -    Buffer[Length - 1] = 0;
> -    status = STATUS_SUCCESS;
> +    case IOCTL_XENIFACE_STORE_DIRECTORY:
> +        status = IoctlStoreDirectory(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp-
> >IoStatus.Information);
> +        break;
> 
> -done:
> -    *Info = (ULONG_PTR)Length;
> -    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> -    return status;
> +    case IOCTL_XENIFACE_STORE_REMOVE:
> +        status = IoctlStoreRemove(Fdo, (PCHAR)Buffer, InLen, OutLen);
> +        break;
> 
> -fail4:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")=(%d < %d)\n",
> __FUNCTION__, Buffer, OutLen, Length);
> -    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> -fail3:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__,
> Buffer);
> -fail2:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
> -fail1:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__,
> status);
> -    return status;
> -}
> +    case IOCTL_XENIFACE_STORE_SET_PERMISSIONS:
> +        status = IoctlStoreSetPermissions(Fdo, Buffer, InLen, OutLen);
> +        break;
> 
> -static DECLSPEC_NOINLINE NTSTATUS
> -IoctlRemove(
> -    __in  PXENIFACE_FDO         Fdo,
> -    __in  PCHAR             Buffer,
> -    __in  ULONG             InLen,
> -    __in  ULONG             OutLen
> -    )
> -{
> -    NTSTATUS    status;
> +    case IOCTL_XENIFACE_STORE_ADD_WATCH:
> +        status = IoctlStoreAddWatch(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject, &Irp->IoStatus.Information);
> +        break;
> 
> -    status = STATUS_INVALID_BUFFER_SIZE;
> -    if (InLen == 0 || OutLen != 0)
> -        goto fail1;
> +    case IOCTL_XENIFACE_STORE_REMOVE_WATCH:
> +        status = IoctlStoreRemoveWatch(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject);
> +        break;
> 
> -    status = STATUS_INVALID_PARAMETER;
> -    if (!__IsValidStr(Buffer, InLen))
> -        goto fail2;
> +        // evtchn
> +    case IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND:
> +        status = IoctlEvtchnBindUnbound(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject, &Irp->IoStatus.Information);
> +        break;
> 
> -    status = XENBUS_STORE(Remove, &Fdo->StoreInterface, NULL, NULL,
> Buffer);
> -    if (!NT_SUCCESS(status))
> -        goto fail3;
> +    case IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN:
> +        status = IoctlEvtchnBindInterdomain(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject, &Irp->IoStatus.Information);
> +        break;
> 
> -    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")\n", __FUNCTION__, Buffer);
> -    return status;
> +    case IOCTL_XENIFACE_EVTCHN_CLOSE:
> +        status = IoctlEvtchnClose(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject);
> +        break;
> 
> -fail3:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__,
> Buffer);
> -fail2:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
> -fail1:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__,
> status);
> -    return status;
> -}
> +    case IOCTL_XENIFACE_EVTCHN_NOTIFY:
> +        status = IoctlEvtchnNotify(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject);
> +        break;
> 
> -NTSTATUS
> -XenIFaceIoctl(
> -    __in  PXENIFACE_FDO         Fdo,
> -    __in  PIRP              Irp
> -    )
> -{
> -    NTSTATUS            status;
> -    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
> -    PVOID               Buffer = Irp->AssociatedIrp.SystemBuffer;
> -    ULONG               InLen = Stack-
> >Parameters.DeviceIoControl.InputBufferLength;
> -    ULONG               OutLen = Stack-
> >Parameters.DeviceIoControl.OutputBufferLength;
> +    case IOCTL_XENIFACE_EVTCHN_UNMASK:
> +        status = IoctlEvtchnUnmask(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject);
> +        break;
> 
> -    status = STATUS_DEVICE_NOT_READY;
> -    if (Fdo->InterfacesAcquired == FALSE)
> -        goto done;
> +        // gnttab
> +    case IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS:
> +        status = IoctlGnttabPermitForeignAccess(Fdo, Buffer, InLen, OutLen,
> Irp);
> +        break;
> 
> -    switch (Stack->Parameters.DeviceIoControl.IoControlCode) {
> -    case IOCTL_XENIFACE_STORE_READ:
> -        status = IoctlRead(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp-
> >IoStatus.Information);
> +    case IOCTL_XENIFACE_GNTTAB_GET_GRANT_RESULT:
> +        status = IoctlGnttabGetGrantResult(Fdo, Buffer, InLen, OutLen, &Irp-
> >IoStatus.Information);
>          break;
> 
> -    case IOCTL_XENIFACE_STORE_WRITE:
> -        status = IoctlWrite(Fdo, (PCHAR)Buffer, InLen, OutLen);
> +    case IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS:
> +        status = IoctlGnttabRevokeForeignAccess(Fdo, Buffer, InLen, OutLen);
>          break;
> 
> -    case IOCTL_XENIFACE_STORE_DIRECTORY:
> -        status = IoctlDirectory(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp-
> >IoStatus.Information);
> +    case IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES:
> +        status = IoctlGnttabMapForeignPages(Fdo, Buffer, InLen, OutLen, Irp);
>          break;
> 
> -    case IOCTL_XENIFACE_STORE_REMOVE:
> -        status = IoctlRemove(Fdo, (PCHAR)Buffer, InLen, OutLen);
> +    case IOCTL_XENIFACE_GNTTAB_GET_MAP_RESULT:
> +        status = IoctlGnttabGetMapResult(Fdo, Buffer, InLen, OutLen, &Irp-
> >IoStatus.Information);
> +        break;
> +
> +    case IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES:
> +        status = IoctlGnttabUnmapForeignPages(Fdo, Buffer, InLen, OutLen);
>          break;
> 
>      default:
> @@ -327,6 +196,7 @@ done:
> 
>  	Irp->IoStatus.Status = status;
> 
> +    if (status != STATUS_PENDING)
>  	IoCompleteRequest(Irp, IO_NO_INCREMENT);
> 
>      return status;
> diff --git a/src/xeniface/ioctls.h b/src/xeniface/ioctls.h
> index 7ee7801..00e11e4 100644
> --- a/src/xeniface/ioctls.h
> +++ b/src/xeniface/ioctls.h
> @@ -33,11 +33,322 @@
>  #define _IOCTLS_H_
> 
>  #define XENIFACE_KERNEL_MODE
> +#include "xeniface_ioctls.h"
> 
> +typedef enum _XENIFACE_CONTEXT_TYPE {
> +    XENIFACE_CONTEXT_GRANT = 1,
> +    XENIFACE_CONTEXT_MAP
> +} XENIFACE_CONTEXT_TYPE;
> +
> +typedef struct _XENIFACE_CONTEXT_ID {
> +    XENIFACE_CONTEXT_TYPE  Type;
> +    ULONG                  RequestId;
> +    PEPROCESS              Process;
> +} XENIFACE_CONTEXT_ID, *PXENIFACE_CONTEXT_ID;
> +
> +typedef struct _XENIFACE_STORE_CONTEXT {
> +    LIST_ENTRY             Entry;
> +    PXENBUS_STORE_WATCH    Watch;
> +    PKEVENT                Event;
> +    PVOID                  FileObject;
> +} XENIFACE_STORE_CONTEXT, *PXENIFACE_STORE_CONTEXT;
> +
> +typedef struct _XENIFACE_EVTCHN_CONTEXT {
> +    LIST_ENTRY             Entry;
> +    PXENBUS_EVTCHN_CHANNEL Channel;
> +    ULONG                  LocalPort;
> +    PKEVENT                Event;
> +    PXENIFACE_FDO          Fdo;
> +    BOOLEAN                Active;
> +    PVOID                  FileObject;
> +} XENIFACE_EVTCHN_CONTEXT, *PXENIFACE_EVTCHN_CONTEXT;
> +
> +typedef struct _XENIFACE_GRANT_CONTEXT {
> +    XENIFACE_CONTEXT_ID        Id;
> +    LIST_ENTRY                 Entry;
> +    PXENBUS_GNTTAB_ENTRY       *Grants;
> +    USHORT                     RemoteDomain;
> +    ULONG                      NumberPages;
> +    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
> +    ULONG                      NotifyOffset;
> +    ULONG                      NotifyPort;
> +    PVOID                      KernelVa;
> +    PVOID                      UserVa;
> +    PMDL                       Mdl;
> +} XENIFACE_GRANT_CONTEXT, *PXENIFACE_GRANT_CONTEXT;
> +
> +typedef struct _XENIFACE_MAP_CONTEXT {
> +    XENIFACE_CONTEXT_ID        Id;
> +    LIST_ENTRY                 Entry;
> +    USHORT                     RemoteDomain;
> +    ULONG                      NumberPages;
> +    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
> +    ULONG                      NotifyOffset;
> +    ULONG                      NotifyPort;
> +    PHYSICAL_ADDRESS           Address;
> +    PVOID                      KernelVa;
> +    PVOID                      UserVa;
> +    PMDL                       Mdl;
> +} XENIFACE_MAP_CONTEXT, *PXENIFACE_MAP_CONTEXT;
> +
> +NTSTATUS
> +XenIfaceIoctl(
> +    __in     PXENIFACE_FDO     Fdo,
> +    __inout  PIRP              Irp
> +    );
> +
> +_IRQL_requires_(PASSIVE_LEVEL)
> +VOID
> +XenIfaceCleanup(
> +    __in  PXENIFACE_FDO Fdo,
> +    __in  PFILE_OBJECT  FileObject
> +    );
> +
> +DECLSPEC_NOINLINE
>  NTSTATUS
> -XenIFaceIoctl(
> +IoctlStoreRead(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreWrite(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreDirectory(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRemove(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreSetPermissions(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreAddWatch(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRemoveWatch(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    );
> +
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +VOID
> +StoreFreeWatch(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_STORE_CONTEXT Context
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnBindUnbound(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnBindInterdomain(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnClose(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnNotify(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnUnmask(
>      __in  PXENIFACE_FDO         Fdo,
> -    __in  PIRP              Irp
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    );
> +
> +_Requires_lock_not_held_(Fdo->EvtchnLock)
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +EvtchnNotify(
> +    __in      PXENIFACE_FDO Fdo,
> +    __in      ULONG         LocalPort,
> +    __in_opt  PFILE_OBJECT  FileObject
> +    );
> +
> +_Function_class_(KDEFERRED_ROUTINE)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +_IRQL_requires_same_
> +VOID
> +EvtchnNotificationDpc(
> +    __in      PKDPC Dpc,
> +    __in_opt  PVOID Context,
> +    __in_opt  PVOID Argument1,
> +    __in_opt  PVOID Argument2
> +    );
> +
> +_IRQL_requires_(PASSIVE_LEVEL)
> +VOID
> +EvtchnFree(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_EVTCHN_CONTEXT Context
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabPermitForeignAccess(
> +    __in     PXENIFACE_FDO  Fdo,
> +    __in     PVOID          Buffer,
> +    __in     ULONG          InLen,
> +    __in     ULONG          OutLen,
> +    __inout  PIRP           Irp
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabGetGrantResult(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabRevokeForeignAccess(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabMapForeignPages(
> +    __in     PXENIFACE_FDO     Fdo,
> +    __in     PVOID             Buffer,
> +    __in     ULONG             InLen,
> +    __in     ULONG             OutLen,
> +    __inout  PIRP              Irp
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabGetMapResult(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabUnmapForeignPages(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    );
> +
> +_Acquires_exclusive_lock_(((PXENIFACE_FDO)Argument)-
> >GnttabCacheLock)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +VOID
> +GnttabAcquireLock(
> +    __in  PVOID Argument
> +    );
> +
> +_Releases_exclusive_lock_(((PXENIFACE_FDO)Argument)-
> >GnttabCacheLock)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +VOID
> +GnttabReleaseLock(
> +    __in  PVOID Argument
> +    );
> +
> +_Function_class_(IO_WORKITEM_ROUTINE)
> +VOID
> +CompleteGnttabIrp(
> +    __in      PDEVICE_OBJECT DeviceObject,
> +    __in_opt  PVOID          Context
> +    );
> +
> +_IRQL_requires_max_(APC_LEVEL)
> +VOID
> +GnttabFreeGrant(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_GRANT_CONTEXT Context
> +    );
> +
> +_IRQL_requires_max_(APC_LEVEL)
> +VOID
> +GnttabFreeMap(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_MAP_CONTEXT Context
>      );
> 
>  #endif // _IOCTLS_H_
> diff --git a/src/xeniface/irp_queue.c b/src/xeniface/irp_queue.c
> new file mode 100644
> index 0000000..c3bf86c
> --- /dev/null
> +++ b/src/xeniface/irp_queue.c
> @@ -0,0 +1,131 @@
> +#include "driver.h"
> +#include "irp_queue.h"
> +#include "log.h"
> +#include "ioctls.h"
> +
> +// Cancel-safe IRP queue implementation
> +
> +NTSTATUS
> +CsqInsertIrpEx(
> +    _In_  PIO_CSQ Csq,
> +    _In_  PIRP    Irp,
> +    _In_  PVOID   InsertContext // PXENIFACE_CONTEXT_ID
> +    )
> +{
> +    PXENIFACE_FDO Fdo;
> +
> +    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
> +
> +    // Fail if a request with the same ID already exists.
> +    if (CsqPeekNextIrp(Csq, NULL, InsertContext) != NULL)
> +        return STATUS_INVALID_PARAMETER;
> +
> +    InsertTailList(&Fdo->IrpList, &Irp->Tail.Overlay.ListEntry);
> +    return STATUS_SUCCESS;
> +}
> +
> +VOID
> +CsqRemoveIrp(
> +    _In_  PIO_CSQ Csq,
> +    _In_  PIRP    Irp
> +    )
> +{
> +    UNREFERENCED_PARAMETER(Csq);
> +
> +    RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
> +}
> +
> +PIRP
> +CsqPeekNextIrp(
> +    _In_      PIO_CSQ Csq,
> +    _In_opt_  PIRP    Irp,
> +    _In_opt_  PVOID   PeekContext // PXENIFACE_CONTEXT_ID
> +    )
> +{
> +    PXENIFACE_FDO        Fdo;
> +    PIRP                 NextIrp = NULL;
> +    PLIST_ENTRY          Head, NextEntry;
> +    PXENIFACE_CONTEXT_ID Id, TargetId;
> +
> +    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
> +    TargetId = PeekContext;
> +    Head = &Fdo->IrpList;
> +
> +    // If the IRP is NULL, we will start peeking from the list head,
> +    // else we will start from that IRP onwards. This is done under the
> +    // assumption that new IRPs are always inserted at the tail.
> +
> +    if (Irp == NULL) {
> +        NextEntry = Head->Flink;
> +    } else {
> +        NextEntry = Irp->Tail.Overlay.ListEntry.Flink;
> +    }
> +
> +    while (NextEntry != Head) {
> +        NextIrp = CONTAINING_RECORD(NextEntry, IRP, Tail.Overlay.ListEntry);
> +
> +        if (PeekContext) {
> +            Id = NextIrp->Tail.Overlay.DriverContext[0];
> +            if (Id->RequestId == TargetId->RequestId && Id->Process ==
> TargetId->Process)
> +                break;
> +        } else {
> +            break;
> +        }
> +        NextIrp = NULL;
> +        NextEntry = NextEntry->Flink;
> +    }
> +
> +    return NextIrp;
> +}
> +
> +_IRQL_raises_(DISPATCH_LEVEL)
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +_Acquires_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)-
> >IrpQueueLock)
> +VOID
> +CsqAcquireLock(
> +    _In_                                       PIO_CSQ Csq,
> +    _Out_ _At_(*Irql, _Post_ _IRQL_saves_)     PKIRQL  Irql
> +    )
> +{
> +    PXENIFACE_FDO Fdo;
> +
> +    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
> +
> +    KeAcquireSpinLock(&Fdo->IrpQueueLock, Irql);
> +}
> +
> +_IRQL_requires_(DISPATCH_LEVEL)
> +_Releases_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)-
> >IrpQueueLock)
> +VOID
> +CsqReleaseLock(
> +    _In_                    PIO_CSQ Csq,
> +    _In_ _IRQL_restores_    KIRQL   Irql
> +    )
> +{
> +    PXENIFACE_FDO Fdo;
> +
> +    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
> +
> +    KeReleaseSpinLock(&Fdo->IrpQueueLock, Irql);
> +}
> +
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +VOID
> +CsqCompleteCanceledIrp(
> +    _In_  PIO_CSQ Csq,
> +    _In_  PIRP    Irp
> +    )
> +{
> +    PXENIFACE_FDO Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO,
> IrpQueue);
> +    PIO_WORKITEM WorkItem;
> +
> +    XenIfaceDebugPrint(TRACE, "Irp %p, IRQL %d\n",
> +                       Irp, KeGetCurrentIrql());
> +
> +    // This is not guaranteed to run at PASSIVE_LEVEL, so queue a work item
> +    // to perform actual cleanup/IRP completion.
> +
> +    WorkItem = IoAllocateWorkItem(Fdo->Dx->DeviceObject);
> +    Irp->Tail.Overlay.DriverContext[1] = WorkItem; // store so the work item
> can free it
> +    IoQueueWorkItem(WorkItem, CompleteGnttabIrp, DelayedWorkQueue,
> Irp);
> +}
> diff --git a/src/xeniface/irp_queue.h b/src/xeniface/irp_queue.h
> new file mode 100644
> index 0000000..746ee19
> --- /dev/null
> +++ b/src/xeniface/irp_queue.h
> @@ -0,0 +1,50 @@
> +#ifndef _IRP_QUEUE_H_
> +#define _IRP_QUEUE_H_
> +
> +#include <ntddk.h>
> +
> +NTSTATUS
> +CsqInsertIrpEx(
> +    _In_  PIO_CSQ Csq,
> +    _In_  PIRP    Irp,
> +    _In_  PVOID   InsertContext
> +    );
> +
> +VOID
> +CsqRemoveIrp(
> +    _In_  PIO_CSQ Csq,
> +    _In_  PIRP    Irp
> +    );
> +
> +PIRP
> +CsqPeekNextIrp(
> +    _In_      PIO_CSQ Csq,
> +    _In_opt_  PIRP    Irp,
> +    _In_opt_  PVOID   PeekContext // PXENIFACE_CONTEXT_ID
> +    );
> +
> +_IRQL_raises_(DISPATCH_LEVEL)
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +_Acquires_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)-
> >IrpQueueLock)
> +VOID
> +CsqAcquireLock(
> +    _In_                                       PIO_CSQ Csq,
> +    _Out_ _At_(*Irql, _Post_ _IRQL_saves_)     PKIRQL  Irql
> +    );
> +
> +_IRQL_requires_(DISPATCH_LEVEL)
> +_Releases_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)-
> >IrpQueueLock)
> +VOID
> +CsqReleaseLock(
> +    _In_                    PIO_CSQ Csq,
> +    _In_ _IRQL_restores_    KIRQL   Irql
> +    );
> +
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +VOID
> +CsqCompleteCanceledIrp(
> +    _In_  PIO_CSQ             Csq,
> +    _In_  PIRP                Irp
> +    );
> +
> +#endif
> diff --git a/vs2013/xeniface/xeniface.vcxproj
> b/vs2013/xeniface/xeniface.vcxproj
> index fea2ad1..14f1338 100644
> --- a/vs2013/xeniface/xeniface.vcxproj
> +++ b/vs2013/xeniface/xeniface.vcxproj
> @@ -131,6 +131,10 @@
>      <ClCompile Include="../../src/xeniface/fdo.c" />
>      <ClCompile Include="../../src/xeniface/registry.c" />
>      <ClCompile Include="../../src\xeniface/thread.c" />
> +    <ClCompile Include="..\..\src\xeniface\ioctl_evtchn.c" />
> +    <ClCompile Include="..\..\src\xeniface\ioctl_gnttab.c" />
> +    <ClCompile Include="..\..\src\xeniface\ioctl_store.c" />
> +    <ClCompile Include="..\..\src\xeniface\irp_queue.c" />
>    </ItemGroup>
>    <ItemGroup>
>      <Mofcomp Include="../../src/xeniface/wmi.mof">
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Oct 14 10:36:38 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 14 Oct 2015 10:36: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 1ZmJQE-0005z2-1C; Wed, 14 Oct 2015 10:36:38 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72274ee0c=Paul.Durrant@citrix.com>)
	id 1ZmJQD-0005yw-83
	for win-pv-devel@lists.xenproject.org; Wed, 14 Oct 2015 10:36:37 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	E8/57-30270-4303E165; Wed, 14 Oct 2015 10:36:36 +0000
X-Env-Sender: prvs=72274ee0c=Paul.Durrant@citrix.com
X-Msg-Ref: server-11.tower-206.messagelabs.com!1444818994!38068815!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4415 invoked from network); 14 Oct 2015 10:36:34 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-11.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2015 10:36:34 -0000
X-IronPort-AV: E=Sophos;i="5.17,681,1437436800"; 
   d="scan'208";a="5192076"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 5/5] Bind to the latest XENBUS revision
Thread-Index: AQHRALuDniOGK4i9sEOJP56NNyuNiZ5q1uDQ
Date: Wed, 14 Oct 2015 10:36:33 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F611110@AMSPEX01CL01.citrite.net>
References: <5614A43D.6060003@invisiblethingslab.com>
In-Reply-To: <5614A43D.6060003@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] [PATCH 5/5] Bind to the latest XENBUS revision
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 Rafal Wojdyla
> Sent: 07 October 2015 05:49
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 5/5] Bind to the latest XENBUS revision
> 
> Revision 0x0800000B or later is needed for STORE interface version 2 and
> GNTTAB interface version 2.
> 
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>

Acked-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 b3112b9..df0abf3 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_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_IFACE&R
> EV_08000009
> -%XenIfaceDevice.DeviceDesc% =XenIface_Device,
> XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_IFACE&REV_08000009
> -%XenIfaceDevice.DeviceDesc% =XenIface_Device,
> XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_IFACE&REV_08000009
> +%XenIfaceDevice.DeviceDesc% =XenIface_Device,
> XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_IFACE&R
> EV_0800000B
> +%XenIfaceDevice.DeviceDesc% =XenIface_Device,
> XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_IFACE&REV_0800000B
> +%XenIfaceDevice.DeviceDesc% =XenIface_Device,
> XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_IFACE&REV_0800000B
> 
>  [XenIface_Device.NT$ARCH$]
>  CopyFiles=XenIface_Device.NT.Copy, ServiceDestDir.NT.Copy
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Oct 14 10:36:38 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 14 Oct 2015 10:36: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 1ZmJQE-0005z2-1C; Wed, 14 Oct 2015 10:36:38 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72274ee0c=Paul.Durrant@citrix.com>)
	id 1ZmJQD-0005yw-83
	for win-pv-devel@lists.xenproject.org; Wed, 14 Oct 2015 10:36:37 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	E8/57-30270-4303E165; Wed, 14 Oct 2015 10:36:36 +0000
X-Env-Sender: prvs=72274ee0c=Paul.Durrant@citrix.com
X-Msg-Ref: server-11.tower-206.messagelabs.com!1444818994!38068815!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4415 invoked from network); 14 Oct 2015 10:36:34 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-11.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2015 10:36:34 -0000
X-IronPort-AV: E=Sophos;i="5.17,681,1437436800"; 
   d="scan'208";a="5192076"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 5/5] Bind to the latest XENBUS revision
Thread-Index: AQHRALuDniOGK4i9sEOJP56NNyuNiZ5q1uDQ
Date: Wed, 14 Oct 2015 10:36:33 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F611110@AMSPEX01CL01.citrite.net>
References: <5614A43D.6060003@invisiblethingslab.com>
In-Reply-To: <5614A43D.6060003@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] [PATCH 5/5] Bind to the latest XENBUS revision
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 Rafal Wojdyla
> Sent: 07 October 2015 05:49
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 5/5] Bind to the latest XENBUS revision
> 
> Revision 0x0800000B or later is needed for STORE interface version 2 and
> GNTTAB interface version 2.
> 
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>

Acked-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 b3112b9..df0abf3 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_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_IFACE&R
> EV_08000009
> -%XenIfaceDevice.DeviceDesc% =XenIface_Device,
> XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_IFACE&REV_08000009
> -%XenIfaceDevice.DeviceDesc% =XenIface_Device,
> XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_IFACE&REV_08000009
> +%XenIfaceDevice.DeviceDesc% =XenIface_Device,
> XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_IFACE&R
> EV_0800000B
> +%XenIfaceDevice.DeviceDesc% =XenIface_Device,
> XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_IFACE&REV_0800000B
> +%XenIfaceDevice.DeviceDesc% =XenIface_Device,
> XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_IFACE&REV_0800000B
> 
>  [XenIface_Device.NT$ARCH$]
>  CopyFiles=XenIface_Device.NT.Copy, ServiceDestDir.NT.Copy
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Oct 14 13:07:00 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 14 Oct 2015 13:07:00 +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 1ZmLlj-0002Sl-So; Wed, 14 Oct 2015 13:06:59 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1ZmLli-0002SB-GD
	for win-pv-devel@lists.xenproject.org; Wed, 14 Oct 2015 13:06:58 +0000
Received: from [85.158.139.211] by server-5.bemta-5.messagelabs.com id
	63/50-03819-1735E165; Wed, 14 Oct 2015 13:06:57 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-6.tower-206.messagelabs.com!1444828016!42236390!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 2393 invoked from network); 14 Oct 2015 13:06:56 -0000
Received: from out1-smtp.messagingengine.com (HELO
	out1-smtp.messagingengine.com) (66.111.4.25)
	by server-6.tower-206.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Oct 2015 13:06:56 -0000
Received: from compute5.internal (compute5.nyi.internal [10.202.2.45])
	by mailout.nyi.internal (Postfix) with ESMTP id E3FFB20BE2
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 14 Oct 2015 09:06:55 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute5.internal (MEProxy); Wed, 14 Oct 2015 09:06:55 -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=lbbL38asytmIG2Ld
	u7suKnp857c=; b=lc+8fsu0jk3/MfMZsPY9fV6rGv4V5AlkeXwpvBSwapqaIxl9
	50cNuydouchP/0EeWAgbksRTq6VsIH0IrI/GwpZcIULvJMeEhBx5nK/jHMz0wC9X
	kExVT9aeyBljRiWa+a6psshKbT3ff1Q520P2xsMmgpvWcNezwXC9c0F2svM=
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=lbbL38asytmIG2L
	du7suKnp857c=; b=tEfnMR/hsN9G2kARkuZuoxoEtDMCFjPkW0oUyMf7eH0KvWE
	gOFmwMOPkVT4nhYyOyihueTdfotJ7dOxYVJzPikiOGzDEvEovMjmJ1rV4dtAlaOQ
	pmHEHeVf9EIEIB7O4153MQ6NdfZyKOVwRPVBJirdzjiEyq3uUYsQuG3Q4GzM=
X-Sasl-enc: ob4TacWZjhgt6D2moxRm4zBS91PfPXxdKHDBEM2Tv7mI 1444828015
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 4D9C2680105;
	Wed, 14 Oct 2015 09:06:55 -0400 (EDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <5614A427.4090002@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F610AED@AMSPEX01CL01.citrite.net>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1110
Message-ID: <561E5370.6060504@invisiblethingslab.com>
Date: Wed, 14 Oct 2015 15:06:56 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F610AED@AMSPEX01CL01.citrite.net>
Content-Length: 3648
Subject: Re: [win-pv-devel] [PATCH 3/5] Define new IOCTLs for user-mode
 clients
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

T24gMjAxNS0xMC0xNCAxMDo0NywgUGF1bCBEdXJyYW50IHdyb3RlOgo+PiAtLS0tLU9yaWdpbmFs
IE1lc3NhZ2UtLS0tLQo+PiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNlc0BsaXN0cy54ZW5wcm9q
ZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0KPj4gYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0
Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGEKPj4gU2VudDogMDcgT2N0b2JlciAyMDE1
IDA1OjQ5Cj4+IFRvOiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKPj4gU3ViamVj
dDogW3dpbi1wdi1kZXZlbF0gW1BBVENIIDMvNV0gRGVmaW5lIG5ldyBJT0NUTHMgZm9yIHVzZXIt
bW9kZQo+PiBjbGllbnRzCj4+Cj4+IElPQ1RMIGlucHV0IGlzIGRlZmluZWQgYXMgWEVOSUZBQ0Vf
Kl9JTiBzdHJ1Y3RzLgo+PiBJT0NUTCBvdXRwdXQgaXMgZGVmaW5lZCBhcyBYRU5JRkFDRV8qX09V
VCBzdHJ1Y3RzLgo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBSYWZhbCBXb2pkeWxhIDxvbWVnQGludmlz
aWJsZXRoaW5nc2xhYi5jb20+CgpJJ2xsIG9taXQgdGhlIGNvZGUgd2hlcmUgdGhlcmUncyBubyBy
ZW1hcmtzIG9yIEkgZ2VuZXJhbGx5IGFncmVlIHdpdGgKeW91ciBjb21tZW50cy4KCj4+ICsvLyBE
ZWZpbmUgb25seSBmb3IgdXNlciBtb2RlIGNsaWVudHMuCj4+ICsjaWZuZGVmIFhFTklGQUNFX0tF
Uk5FTF9NT0RFCj4+ICsKPiAKPiBDb3VsZCB5b3Ugbm90IHVzZSBfV0lORExMIHRvIGRldGVybWlu
ZSBrZXJuZWwtbW9kZSB2cy4gdXNlci1tb2RlIGluY2x1c2lvbiwgdGhlIHNhbWUgYXMgdGhlIGlu
dGVyZmFjZSBoZWFkZXJzIGRvPwo+IApJIHdhbnRlZCB0byBidXQgaXQncyBub3QgZGVmaW5lZCBm
b3IgRVhFcy4gQ291bGRuJ3QgZmluZCBhbiBhbHRlcm5hdGl2ZQppbiBwcmVkZWZpbmVkIG1hY3Jv
cy4uLgoKPj4gK3R5cGVkZWYgZW51bSBfWEVOQlVTX1NUT1JFX1BFUk1JU1NJT05fTUFTSyB7Cj4+
ICsgICAgWEVOQlVTX1NUT1JFX1BFUk1fTk9ORSA9IDAsCj4+ICsgICAgWEVOQlVTX1NUT1JFX1BF
Uk1fUkVBRCA9IDEsCj4+ICsgICAgWEVOQlVTX1NUT1JFX1BFUk1fV1JJVEUgPSAyLAo+PiArfSBY
RU5CVVNfU1RPUkVfUEVSTUlTU0lPTl9NQVNLOwo+PiArCj4+ICt0eXBlZGVmIHN0cnVjdCBfWEVO
QlVTX1NUT1JFX1BFUk1JU1NJT04gewo+PiArICAgIFVTSE9SVCBEb21haW47Cj4+ICsgICAgWEVO
QlVTX1NUT1JFX1BFUk1JU1NJT05fTUFTSyBNYXNrOwo+PiArfSBYRU5CVVNfU1RPUkVfUEVSTUlT
U0lPTiwgKlBYRU5CVVNfU1RPUkVfUEVSTUlTU0lPTjsKPj4gKwo+PiArI2VuZGlmCj4gCj4gU2hv
dWxkbid0IHRoZXNlIGJlIHByZWZpeGVkIFhFTklGQUNFXyByYXRoZXIgdGhhbiBYRU5CVVNfPwo+
IApUaGVzZSBhcmUgZGVmaW5lZCBpbiB4ZW5idXMnIHN0b3JlX2ludGVyZmFjZS5oLiBJIGRvbid0
IGxpa2UgY29weWluZwpjb2RlIGxpa2UgdGhhdCBidXQgdGhlIGRhdGEgZm9ybWF0IGlzIHdoYXQg
Ym90aCBzaWRlcyBleHBlY3QuIEkgY291bGQKdXNlIHNvbWV0aGluZyBlbHNlIGZvciB1c2VyIG1v
ZGUgYnV0IHRoYXQgd291bGQgYmUganVzdCBpbnZlbnRpbmcgYSBuZXcKZm9ybWF0IGZvciBubyBy
ZWFsIHJlYXNvbi4gT3IgbWF5YmUgaXQgd291bGQgbWFrZSBzZW5zZSBmb3IgcmVhZGFiaWxpdHkK
Zm9yIHNvbWVvbmUgd3JpdGluZyBhIHVzZXIgbW9kZSBjbGllbnQ/Cgo+PiArI3ByYWdtYSB3YXJu
aW5nKHB1c2gpCj4+ICsjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MjAwKSAvLyBub25zdGFuZGFy
ZCBleHRlbnNpb24gdXNlZCA6IHplcm8tc2l6ZWQKPj4gYXJyYXkgaW4gc3RydWN0L3VuaW9uCj4g
Cj4gQ291bGQgeW91IG5vdCBqdXN0IHNwZWNpZnkgYW4gYXJyYXkgbGVuZ3RoIG9mIG9uZSB0byBh
dm9pZCB0aGUgbmVlZCBmb3IgdGhpcyAjcHJhZ21hLiBUaGF0J3MgZ2VuZXJhbGx5IGhvdyBXaW5k
b3dzIEFQSXMgb2YgdGhpcyBuYXR1cmUgc3BlY2lmeSB0aGVpciBzdHJ1Y3R1cmVzLgo+IApJIHdh
cyB1c2VkIHRvIHVzaW5nIHplcm8tc2l6ZWQgYXJyYXlzIGluIGNhc2VzIGxpa2UgdGhpcyBiZWNh
dXNlIGl0IG1hZGUKbGF0ZXIgc2l6ZSBjYWxjdWxhdGlvbnMgY2xlYW5lci4gRklFTERfT0ZGU0VU
IG1ha2VzIHRoaXMgYSBub24gaXNzdWUKdGhvdWdoIHNvIEkgYWdyZWUgd2l0aCB5b3VyIGNvbW1l
bnQuCgo+PiArdHlwZWRlZiBzdHJ1Y3QgX1hFTklGQUNFX0dOVFRBQl9QRVJNSVRfRk9SRUlHTl9B
Q0NFU1NfSU4gewo+PiArICAgIFVMT05HIFJlcXVlc3RJZDsgLy8gc2hvdWxkIGJlIHVuaXF1ZSBm
b3IgZWFjaCByZXF1ZXN0Cj4gCj4gSXMgdGhhdCB1bmlxdWUgZ2xvYmFsbHksIHBlci1wcm9jZXNz
IG9yIHBlci10aHJlYWQ/IFBlci10aHJlYWQgd291bGQgYmUgbW9zdCBjb252ZW5pZW50IGZvciB0
aGUgdXNlciwgSSBndWVzcy4KPiAKSXQncyBwZXItcHJvY2VzcyByaWdodCBub3cuCgotLSAKUmFm
YcWCIFdvamR5xYJhClF1YmVzIFRvb2xzIGZvciBXaW5kb3dzIGRldmVsb3BlcgpodHRwczovL3d3
dy5xdWJlcy1vcy5vcmcvCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fXwp3aW4tcHYtZGV2ZWwgbWFpbGluZyBsaXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5w
cm9qZWN0Lm9yZwpodHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xp
c3RpbmZvL3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Wed Oct 14 13:07:00 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 14 Oct 2015 13:07:00 +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 1ZmLlj-0002Sl-So; Wed, 14 Oct 2015 13:06:59 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1ZmLli-0002SB-GD
	for win-pv-devel@lists.xenproject.org; Wed, 14 Oct 2015 13:06:58 +0000
Received: from [85.158.139.211] by server-5.bemta-5.messagelabs.com id
	63/50-03819-1735E165; Wed, 14 Oct 2015 13:06:57 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-6.tower-206.messagelabs.com!1444828016!42236390!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 2393 invoked from network); 14 Oct 2015 13:06:56 -0000
Received: from out1-smtp.messagingengine.com (HELO
	out1-smtp.messagingengine.com) (66.111.4.25)
	by server-6.tower-206.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Oct 2015 13:06:56 -0000
Received: from compute5.internal (compute5.nyi.internal [10.202.2.45])
	by mailout.nyi.internal (Postfix) with ESMTP id E3FFB20BE2
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 14 Oct 2015 09:06:55 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute5.internal (MEProxy); Wed, 14 Oct 2015 09:06:55 -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=lbbL38asytmIG2Ld
	u7suKnp857c=; b=lc+8fsu0jk3/MfMZsPY9fV6rGv4V5AlkeXwpvBSwapqaIxl9
	50cNuydouchP/0EeWAgbksRTq6VsIH0IrI/GwpZcIULvJMeEhBx5nK/jHMz0wC9X
	kExVT9aeyBljRiWa+a6psshKbT3ff1Q520P2xsMmgpvWcNezwXC9c0F2svM=
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=lbbL38asytmIG2L
	du7suKnp857c=; b=tEfnMR/hsN9G2kARkuZuoxoEtDMCFjPkW0oUyMf7eH0KvWE
	gOFmwMOPkVT4nhYyOyihueTdfotJ7dOxYVJzPikiOGzDEvEovMjmJ1rV4dtAlaOQ
	pmHEHeVf9EIEIB7O4153MQ6NdfZyKOVwRPVBJirdzjiEyq3uUYsQuG3Q4GzM=
X-Sasl-enc: ob4TacWZjhgt6D2moxRm4zBS91PfPXxdKHDBEM2Tv7mI 1444828015
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 4D9C2680105;
	Wed, 14 Oct 2015 09:06:55 -0400 (EDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <5614A427.4090002@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F610AED@AMSPEX01CL01.citrite.net>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1110
Message-ID: <561E5370.6060504@invisiblethingslab.com>
Date: Wed, 14 Oct 2015 15:06:56 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F610AED@AMSPEX01CL01.citrite.net>
Content-Length: 3648
Subject: Re: [win-pv-devel] [PATCH 3/5] Define new IOCTLs for user-mode
 clients
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

T24gMjAxNS0xMC0xNCAxMDo0NywgUGF1bCBEdXJyYW50IHdyb3RlOgo+PiAtLS0tLU9yaWdpbmFs
IE1lc3NhZ2UtLS0tLQo+PiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNlc0BsaXN0cy54ZW5wcm9q
ZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0KPj4gYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0
Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGEKPj4gU2VudDogMDcgT2N0b2JlciAyMDE1
IDA1OjQ5Cj4+IFRvOiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKPj4gU3ViamVj
dDogW3dpbi1wdi1kZXZlbF0gW1BBVENIIDMvNV0gRGVmaW5lIG5ldyBJT0NUTHMgZm9yIHVzZXIt
bW9kZQo+PiBjbGllbnRzCj4+Cj4+IElPQ1RMIGlucHV0IGlzIGRlZmluZWQgYXMgWEVOSUZBQ0Vf
Kl9JTiBzdHJ1Y3RzLgo+PiBJT0NUTCBvdXRwdXQgaXMgZGVmaW5lZCBhcyBYRU5JRkFDRV8qX09V
VCBzdHJ1Y3RzLgo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBSYWZhbCBXb2pkeWxhIDxvbWVnQGludmlz
aWJsZXRoaW5nc2xhYi5jb20+CgpJJ2xsIG9taXQgdGhlIGNvZGUgd2hlcmUgdGhlcmUncyBubyBy
ZW1hcmtzIG9yIEkgZ2VuZXJhbGx5IGFncmVlIHdpdGgKeW91ciBjb21tZW50cy4KCj4+ICsvLyBE
ZWZpbmUgb25seSBmb3IgdXNlciBtb2RlIGNsaWVudHMuCj4+ICsjaWZuZGVmIFhFTklGQUNFX0tF
Uk5FTF9NT0RFCj4+ICsKPiAKPiBDb3VsZCB5b3Ugbm90IHVzZSBfV0lORExMIHRvIGRldGVybWlu
ZSBrZXJuZWwtbW9kZSB2cy4gdXNlci1tb2RlIGluY2x1c2lvbiwgdGhlIHNhbWUgYXMgdGhlIGlu
dGVyZmFjZSBoZWFkZXJzIGRvPwo+IApJIHdhbnRlZCB0byBidXQgaXQncyBub3QgZGVmaW5lZCBm
b3IgRVhFcy4gQ291bGRuJ3QgZmluZCBhbiBhbHRlcm5hdGl2ZQppbiBwcmVkZWZpbmVkIG1hY3Jv
cy4uLgoKPj4gK3R5cGVkZWYgZW51bSBfWEVOQlVTX1NUT1JFX1BFUk1JU1NJT05fTUFTSyB7Cj4+
ICsgICAgWEVOQlVTX1NUT1JFX1BFUk1fTk9ORSA9IDAsCj4+ICsgICAgWEVOQlVTX1NUT1JFX1BF
Uk1fUkVBRCA9IDEsCj4+ICsgICAgWEVOQlVTX1NUT1JFX1BFUk1fV1JJVEUgPSAyLAo+PiArfSBY
RU5CVVNfU1RPUkVfUEVSTUlTU0lPTl9NQVNLOwo+PiArCj4+ICt0eXBlZGVmIHN0cnVjdCBfWEVO
QlVTX1NUT1JFX1BFUk1JU1NJT04gewo+PiArICAgIFVTSE9SVCBEb21haW47Cj4+ICsgICAgWEVO
QlVTX1NUT1JFX1BFUk1JU1NJT05fTUFTSyBNYXNrOwo+PiArfSBYRU5CVVNfU1RPUkVfUEVSTUlT
U0lPTiwgKlBYRU5CVVNfU1RPUkVfUEVSTUlTU0lPTjsKPj4gKwo+PiArI2VuZGlmCj4gCj4gU2hv
dWxkbid0IHRoZXNlIGJlIHByZWZpeGVkIFhFTklGQUNFXyByYXRoZXIgdGhhbiBYRU5CVVNfPwo+
IApUaGVzZSBhcmUgZGVmaW5lZCBpbiB4ZW5idXMnIHN0b3JlX2ludGVyZmFjZS5oLiBJIGRvbid0
IGxpa2UgY29weWluZwpjb2RlIGxpa2UgdGhhdCBidXQgdGhlIGRhdGEgZm9ybWF0IGlzIHdoYXQg
Ym90aCBzaWRlcyBleHBlY3QuIEkgY291bGQKdXNlIHNvbWV0aGluZyBlbHNlIGZvciB1c2VyIG1v
ZGUgYnV0IHRoYXQgd291bGQgYmUganVzdCBpbnZlbnRpbmcgYSBuZXcKZm9ybWF0IGZvciBubyBy
ZWFsIHJlYXNvbi4gT3IgbWF5YmUgaXQgd291bGQgbWFrZSBzZW5zZSBmb3IgcmVhZGFiaWxpdHkK
Zm9yIHNvbWVvbmUgd3JpdGluZyBhIHVzZXIgbW9kZSBjbGllbnQ/Cgo+PiArI3ByYWdtYSB3YXJu
aW5nKHB1c2gpCj4+ICsjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MjAwKSAvLyBub25zdGFuZGFy
ZCBleHRlbnNpb24gdXNlZCA6IHplcm8tc2l6ZWQKPj4gYXJyYXkgaW4gc3RydWN0L3VuaW9uCj4g
Cj4gQ291bGQgeW91IG5vdCBqdXN0IHNwZWNpZnkgYW4gYXJyYXkgbGVuZ3RoIG9mIG9uZSB0byBh
dm9pZCB0aGUgbmVlZCBmb3IgdGhpcyAjcHJhZ21hLiBUaGF0J3MgZ2VuZXJhbGx5IGhvdyBXaW5k
b3dzIEFQSXMgb2YgdGhpcyBuYXR1cmUgc3BlY2lmeSB0aGVpciBzdHJ1Y3R1cmVzLgo+IApJIHdh
cyB1c2VkIHRvIHVzaW5nIHplcm8tc2l6ZWQgYXJyYXlzIGluIGNhc2VzIGxpa2UgdGhpcyBiZWNh
dXNlIGl0IG1hZGUKbGF0ZXIgc2l6ZSBjYWxjdWxhdGlvbnMgY2xlYW5lci4gRklFTERfT0ZGU0VU
IG1ha2VzIHRoaXMgYSBub24gaXNzdWUKdGhvdWdoIHNvIEkgYWdyZWUgd2l0aCB5b3VyIGNvbW1l
bnQuCgo+PiArdHlwZWRlZiBzdHJ1Y3QgX1hFTklGQUNFX0dOVFRBQl9QRVJNSVRfRk9SRUlHTl9B
Q0NFU1NfSU4gewo+PiArICAgIFVMT05HIFJlcXVlc3RJZDsgLy8gc2hvdWxkIGJlIHVuaXF1ZSBm
b3IgZWFjaCByZXF1ZXN0Cj4gCj4gSXMgdGhhdCB1bmlxdWUgZ2xvYmFsbHksIHBlci1wcm9jZXNz
IG9yIHBlci10aHJlYWQ/IFBlci10aHJlYWQgd291bGQgYmUgbW9zdCBjb252ZW5pZW50IGZvciB0
aGUgdXNlciwgSSBndWVzcy4KPiAKSXQncyBwZXItcHJvY2VzcyByaWdodCBub3cuCgotLSAKUmFm
YcWCIFdvamR5xYJhClF1YmVzIFRvb2xzIGZvciBXaW5kb3dzIGRldmVsb3BlcgpodHRwczovL3d3
dy5xdWJlcy1vcy5vcmcvCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fXwp3aW4tcHYtZGV2ZWwgbWFpbGluZyBsaXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5w
cm9qZWN0Lm9yZwpodHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xp
c3RpbmZvL3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Wed Oct 14 13:20:24 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 14 Oct 2015 13:20: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 1ZmLyi-0004tF-05; Wed, 14 Oct 2015 13:20:24 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72274ee0c=Paul.Durrant@citrix.com>)
	id 1ZmLyg-0004ss-Ml
	for win-pv-devel@lists.xenproject.org; Wed, 14 Oct 2015 13:20:22 +0000
Received: from [85.158.137.68] by server-16.bemta-3.messagelabs.com id
	6C/AF-03763-5965E165; Wed, 14 Oct 2015 13:20:21 +0000
X-Env-Sender: prvs=72274ee0c=Paul.Durrant@citrix.com
X-Msg-Ref: server-4.tower-31.messagelabs.com!1444828821!51920856!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 5912 invoked from network); 14 Oct 2015 13:20:21 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-4.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2015 13:20:21 -0000
X-IronPort-AV: E=Sophos;i="5.17,681,1437436800"; 
   d="scan'208";a="5207041"
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] [PATCH 3/5] Define new IOCTLs for user-mode
	clients
Thread-Index: AQHRALt5ge+iF7M0hkK0Cbb2e7WCHJ5qtBtwgAArTgCAACPrMA==
Date: Wed, 14 Oct 2015 13:20:20 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F611764@AMSPEX01CL01.citrite.net>
References: <5614A427.4090002@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F610AED@AMSPEX01CL01.citrite.net>
	<561E5370.6060504@invisiblethingslab.com>
In-Reply-To: <561E5370.6060504@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] [PATCH 3/5] Define new IOCTLs for user-mode
 clients
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
MTQgT2N0b2JlciAyMDE1IDE0OjA3DQo+IFRvOiBQYXVsIER1cnJhbnQ7IHdpbi1wdi1kZXZlbEBs
aXN0cy54ZW5wcm9qZWN0Lm9yZw0KPiBTdWJqZWN0OiBSZTogW3dpbi1wdi1kZXZlbF0gW1BBVENI
IDMvNV0gRGVmaW5lIG5ldyBJT0NUTHMgZm9yIHVzZXItbW9kZQ0KPiBjbGllbnRzDQo+IA0KPiBP
biAyMDE1LTEwLTE0IDEwOjQ3LCBQYXVsIER1cnJhbnQgd3JvdGU6DQo+ID4+IC0tLS0tT3JpZ2lu
YWwgTWVzc2FnZS0tLS0tDQo+ID4+IEZyb206IHdpbi1wdi1kZXZlbC1ib3VuY2VzQGxpc3RzLnhl
bnByb2plY3Qub3JnIFttYWlsdG86d2luLXB2LWRldmVsLQ0KPiA+PiBib3VuY2VzQGxpc3RzLnhl
bnByb2plY3Qub3JnXSBPbiBCZWhhbGYgT2YgUmFmYWwgV29qZHlsYQ0KPiA+PiBTZW50OiAwNyBP
Y3RvYmVyIDIwMTUgMDU6NDkNCj4gPj4gVG86IHdpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0
Lm9yZw0KPiA+PiBTdWJqZWN0OiBbd2luLXB2LWRldmVsXSBbUEFUQ0ggMy81XSBEZWZpbmUgbmV3
IElPQ1RMcyBmb3IgdXNlci1tb2RlDQo+ID4+IGNsaWVudHMNCj4gPj4NCj4gPj4gSU9DVEwgaW5w
dXQgaXMgZGVmaW5lZCBhcyBYRU5JRkFDRV8qX0lOIHN0cnVjdHMuDQo+ID4+IElPQ1RMIG91dHB1
dCBpcyBkZWZpbmVkIGFzIFhFTklGQUNFXypfT1VUIHN0cnVjdHMuDQo+ID4+DQo+ID4+IFNpZ25l
ZC1vZmYtYnk6IFJhZmFsIFdvamR5bGEgPG9tZWdAaW52aXNpYmxldGhpbmdzbGFiLmNvbT4NCj4g
DQo+IEknbGwgb21pdCB0aGUgY29kZSB3aGVyZSB0aGVyZSdzIG5vIHJlbWFya3Mgb3IgSSBnZW5l
cmFsbHkgYWdyZWUgd2l0aA0KPiB5b3VyIGNvbW1lbnRzLg0KPiANCj4gPj4gKy8vIERlZmluZSBv
bmx5IGZvciB1c2VyIG1vZGUgY2xpZW50cy4NCj4gPj4gKyNpZm5kZWYgWEVOSUZBQ0VfS0VSTkVM
X01PREUNCj4gPj4gKw0KPiA+DQo+ID4gQ291bGQgeW91IG5vdCB1c2UgX1dJTkRMTCB0byBkZXRl
cm1pbmUga2VybmVsLW1vZGUgdnMuIHVzZXItbW9kZQ0KPiBpbmNsdXNpb24sIHRoZSBzYW1lIGFz
IHRoZSBpbnRlcmZhY2UgaGVhZGVycyBkbz8NCj4gPg0KPiBJIHdhbnRlZCB0byBidXQgaXQncyBu
b3QgZGVmaW5lZCBmb3IgRVhFcy4gQ291bGRuJ3QgZmluZCBhbiBhbHRlcm5hdGl2ZQ0KPiBpbiBw
cmVkZWZpbmVkIG1hY3Jvcy4uLg0KPiANCj4gPj4gK3R5cGVkZWYgZW51bSBfWEVOQlVTX1NUT1JF
X1BFUk1JU1NJT05fTUFTSyB7DQo+ID4+ICsgICAgWEVOQlVTX1NUT1JFX1BFUk1fTk9ORSA9IDAs
DQo+ID4+ICsgICAgWEVOQlVTX1NUT1JFX1BFUk1fUkVBRCA9IDEsDQo+ID4+ICsgICAgWEVOQlVT
X1NUT1JFX1BFUk1fV1JJVEUgPSAyLA0KPiA+PiArfSBYRU5CVVNfU1RPUkVfUEVSTUlTU0lPTl9N
QVNLOw0KPiA+PiArDQo+ID4+ICt0eXBlZGVmIHN0cnVjdCBfWEVOQlVTX1NUT1JFX1BFUk1JU1NJ
T04gew0KPiA+PiArICAgIFVTSE9SVCBEb21haW47DQo+ID4+ICsgICAgWEVOQlVTX1NUT1JFX1BF
Uk1JU1NJT05fTUFTSyBNYXNrOw0KPiA+PiArfSBYRU5CVVNfU1RPUkVfUEVSTUlTU0lPTiwgKlBY
RU5CVVNfU1RPUkVfUEVSTUlTU0lPTjsNCj4gPj4gKw0KPiA+PiArI2VuZGlmDQo+ID4NCj4gPiBT
aG91bGRuJ3QgdGhlc2UgYmUgcHJlZml4ZWQgWEVOSUZBQ0VfIHJhdGhlciB0aGFuIFhFTkJVU18/
DQo+ID4NCj4gVGhlc2UgYXJlIGRlZmluZWQgaW4geGVuYnVzJyBzdG9yZV9pbnRlcmZhY2UuaC4g
SSBkb24ndCBsaWtlIGNvcHlpbmcNCj4gY29kZSBsaWtlIHRoYXQgYnV0IHRoZSBkYXRhIGZvcm1h
dCBpcyB3aGF0IGJvdGggc2lkZXMgZXhwZWN0LiBJIGNvdWxkDQo+IHVzZSBzb21ldGhpbmcgZWxz
ZSBmb3IgdXNlciBtb2RlIGJ1dCB0aGF0IHdvdWxkIGJlIGp1c3QgaW52ZW50aW5nIGEgbmV3DQo+
IGZvcm1hdCBmb3Igbm8gcmVhbCByZWFzb24uIE9yIG1heWJlIGl0IHdvdWxkIG1ha2Ugc2Vuc2Ug
Zm9yIHJlYWRhYmlsaXR5DQo+IGZvciBzb21lb25lIHdyaXRpbmcgYSB1c2VyIG1vZGUgY2xpZW50
Pw0KPiANCg0KSSB0aGluayBpdCB3b3VsZCBiZSB3b3J0aCBkZWZpbmluZyBhIHNlcGFyYXRlIGVu
dW1lcmF0aW9uLiBUaGlzIGlzIGEgbmV3IGludGVyZmFjZSBhbmQgc2hvdWxkIHJlYWxseSBiZSBz
ZWxmLWNvbnRhaW5lZCBhbmQgY29uc2lzdGVudGx5IG5hbWVkLg0KDQogIFBhdWwNCg0KPiA+PiAr
I3ByYWdtYSB3YXJuaW5nKHB1c2gpDQo+ID4+ICsjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MjAw
KSAvLyBub25zdGFuZGFyZCBleHRlbnNpb24gdXNlZCA6IHplcm8tDQo+IHNpemVkDQo+ID4+IGFy
cmF5IGluIHN0cnVjdC91bmlvbg0KPiA+DQo+ID4gQ291bGQgeW91IG5vdCBqdXN0IHNwZWNpZnkg
YW4gYXJyYXkgbGVuZ3RoIG9mIG9uZSB0byBhdm9pZCB0aGUgbmVlZCBmb3IgdGhpcw0KPiAjcHJh
Z21hLiBUaGF0J3MgZ2VuZXJhbGx5IGhvdyBXaW5kb3dzIEFQSXMgb2YgdGhpcyBuYXR1cmUgc3Bl
Y2lmeSB0aGVpcg0KPiBzdHJ1Y3R1cmVzLg0KPiA+DQo+IEkgd2FzIHVzZWQgdG8gdXNpbmcgemVy
by1zaXplZCBhcnJheXMgaW4gY2FzZXMgbGlrZSB0aGlzIGJlY2F1c2UgaXQgbWFkZQ0KPiBsYXRl
ciBzaXplIGNhbGN1bGF0aW9ucyBjbGVhbmVyLiBGSUVMRF9PRkZTRVQgbWFrZXMgdGhpcyBhIG5v
biBpc3N1ZQ0KPiB0aG91Z2ggc28gSSBhZ3JlZSB3aXRoIHlvdXIgY29tbWVudC4NCj4gDQo+ID4+
ICt0eXBlZGVmIHN0cnVjdCBfWEVOSUZBQ0VfR05UVEFCX1BFUk1JVF9GT1JFSUdOX0FDQ0VTU19J
TiB7DQo+ID4+ICsgICAgVUxPTkcgUmVxdWVzdElkOyAvLyBzaG91bGQgYmUgdW5pcXVlIGZvciBl
YWNoIHJlcXVlc3QNCj4gPg0KPiA+IElzIHRoYXQgdW5pcXVlIGdsb2JhbGx5LCBwZXItcHJvY2Vz
cyBvciBwZXItdGhyZWFkPyBQZXItdGhyZWFkIHdvdWxkIGJlDQo+IG1vc3QgY29udmVuaWVudCBm
b3IgdGhlIHVzZXIsIEkgZ3Vlc3MuDQo+ID4NCj4gSXQncyBwZXItcHJvY2VzcyByaWdodCBub3cu
DQo+IA0KPiAtLQ0KPiBSYWZhxYIgV29qZHnFgmENCj4gUXViZXMgVG9vbHMgZm9yIFdpbmRvd3Mg
ZGV2ZWxvcGVyDQo+IGh0dHBzOi8vd3d3LnF1YmVzLW9zLm9yZy8NCj4gDQo+IF9fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQo+IHdpbi1wdi1kZXZlbCBtYWls
aW5nIGxpc3QNCj4gd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnDQo+IGh0dHA6Ly9s
aXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmluL21haWxtYW4vbGlzdGluZm8vd2luLXB2LWRldmVs
DQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4tcHYt
ZGV2ZWwgbWFpbGluZyBsaXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRw
Oi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1k
ZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Wed Oct 14 13:20:24 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 14 Oct 2015 13:20: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 1ZmLyi-0004tF-05; Wed, 14 Oct 2015 13:20:24 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72274ee0c=Paul.Durrant@citrix.com>)
	id 1ZmLyg-0004ss-Ml
	for win-pv-devel@lists.xenproject.org; Wed, 14 Oct 2015 13:20:22 +0000
Received: from [85.158.137.68] by server-16.bemta-3.messagelabs.com id
	6C/AF-03763-5965E165; Wed, 14 Oct 2015 13:20:21 +0000
X-Env-Sender: prvs=72274ee0c=Paul.Durrant@citrix.com
X-Msg-Ref: server-4.tower-31.messagelabs.com!1444828821!51920856!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 5912 invoked from network); 14 Oct 2015 13:20:21 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-4.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2015 13:20:21 -0000
X-IronPort-AV: E=Sophos;i="5.17,681,1437436800"; 
   d="scan'208";a="5207041"
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] [PATCH 3/5] Define new IOCTLs for user-mode
	clients
Thread-Index: AQHRALt5ge+iF7M0hkK0Cbb2e7WCHJ5qtBtwgAArTgCAACPrMA==
Date: Wed, 14 Oct 2015 13:20:20 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F611764@AMSPEX01CL01.citrite.net>
References: <5614A427.4090002@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F610AED@AMSPEX01CL01.citrite.net>
	<561E5370.6060504@invisiblethingslab.com>
In-Reply-To: <561E5370.6060504@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] [PATCH 3/5] Define new IOCTLs for user-mode
 clients
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
MTQgT2N0b2JlciAyMDE1IDE0OjA3DQo+IFRvOiBQYXVsIER1cnJhbnQ7IHdpbi1wdi1kZXZlbEBs
aXN0cy54ZW5wcm9qZWN0Lm9yZw0KPiBTdWJqZWN0OiBSZTogW3dpbi1wdi1kZXZlbF0gW1BBVENI
IDMvNV0gRGVmaW5lIG5ldyBJT0NUTHMgZm9yIHVzZXItbW9kZQ0KPiBjbGllbnRzDQo+IA0KPiBP
biAyMDE1LTEwLTE0IDEwOjQ3LCBQYXVsIER1cnJhbnQgd3JvdGU6DQo+ID4+IC0tLS0tT3JpZ2lu
YWwgTWVzc2FnZS0tLS0tDQo+ID4+IEZyb206IHdpbi1wdi1kZXZlbC1ib3VuY2VzQGxpc3RzLnhl
bnByb2plY3Qub3JnIFttYWlsdG86d2luLXB2LWRldmVsLQ0KPiA+PiBib3VuY2VzQGxpc3RzLnhl
bnByb2plY3Qub3JnXSBPbiBCZWhhbGYgT2YgUmFmYWwgV29qZHlsYQ0KPiA+PiBTZW50OiAwNyBP
Y3RvYmVyIDIwMTUgMDU6NDkNCj4gPj4gVG86IHdpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0
Lm9yZw0KPiA+PiBTdWJqZWN0OiBbd2luLXB2LWRldmVsXSBbUEFUQ0ggMy81XSBEZWZpbmUgbmV3
IElPQ1RMcyBmb3IgdXNlci1tb2RlDQo+ID4+IGNsaWVudHMNCj4gPj4NCj4gPj4gSU9DVEwgaW5w
dXQgaXMgZGVmaW5lZCBhcyBYRU5JRkFDRV8qX0lOIHN0cnVjdHMuDQo+ID4+IElPQ1RMIG91dHB1
dCBpcyBkZWZpbmVkIGFzIFhFTklGQUNFXypfT1VUIHN0cnVjdHMuDQo+ID4+DQo+ID4+IFNpZ25l
ZC1vZmYtYnk6IFJhZmFsIFdvamR5bGEgPG9tZWdAaW52aXNpYmxldGhpbmdzbGFiLmNvbT4NCj4g
DQo+IEknbGwgb21pdCB0aGUgY29kZSB3aGVyZSB0aGVyZSdzIG5vIHJlbWFya3Mgb3IgSSBnZW5l
cmFsbHkgYWdyZWUgd2l0aA0KPiB5b3VyIGNvbW1lbnRzLg0KPiANCj4gPj4gKy8vIERlZmluZSBv
bmx5IGZvciB1c2VyIG1vZGUgY2xpZW50cy4NCj4gPj4gKyNpZm5kZWYgWEVOSUZBQ0VfS0VSTkVM
X01PREUNCj4gPj4gKw0KPiA+DQo+ID4gQ291bGQgeW91IG5vdCB1c2UgX1dJTkRMTCB0byBkZXRl
cm1pbmUga2VybmVsLW1vZGUgdnMuIHVzZXItbW9kZQ0KPiBpbmNsdXNpb24sIHRoZSBzYW1lIGFz
IHRoZSBpbnRlcmZhY2UgaGVhZGVycyBkbz8NCj4gPg0KPiBJIHdhbnRlZCB0byBidXQgaXQncyBu
b3QgZGVmaW5lZCBmb3IgRVhFcy4gQ291bGRuJ3QgZmluZCBhbiBhbHRlcm5hdGl2ZQ0KPiBpbiBw
cmVkZWZpbmVkIG1hY3Jvcy4uLg0KPiANCj4gPj4gK3R5cGVkZWYgZW51bSBfWEVOQlVTX1NUT1JF
X1BFUk1JU1NJT05fTUFTSyB7DQo+ID4+ICsgICAgWEVOQlVTX1NUT1JFX1BFUk1fTk9ORSA9IDAs
DQo+ID4+ICsgICAgWEVOQlVTX1NUT1JFX1BFUk1fUkVBRCA9IDEsDQo+ID4+ICsgICAgWEVOQlVT
X1NUT1JFX1BFUk1fV1JJVEUgPSAyLA0KPiA+PiArfSBYRU5CVVNfU1RPUkVfUEVSTUlTU0lPTl9N
QVNLOw0KPiA+PiArDQo+ID4+ICt0eXBlZGVmIHN0cnVjdCBfWEVOQlVTX1NUT1JFX1BFUk1JU1NJ
T04gew0KPiA+PiArICAgIFVTSE9SVCBEb21haW47DQo+ID4+ICsgICAgWEVOQlVTX1NUT1JFX1BF
Uk1JU1NJT05fTUFTSyBNYXNrOw0KPiA+PiArfSBYRU5CVVNfU1RPUkVfUEVSTUlTU0lPTiwgKlBY
RU5CVVNfU1RPUkVfUEVSTUlTU0lPTjsNCj4gPj4gKw0KPiA+PiArI2VuZGlmDQo+ID4NCj4gPiBT
aG91bGRuJ3QgdGhlc2UgYmUgcHJlZml4ZWQgWEVOSUZBQ0VfIHJhdGhlciB0aGFuIFhFTkJVU18/
DQo+ID4NCj4gVGhlc2UgYXJlIGRlZmluZWQgaW4geGVuYnVzJyBzdG9yZV9pbnRlcmZhY2UuaC4g
SSBkb24ndCBsaWtlIGNvcHlpbmcNCj4gY29kZSBsaWtlIHRoYXQgYnV0IHRoZSBkYXRhIGZvcm1h
dCBpcyB3aGF0IGJvdGggc2lkZXMgZXhwZWN0LiBJIGNvdWxkDQo+IHVzZSBzb21ldGhpbmcgZWxz
ZSBmb3IgdXNlciBtb2RlIGJ1dCB0aGF0IHdvdWxkIGJlIGp1c3QgaW52ZW50aW5nIGEgbmV3DQo+
IGZvcm1hdCBmb3Igbm8gcmVhbCByZWFzb24uIE9yIG1heWJlIGl0IHdvdWxkIG1ha2Ugc2Vuc2Ug
Zm9yIHJlYWRhYmlsaXR5DQo+IGZvciBzb21lb25lIHdyaXRpbmcgYSB1c2VyIG1vZGUgY2xpZW50
Pw0KPiANCg0KSSB0aGluayBpdCB3b3VsZCBiZSB3b3J0aCBkZWZpbmluZyBhIHNlcGFyYXRlIGVu
dW1lcmF0aW9uLiBUaGlzIGlzIGEgbmV3IGludGVyZmFjZSBhbmQgc2hvdWxkIHJlYWxseSBiZSBz
ZWxmLWNvbnRhaW5lZCBhbmQgY29uc2lzdGVudGx5IG5hbWVkLg0KDQogIFBhdWwNCg0KPiA+PiAr
I3ByYWdtYSB3YXJuaW5nKHB1c2gpDQo+ID4+ICsjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MjAw
KSAvLyBub25zdGFuZGFyZCBleHRlbnNpb24gdXNlZCA6IHplcm8tDQo+IHNpemVkDQo+ID4+IGFy
cmF5IGluIHN0cnVjdC91bmlvbg0KPiA+DQo+ID4gQ291bGQgeW91IG5vdCBqdXN0IHNwZWNpZnkg
YW4gYXJyYXkgbGVuZ3RoIG9mIG9uZSB0byBhdm9pZCB0aGUgbmVlZCBmb3IgdGhpcw0KPiAjcHJh
Z21hLiBUaGF0J3MgZ2VuZXJhbGx5IGhvdyBXaW5kb3dzIEFQSXMgb2YgdGhpcyBuYXR1cmUgc3Bl
Y2lmeSB0aGVpcg0KPiBzdHJ1Y3R1cmVzLg0KPiA+DQo+IEkgd2FzIHVzZWQgdG8gdXNpbmcgemVy
by1zaXplZCBhcnJheXMgaW4gY2FzZXMgbGlrZSB0aGlzIGJlY2F1c2UgaXQgbWFkZQ0KPiBsYXRl
ciBzaXplIGNhbGN1bGF0aW9ucyBjbGVhbmVyLiBGSUVMRF9PRkZTRVQgbWFrZXMgdGhpcyBhIG5v
biBpc3N1ZQ0KPiB0aG91Z2ggc28gSSBhZ3JlZSB3aXRoIHlvdXIgY29tbWVudC4NCj4gDQo+ID4+
ICt0eXBlZGVmIHN0cnVjdCBfWEVOSUZBQ0VfR05UVEFCX1BFUk1JVF9GT1JFSUdOX0FDQ0VTU19J
TiB7DQo+ID4+ICsgICAgVUxPTkcgUmVxdWVzdElkOyAvLyBzaG91bGQgYmUgdW5pcXVlIGZvciBl
YWNoIHJlcXVlc3QNCj4gPg0KPiA+IElzIHRoYXQgdW5pcXVlIGdsb2JhbGx5LCBwZXItcHJvY2Vz
cyBvciBwZXItdGhyZWFkPyBQZXItdGhyZWFkIHdvdWxkIGJlDQo+IG1vc3QgY29udmVuaWVudCBm
b3IgdGhlIHVzZXIsIEkgZ3Vlc3MuDQo+ID4NCj4gSXQncyBwZXItcHJvY2VzcyByaWdodCBub3cu
DQo+IA0KPiAtLQ0KPiBSYWZhxYIgV29qZHnFgmENCj4gUXViZXMgVG9vbHMgZm9yIFdpbmRvd3Mg
ZGV2ZWxvcGVyDQo+IGh0dHBzOi8vd3d3LnF1YmVzLW9zLm9yZy8NCj4gDQo+IF9fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQo+IHdpbi1wdi1kZXZlbCBtYWls
aW5nIGxpc3QNCj4gd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnDQo+IGh0dHA6Ly9s
aXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmluL21haWxtYW4vbGlzdGluZm8vd2luLXB2LWRldmVs
DQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4tcHYt
ZGV2ZWwgbWFpbGluZyBsaXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRw
Oi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1k
ZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Wed Oct 14 13:43:36 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 14 Oct 2015 13:43: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 1ZmML9-0008Lw-9l; Wed, 14 Oct 2015 13:43:35 +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 1ZmML7-0008Lo-SC
	for win-pv-devel@lists.xenproject.org; Wed, 14 Oct 2015 13:43:34 +0000
Received: from [85.158.137.68] by server-5.bemta-3.messagelabs.com id
	20/68-01748-40C5E165; Wed, 14 Oct 2015 13:43:32 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-15.tower-31.messagelabs.com!1444830211!53041253!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 2753 invoked from network); 14 Oct 2015 13:43:32 -0000
Received: from out1-smtp.messagingengine.com (HELO
	out1-smtp.messagingengine.com) (66.111.4.25)
	by server-15.tower-31.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Oct 2015 13:43:32 -0000
Received: from compute1.internal (compute1.nyi.internal [10.202.2.41])
	by mailout.nyi.internal (Postfix) with ESMTP id 5CFE120337
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 14 Oct 2015 09:43:31 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute1.internal (MEProxy); Wed, 14 Oct 2015 09:43:31 -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=yd9dhlE9Pufymob5
	edY/yJfVEJg=; b=DyL98MNaTGHwIXkgQb8CVQummjfhwPN5hMFrMid3Dpn29Bgz
	6BSHwifUzLwTrQCWL8OPf59iinVH1m9di/JIuIA5isWTTqIW+t7k3UmodZBnv+To
	dRs8LppZk7Q2LSeLt0j4aoMpPPHapGpUeVDUEDurwg8aM/u4fgNAq4NPbKU=
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=yd9dhlE9Pufymob
	5edY/yJfVEJg=; b=FYm83uM0+O/YuTIriO9FqUoTrwjqMbhd7dpGpTArCrukzD1
	E2VQLR+04H0MGeaXQ6v2ILShXoJgoJu8k6olTwN0zSC8O+RoopbpcG0chtZidRt0
	ix7B3hevH7gZmAoUtz2OeIrlIjS8k/XoajaElG1kzXUCr1J19qIS/fvCP/cY=
X-Sasl-enc: MT1dvmpRzoFh5Z7Ed62thklTs2IBaZjTqU/6+UPpHxfS 1444830210
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id A339A680185;
	Wed, 14 Oct 2015 09:43:30 -0400 (EDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <5614A431.2020704@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F611101@AMSPEX01CL01.citrite.net>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <561E5C03.50604@invisiblethingslab.com>
Date: Wed, 14 Oct 2015 15:43:31 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F611101@AMSPEX01CL01.citrite.net>
Content-Length: 3049
Subject: Re: [win-pv-devel] [PATCH 4/5] Implement new IOCTL handlers
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="iso-8859-2"
Content-Transfer-Encoding: quoted-printable
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

On 2015-10-14 12:35, Paul Durrant wrote:
> =

> =

>> -----Original Message-----
>> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
>> bounces@lists.xenproject.org] On Behalf Of Rafal Wojdyla
>> Sent: 07 October 2015 05:49
>> To: win-pv-devel@lists.xenproject.org
>> Subject: [win-pv-devel] [PATCH 4/5] Implement new IOCTL handlers
>>
>> This patch implements new store, evtchn and gnttab IOCTLs.
>> Handlers are split into separate files for readability.
>>
>> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>

Again, I'll omit the code where there's no remarks or I generally agree
with your comments.

>> +    ProcessorCount =3D
>> KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
>> +    RtlZeroMemory(Fdo->EvtchnDpc, sizeof(KDPC)*ProcessorCount);
> =

> Spaces around '*'. Also I don't think it's safe to use the active process=
or count. What if a processor came online since the FDO was created?
> =

That's a fair point.

> =

> Since you're fixing whitespace, could you fix the above to have sane tabb=
ing?
> =

I'll make a separate patch for un-tabify and such. Also on the general
subject of code formatting, what do you use for editing? VS has some
limitations (I douldn't find a way to make it insert spaces after sizeof
when formatting for example) so maybe I could at least partially
automate formatting to better fit your style.

>> +/* Copyright (c) Citrix Systems Inc.
>> + * All rights reserved.
> =

> You're not obliged to give Citrix copyright AFAIK. As long as it's BSD li=
censed I think we're all happy.
> =

Yeah, I was not sure about all that copyright stuff :)

>> +    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
>> +    Context->Id.Type =3D XENIFACE_CONTEXT_GRANT;
>> +    Context->Id.Process =3D PsGetCurrentProcess();
> =

> Careful. I don't think Wndows guarantees that METHOD_BUFFERED ioctls will=
 be handled in the issuers process context. See the sentence:
> =

> " After the I/O manager has created a system-space buffer for the driver,=
 the requesting user-mode thread can be swapped out and its physical memory=
 can be reused by another thread, possibly by a thread belonging to another=
 process."
> =

> at https://msdn.microsoft.com/en-us/library/windows/hardware/ff565356%28v=
=3Dvs.85%29.aspx.

I was pretty sure all user IOCTLs are delivered directly to the highest
level driver. Since IOCTL handlers run at PASSIVE_LEVEL they can page in
the user memory on completion I assume.
> =

> You should probably consider using METHOD_NEITHER. That may also allow yo=
u to play tricks like injecting the results of the operation into the user-=
space buffer without completing the ioctl possibly negating the need for a =
'get results' ioctl.
> =

This is an excellent point however. I'll try that.

-- =

Rafa=B3 Wojdy=B3a
Qubes Tools for Windows developer
https://www.qubes-os.org/

_______________________________________________
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 Oct 14 13:43:36 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 14 Oct 2015 13:43: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 1ZmML9-0008Lw-9l; Wed, 14 Oct 2015 13:43:35 +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 1ZmML7-0008Lo-SC
	for win-pv-devel@lists.xenproject.org; Wed, 14 Oct 2015 13:43:34 +0000
Received: from [85.158.137.68] by server-5.bemta-3.messagelabs.com id
	20/68-01748-40C5E165; Wed, 14 Oct 2015 13:43:32 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-15.tower-31.messagelabs.com!1444830211!53041253!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 2753 invoked from network); 14 Oct 2015 13:43:32 -0000
Received: from out1-smtp.messagingengine.com (HELO
	out1-smtp.messagingengine.com) (66.111.4.25)
	by server-15.tower-31.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Oct 2015 13:43:32 -0000
Received: from compute1.internal (compute1.nyi.internal [10.202.2.41])
	by mailout.nyi.internal (Postfix) with ESMTP id 5CFE120337
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 14 Oct 2015 09:43:31 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute1.internal (MEProxy); Wed, 14 Oct 2015 09:43:31 -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=yd9dhlE9Pufymob5
	edY/yJfVEJg=; b=DyL98MNaTGHwIXkgQb8CVQummjfhwPN5hMFrMid3Dpn29Bgz
	6BSHwifUzLwTrQCWL8OPf59iinVH1m9di/JIuIA5isWTTqIW+t7k3UmodZBnv+To
	dRs8LppZk7Q2LSeLt0j4aoMpPPHapGpUeVDUEDurwg8aM/u4fgNAq4NPbKU=
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=yd9dhlE9Pufymob
	5edY/yJfVEJg=; b=FYm83uM0+O/YuTIriO9FqUoTrwjqMbhd7dpGpTArCrukzD1
	E2VQLR+04H0MGeaXQ6v2ILShXoJgoJu8k6olTwN0zSC8O+RoopbpcG0chtZidRt0
	ix7B3hevH7gZmAoUtz2OeIrlIjS8k/XoajaElG1kzXUCr1J19qIS/fvCP/cY=
X-Sasl-enc: MT1dvmpRzoFh5Z7Ed62thklTs2IBaZjTqU/6+UPpHxfS 1444830210
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id A339A680185;
	Wed, 14 Oct 2015 09:43:30 -0400 (EDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <5614A431.2020704@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F611101@AMSPEX01CL01.citrite.net>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <561E5C03.50604@invisiblethingslab.com>
Date: Wed, 14 Oct 2015 15:43:31 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F611101@AMSPEX01CL01.citrite.net>
Content-Length: 3049
Subject: Re: [win-pv-devel] [PATCH 4/5] Implement new IOCTL handlers
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="iso-8859-2"
Content-Transfer-Encoding: quoted-printable
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

On 2015-10-14 12:35, Paul Durrant wrote:
> =

> =

>> -----Original Message-----
>> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
>> bounces@lists.xenproject.org] On Behalf Of Rafal Wojdyla
>> Sent: 07 October 2015 05:49
>> To: win-pv-devel@lists.xenproject.org
>> Subject: [win-pv-devel] [PATCH 4/5] Implement new IOCTL handlers
>>
>> This patch implements new store, evtchn and gnttab IOCTLs.
>> Handlers are split into separate files for readability.
>>
>> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>

Again, I'll omit the code where there's no remarks or I generally agree
with your comments.

>> +    ProcessorCount =3D
>> KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
>> +    RtlZeroMemory(Fdo->EvtchnDpc, sizeof(KDPC)*ProcessorCount);
> =

> Spaces around '*'. Also I don't think it's safe to use the active process=
or count. What if a processor came online since the FDO was created?
> =

That's a fair point.

> =

> Since you're fixing whitespace, could you fix the above to have sane tabb=
ing?
> =

I'll make a separate patch for un-tabify and such. Also on the general
subject of code formatting, what do you use for editing? VS has some
limitations (I douldn't find a way to make it insert spaces after sizeof
when formatting for example) so maybe I could at least partially
automate formatting to better fit your style.

>> +/* Copyright (c) Citrix Systems Inc.
>> + * All rights reserved.
> =

> You're not obliged to give Citrix copyright AFAIK. As long as it's BSD li=
censed I think we're all happy.
> =

Yeah, I was not sure about all that copyright stuff :)

>> +    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
>> +    Context->Id.Type =3D XENIFACE_CONTEXT_GRANT;
>> +    Context->Id.Process =3D PsGetCurrentProcess();
> =

> Careful. I don't think Wndows guarantees that METHOD_BUFFERED ioctls will=
 be handled in the issuers process context. See the sentence:
> =

> " After the I/O manager has created a system-space buffer for the driver,=
 the requesting user-mode thread can be swapped out and its physical memory=
 can be reused by another thread, possibly by a thread belonging to another=
 process."
> =

> at https://msdn.microsoft.com/en-us/library/windows/hardware/ff565356%28v=
=3Dvs.85%29.aspx.

I was pretty sure all user IOCTLs are delivered directly to the highest
level driver. Since IOCTL handlers run at PASSIVE_LEVEL they can page in
the user memory on completion I assume.
> =

> You should probably consider using METHOD_NEITHER. That may also allow yo=
u to play tricks like injecting the results of the operation into the user-=
space buffer without completing the ioctl possibly negating the need for a =
'get results' ioctl.
> =

This is an excellent point however. I'll try that.

-- =

Rafa=B3 Wojdy=B3a
Qubes Tools for Windows developer
https://www.qubes-os.org/

_______________________________________________
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 Oct 14 13:51:15 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 14 Oct 2015 13:51: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 1ZmMSX-0000OQ-Sr; Wed, 14 Oct 2015 13:51:13 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72274ee0c=Paul.Durrant@citrix.com>)
	id 1ZmMSW-0000OL-GI
	for win-pv-devel@lists.xenproject.org; Wed, 14 Oct 2015 13:51:12 +0000
Received: from [85.158.137.68] by server-1.bemta-3.messagelabs.com id
	03/F2-01421-FCD5E165; Wed, 14 Oct 2015 13:51:11 +0000
X-Env-Sender: prvs=72274ee0c=Paul.Durrant@citrix.com
X-Msg-Ref: server-15.tower-31.messagelabs.com!1444830670!53044487!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 16328 invoked from network); 14 Oct 2015 13:51:10 -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;
	14 Oct 2015 13:51:10 -0000
X-IronPort-AV: E=Sophos;i="5.17,681,1437436800"; 
   d="scan'208";a="5210248"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 4/5] Implement new IOCTL handlers
Thread-Index: AQHRALuLOFp9rRciJk6eY/nrf9sjEJ5qx0ZQgAAiXICAACIU4A==
Date: Wed, 14 Oct 2015 13:50:52 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F611964@AMSPEX01CL01.citrite.net>
References: <5614A431.2020704@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F611101@AMSPEX01CL01.citrite.net>
	<561E5C03.50604@invisiblethingslab.com>
In-Reply-To: <561E5C03.50604@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] [PATCH 4/5] Implement new IOCTL handlers
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="iso-8859-2"
Content-Transfer-Encoding: quoted-printable
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: Rafa=B3 Wojdy=B3a [mailto:omeg@invisiblethingslab.com]
> Sent: 14 October 2015 14:44
> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> Subject: Re: [win-pv-devel] [PATCH 4/5] Implement new IOCTL handlers
> =

> On 2015-10-14 12:35, Paul Durrant wrote:
> >
> >
> >> -----Original Message-----
> >> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> >> bounces@lists.xenproject.org] On Behalf Of Rafal Wojdyla
> >> Sent: 07 October 2015 05:49
> >> To: win-pv-devel@lists.xenproject.org
> >> Subject: [win-pv-devel] [PATCH 4/5] Implement new IOCTL handlers
> >>
> >> This patch implements new store, evtchn and gnttab IOCTLs.
> >> Handlers are split into separate files for readability.
> >>
> >> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
> =

> Again, I'll omit the code where there's no remarks or I generally agree
> with your comments.
> =

> >> +    ProcessorCount =3D
> >> KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
> >> +    RtlZeroMemory(Fdo->EvtchnDpc, sizeof(KDPC)*ProcessorCount);
> >
> > Spaces around '*'. Also I don't think it's safe to use the active proce=
ssor
> count. What if a processor came online since the FDO was created?
> >
> That's a fair point.
> =

> >
> > Since you're fixing whitespace, could you fix the above to have sane
> tabbing?
> >
> I'll make a separate patch for un-tabify and such. Also on the general
> subject of code formatting, what do you use for editing? VS has some
> limitations (I douldn't find a way to make it insert spaces after sizeof
> when formatting for example) so maybe I could at least partially
> automate formatting to better fit your style.
> =


I just use emacs. I jump between hacking on the PV drivers, Xen, Linux and =
QEMU often enough that I need something ubiquitous. I know VS can be a pain=
... one of the other things it seems to do is randomly insert DOS line endi=
ngs.

> >> +/* Copyright (c) Citrix Systems Inc.
> >> + * All rights reserved.
> >
> > You're not obliged to give Citrix copyright AFAIK. As long as it's BSD =
licensed
> I think we're all happy.
> >
> Yeah, I was not sure about all that copyright stuff :)
> =

> >> +    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
> >> +    Context->Id.Type =3D XENIFACE_CONTEXT_GRANT;
> >> +    Context->Id.Process =3D PsGetCurrentProcess();
> >
> > Careful. I don't think Wndows guarantees that METHOD_BUFFERED ioctls
> will be handled in the issuers process context. See the sentence:
> >
> > " After the I/O manager has created a system-space buffer for the drive=
r,
> the requesting user-mode thread can be swapped out and its physical
> memory can be reused by another thread, possibly by a thread belonging to
> another process."
> >
> > at https://msdn.microsoft.com/en-
> us/library/windows/hardware/ff565356%28v=3Dvs.85%29.aspx.
> =

> I was pretty sure all user IOCTLs are delivered directly to the highest
> level driver. Since IOCTL handlers run at PASSIVE_LEVEL they can page in
> the user memory on completion I assume.

Yes, I think that's what happens in practice but it's one of those things t=
hat Microsoft might just decide to break... because they can :-/

  Paul

> >
> > You should probably consider using METHOD_NEITHER. That may also allow
> you to play tricks like injecting the results of the operation into the u=
ser-
> space buffer without completing the ioctl possibly negating the need for a
> 'get results' ioctl.
> >
> This is an excellent point however. I'll try that.
> =

> --
> Rafa=B3 Wojdy=B3a
> Qubes Tools for Windows developer
> https://www.qubes-os.org/

_______________________________________________
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 Oct 14 13:51:15 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 14 Oct 2015 13:51: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 1ZmMSX-0000OQ-Sr; Wed, 14 Oct 2015 13:51:13 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72274ee0c=Paul.Durrant@citrix.com>)
	id 1ZmMSW-0000OL-GI
	for win-pv-devel@lists.xenproject.org; Wed, 14 Oct 2015 13:51:12 +0000
Received: from [85.158.137.68] by server-1.bemta-3.messagelabs.com id
	03/F2-01421-FCD5E165; Wed, 14 Oct 2015 13:51:11 +0000
X-Env-Sender: prvs=72274ee0c=Paul.Durrant@citrix.com
X-Msg-Ref: server-15.tower-31.messagelabs.com!1444830670!53044487!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 16328 invoked from network); 14 Oct 2015 13:51:10 -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;
	14 Oct 2015 13:51:10 -0000
X-IronPort-AV: E=Sophos;i="5.17,681,1437436800"; 
   d="scan'208";a="5210248"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 4/5] Implement new IOCTL handlers
Thread-Index: AQHRALuLOFp9rRciJk6eY/nrf9sjEJ5qx0ZQgAAiXICAACIU4A==
Date: Wed, 14 Oct 2015 13:50:52 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F611964@AMSPEX01CL01.citrite.net>
References: <5614A431.2020704@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F611101@AMSPEX01CL01.citrite.net>
	<561E5C03.50604@invisiblethingslab.com>
In-Reply-To: <561E5C03.50604@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] [PATCH 4/5] Implement new IOCTL handlers
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="iso-8859-2"
Content-Transfer-Encoding: quoted-printable
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: Rafa=B3 Wojdy=B3a [mailto:omeg@invisiblethingslab.com]
> Sent: 14 October 2015 14:44
> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> Subject: Re: [win-pv-devel] [PATCH 4/5] Implement new IOCTL handlers
> =

> On 2015-10-14 12:35, Paul Durrant wrote:
> >
> >
> >> -----Original Message-----
> >> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> >> bounces@lists.xenproject.org] On Behalf Of Rafal Wojdyla
> >> Sent: 07 October 2015 05:49
> >> To: win-pv-devel@lists.xenproject.org
> >> Subject: [win-pv-devel] [PATCH 4/5] Implement new IOCTL handlers
> >>
> >> This patch implements new store, evtchn and gnttab IOCTLs.
> >> Handlers are split into separate files for readability.
> >>
> >> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
> =

> Again, I'll omit the code where there's no remarks or I generally agree
> with your comments.
> =

> >> +    ProcessorCount =3D
> >> KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
> >> +    RtlZeroMemory(Fdo->EvtchnDpc, sizeof(KDPC)*ProcessorCount);
> >
> > Spaces around '*'. Also I don't think it's safe to use the active proce=
ssor
> count. What if a processor came online since the FDO was created?
> >
> That's a fair point.
> =

> >
> > Since you're fixing whitespace, could you fix the above to have sane
> tabbing?
> >
> I'll make a separate patch for un-tabify and such. Also on the general
> subject of code formatting, what do you use for editing? VS has some
> limitations (I douldn't find a way to make it insert spaces after sizeof
> when formatting for example) so maybe I could at least partially
> automate formatting to better fit your style.
> =


I just use emacs. I jump between hacking on the PV drivers, Xen, Linux and =
QEMU often enough that I need something ubiquitous. I know VS can be a pain=
... one of the other things it seems to do is randomly insert DOS line endi=
ngs.

> >> +/* Copyright (c) Citrix Systems Inc.
> >> + * All rights reserved.
> >
> > You're not obliged to give Citrix copyright AFAIK. As long as it's BSD =
licensed
> I think we're all happy.
> >
> Yeah, I was not sure about all that copyright stuff :)
> =

> >> +    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
> >> +    Context->Id.Type =3D XENIFACE_CONTEXT_GRANT;
> >> +    Context->Id.Process =3D PsGetCurrentProcess();
> >
> > Careful. I don't think Wndows guarantees that METHOD_BUFFERED ioctls
> will be handled in the issuers process context. See the sentence:
> >
> > " After the I/O manager has created a system-space buffer for the drive=
r,
> the requesting user-mode thread can be swapped out and its physical
> memory can be reused by another thread, possibly by a thread belonging to
> another process."
> >
> > at https://msdn.microsoft.com/en-
> us/library/windows/hardware/ff565356%28v=3Dvs.85%29.aspx.
> =

> I was pretty sure all user IOCTLs are delivered directly to the highest
> level driver. Since IOCTL handlers run at PASSIVE_LEVEL they can page in
> the user memory on completion I assume.

Yes, I think that's what happens in practice but it's one of those things t=
hat Microsoft might just decide to break... because they can :-/

  Paul

> >
> > You should probably consider using METHOD_NEITHER. That may also allow
> you to play tricks like injecting the results of the operation into the u=
ser-
> space buffer without completing the ioctl possibly negating the need for a
> 'get results' ioctl.
> >
> This is an excellent point however. I'll try that.
> =

> --
> Rafa=B3 Wojdy=B3a
> Qubes Tools for Windows developer
> https://www.qubes-os.org/

_______________________________________________
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 Oct 21 05:25:42 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 21 Oct 2015 05:25: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 1Zolu9-0007iI-6S; Wed, 21 Oct 2015 05:25:41 +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 1Zolu6-0007iD-QE
	for win-pv-devel@lists.xenproject.org; Wed, 21 Oct 2015 05:25:39 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	E9/8A-12889-2D127265; Wed, 21 Oct 2015 05:25:38 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1445405136!24084925!1
X-Originating-IP: [66.111.4.27]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjcgPT4gODQ2Mw==\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21916 invoked from network); 21 Oct 2015 05:25:36 -0000
Received: from out3-smtp.messagingengine.com (HELO
	out3-smtp.messagingengine.com) (66.111.4.27)
	by server-2.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2015 05:25:36 -0000
Received: from compute2.internal (compute2.nyi.internal [10.202.2.42])
	by mailout.nyi.internal (Postfix) with ESMTP id 1AD7420606
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:25:36 -0400 (EDT)
Received: from frontend1 ([10.202.2.160])
	by compute2.internal (MEProxy); Wed, 21 Oct 2015 01:25:36 -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=iVXiY27XG7h4EZQeXRg/BTjo5mY=; b=bdny9B
	JTsuaz/r+7TtOzyyIx4QL6xRh3cWQwAIMgWc/0vXeiBk3cFXVCVcOwDctDm9MOdj
	lkjYv451F8i3OewuhtLwaI1p0St61nojI/5ho57HkCBUHon8jlIUZju2mND0fvHv
	cpHUHAaFGOKzZLjzQ6QGf18vuO1jrSm5RxwEw=
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=iVXiY27XG7h4EZQeXRg/BTjo5mY=; b=G7VSr
	HsAlzbOQSJS1pWG0DA2aCFkmaWhFaHSnI1dL+V6NfOG6aqxlFUF5fzLL/w95uMqD
	KHX0bMAc708573JS2sMQ5R9YiPhRyLMO6x16Js5yEFBxGBIjVdKUO4l8hRYRy8Rl
	QB+Lzsdxx7m0UaQKSEW4uYER4Oh8QNsAmjBuPs=
X-Sasl-enc: KwyLiWWwg83xdsCHeOljVXRBBpOz/Xm77Wq1YVkcqS0a 1445405135
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id E401DC0001D
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:25:34 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N0010
Message-ID: <562721CF.6020708@invisiblethingslab.com>
Date: Wed, 21 Oct 2015 07:25:35 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 1/6] Update XENBUS interface headers
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

Also add headers needed for next patches in the series.

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 include/cache_interface.h  | 233 ++++++++++++++++++++++++++++++++
 include/evtchn_interface.h | 325 +++++++++++++++++++++++++++++++++++++++++++++
 include/gnttab_interface.h | 249 ++++++++++++++++++++++++++++++++++
 include/store_interface.h  |  96 ++++++++++---
 4 files changed, 885 insertions(+), 18 deletions(-)
 create mode 100644 include/cache_interface.h
 create mode 100644 include/evtchn_interface.h
 create mode 100644 include/gnttab_interface.h

diff --git a/include/cache_interface.h b/include/cache_interface.h
new file mode 100644
index 0000000..dae3ac6
--- /dev/null
+++ b/include/cache_interface.h
@@ -0,0 +1,233 @@
+/* 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 cache_interface.h
+    \brief XENBUS CACHE Interface
+
+    This interface provides access to XENBUS's object cache
+    implementation.
+*/
+
+#ifndef _XENBUS_CACHE_INTERFACE_H
+#define _XENBUS_CACHE_INTERFACE_H
+
+#ifndef _WINDLL
+
+/*! \typedef XENBUS_CACHE
+    \brief Cache handle
+*/
+typedef struct _XENBUS_CACHE    XENBUS_CACHE, *PXENBUS_CACHE;
+
+/*! \typedef XENBUS_CACHE_ACQUIRE
+    \brief Acquire a reference to the CACHE interface
+
+    \param Interface The interface header
+*/  
+typedef NTSTATUS
+(*XENBUS_CACHE_ACQUIRE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_CACHE_RELEASE
+    \brief Release a reference to the CACHE interface
+
+    \param Interface The interface header
+*/  
+typedef VOID
+(*XENBUS_CACHE_RELEASE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_CACHE_CTOR
+    \brief Object creator callback
+
+    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
+    \param Object Newly allocated object
+
+    This callback is invoked just after a new object is allocated and may
+    be used to initialize any object data prior to its insertion into the
+    cache.
+*/
+typedef NTSTATUS
+(*XENBUS_CACHE_CTOR)(
+    IN  PVOID   Argument,
+    IN  PVOID   Object
+    );
+
+/*! \typedef XENBUS_CACHE_DTOR
+    \brief Object destructor callback
+
+    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
+    \param Object Object about to be freed
+
+    This callback is invoked just after an object is removed from the
+    cache and before it is freed and may be used to tear down any object data.
+*/
+typedef VOID
+(*XENBUS_CACHE_DTOR)(
+    IN  PVOID   Argument,
+    IN  PVOID   Object
+    );
+
+/*! \typedef XENBUS_CACHE_ACQUIRE_LOCK
+    \brief Cache lock callback
+
+    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
+
+    This callback is invoked if the cache implementation requires mutual
+    exclusion.
+*/
+typedef VOID
+(*XENBUS_CACHE_ACQUIRE_LOCK)(
+    IN  PVOID   Argument
+    );
+
+/*! \typedef XENBUS_CACHE_RELEASE_LOCK
+    \brief Cache unlock callback
+
+    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
+
+    This callback is invoked to release the mutual exclusion lock acquired
+    by a previous invocation of \a XENBUS_CACHE_ACQUIRE_LOCK.
+*/
+typedef VOID
+(*XENBUS_CACHE_RELEASE_LOCK)(
+    IN  PVOID   Argument
+    );
+
+/*! \typedef XENBUS_CACHE_CREATE
+    \brief Create a cache of objects of the given \a Size
+
+    \param Interface The interface header
+    \param Name A name for the cache which will be used in debug output
+    \param Size The size of each object in bytes
+    \param Reservation The target minimum population of the cache
+    \param Ctor A callback which is invoked when a new object created
+    \param Dtor A callback which is invoked when an object is destroyed
+    \param AcquireLock A callback invoked to acquire a spinlock
+    \param ReleaseLock A callback invoked to release the spinlock
+    \param Argument An optional context argument passed to the callbacks
+    \param Cache A pointer to a cache handle to be initialized
+
+    If a non-zero \a Reservation is specified then this method will fail
+    unless that number of objects can be immediately created.
+*/  
+typedef NTSTATUS
+(*XENBUS_CACHE_CREATE)(
+    IN  PINTERFACE                  Interface,
+    IN  const CHAR                  *Name,
+    IN  ULONG                       Size,
+    IN  ULONG                       Reservation,
+    IN  XENBUS_CACHE_CTOR           Ctor,
+    IN  XENBUS_CACHE_DTOR           Dtor,
+    IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
+    IN  XENBUS_CACHE_RELEASE_LOCK   ReleaseLock,
+    IN  PVOID                       Argument OPTIONAL,
+    OUT PXENBUS_CACHE               *Cache
+    );
+
+/*! \typedef XENBUS_CACHE_GET
+    \brief Get an object from a \a Cache
+
+    \param Interface The interface header
+    \param Cache The cache handle
+    \param Locked If mutually exclusive access to the cache is already
+    guaranteed then set this to TRUE
+*/
+typedef PVOID
+(*XENBUS_CACHE_GET)(
+    IN  PINTERFACE      Interface,
+    IN  PXENBUS_CACHE   Cache,
+    IN  BOOLEAN         Locked
+    );
+
+/*! \typedef XENBUS_CACHE_PUT
+    \brief Return an object to a \a Cache
+
+    \param Interface The interface header
+    \param Cache The cache handle
+    \param Locked If mutually exclusive access to the cache is already
+    guaranteed then set this to TRUE
+*/
+typedef VOID
+(*XENBUS_CACHE_PUT)(
+    IN  PINTERFACE      Interface,
+    IN  PXENBUS_CACHE   Cache,
+    IN  PVOID           Object,
+    IN  BOOLEAN         Locked
+    );
+
+/*! \typedef XENBUS_CACHE_DESTROY
+    \brief Destroy a \a Cache
+
+    \param Interface The interface header
+    \param Cache The cache handle
+
+    All objects must have been returned to the cache prior to destruction
+*/
+typedef VOID
+(*XENBUS_CACHE_DESTROY)(
+    IN  PINTERFACE      Interface,
+    IN  PXENBUS_CACHE   Cache
+    );
+
+// {A98DFD78-416A-4949-92A5-E084F2F4B44E}
+DEFINE_GUID(GUID_XENBUS_CACHE_INTERFACE, 
+0xa98dfd78, 0x416a, 0x4949, 0x92, 0xa5, 0xe0, 0x84, 0xf2, 0xf4, 0xb4, 0x4e);
+
+/*! \struct _XENBUS_CACHE_INTERFACE_V1
+    \brief CACHE interface version 1
+    \ingroup interfaces
+*/
+struct _XENBUS_CACHE_INTERFACE_V1 {
+    INTERFACE               Interface;
+    XENBUS_CACHE_ACQUIRE    CacheAcquire;
+    XENBUS_CACHE_RELEASE    CacheRelease;
+    XENBUS_CACHE_CREATE     CacheCreate;
+    XENBUS_CACHE_GET        CacheGet;
+    XENBUS_CACHE_PUT        CachePut;
+    XENBUS_CACHE_DESTROY    CacheDestroy;
+};
+
+typedef struct _XENBUS_CACHE_INTERFACE_V1 XENBUS_CACHE_INTERFACE, *PXENBUS_CACHE_INTERFACE;
+
+/*! \def XENBUS_CACHE
+    \brief Macro at assist in method invocation
+*/
+#define XENBUS_CACHE(_Method, _Interface, ...)    \
+    (_Interface)->Cache ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+
+#endif  // _WINDLL
+
+#define XENBUS_CACHE_INTERFACE_VERSION_MIN  1
+#define XENBUS_CACHE_INTERFACE_VERSION_MAX  1
+
+#endif  // _XENBUS_CACHE_INTERFACE_H
diff --git a/include/evtchn_interface.h b/include/evtchn_interface.h
new file mode 100644
index 0000000..c63f063
--- /dev/null
+++ b/include/evtchn_interface.h
@@ -0,0 +1,325 @@
+/* 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 evtchn_interface.h
+    \brief XENBUS EVTCHN Interface
+
+    This interface provides access to hypervisor event channels
+*/
+
+#ifndef _XENBUS_EVTCHN_INTERFACE_H
+#define _XENBUS_EVTCHN_INTERFACE_H
+
+#ifndef _WINDLL
+
+/*! \enum _XENBUS_EVTCHN_TYPE
+    \brief Event channel type to be opened
+*/
+typedef enum _XENBUS_EVTCHN_TYPE {
+    XENBUS_EVTCHN_TYPE_INVALID = 0,
+    XENBUS_EVTCHN_TYPE_FIXED,           /*!< Fixed */
+    XENBUS_EVTCHN_TYPE_UNBOUND,         /*!< Unbound */
+    XENBUS_EVTCHN_TYPE_INTER_DOMAIN,    /*!< Interdomain */
+    XENBUS_EVTCHN_TYPE_VIRQ             /*!< VIRQ */
+} XENBUS_EVTCHN_TYPE, *PXENBUS_EVTCHN_TYPE;
+
+/*! \typedef XENBUS_EVTCHN_CHANNEL
+    \brief Event channel handle
+*/
+typedef struct _XENBUS_EVTCHN_CHANNEL XENBUS_EVTCHN_CHANNEL, *PXENBUS_EVTCHN_CHANNEL;
+
+/*! \typedef XENBUS_EVTCHN_ACQUIRE
+    \brief Acquire a reference to the EVTCHN interface
+
+    \param Interface The interface header
+*/
+typedef NTSTATUS
+(*XENBUS_EVTCHN_ACQUIRE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_EVTCHN_RELEASE
+    \brief Release a reference to the EVTCHN interface
+
+    \param Interface The interface header
+*/
+typedef VOID
+(*XENBUS_EVTCHN_RELEASE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_EVTCHN_OPEN
+    \brief Open an event channel
+
+    \param Interface The interface header
+    \param Type The type of event channel to open
+    \param Function The callback function
+    \param Argument An optional context argument passed to the callback
+    \param ... Additional parameters required by \a Type
+
+    \b Fixed:
+    \param LocalPort The local port number of the (already bound) channel
+    \param Mask Set to TRUE if the channel should be automatically masked before invoking the callback
+
+    \b Unbound:
+    \param RemoteDomain The domid of the remote domain which will bind the channel
+    \param Mask Set to TRUE if the channel should be automatically masked before invoking the callback
+
+    \b Interdomain:
+    \param RemoteDomain The domid of the remote domain which has already bound the channel
+    \param RemotePort The port number bound to the channel in the remote domain
+    \param Mask Set to TRUE if the channel should be automatically masked before invoking the callback
+
+    \b VIRQ:
+    \param Index The index number of the VIRQ
+
+    \return Event channel handle
+*/
+typedef PXENBUS_EVTCHN_CHANNEL
+(*XENBUS_EVTCHN_OPEN)(
+    IN  PINTERFACE          Interface,
+    IN  XENBUS_EVTCHN_TYPE  Type,
+    IN  PKSERVICE_ROUTINE   Function,
+    IN  PVOID               Argument OPTIONAL,
+    ...
+    );
+
+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 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  USHORT                  Group,
+    IN  UCHAR                   Number
+    );
+
+typedef BOOLEAN
+(*XENBUS_EVTCHN_UNMASK_V1)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
+    IN  BOOLEAN                 InCallback
+    );
+
+/*! \typedef XENBUS_EVTCHN_UNMASK
+    \brief Unmask an event channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+    \param InCallback Set to TRUE if this method is invoked in context of the channel callback
+*/
+typedef VOID
+(*XENBUS_EVTCHN_UNMASK)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
+    IN  BOOLEAN                 InCallback
+    );
+
+/*! \typedef XENBUS_EVTCHN_SEND
+    \brief Send an event to the remote end of the channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+*/
+typedef VOID
+(*XENBUS_EVTCHN_SEND)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel
+    );
+
+/*! \typedef XENBUS_EVTCHN_TRIGGER
+    \brief Send an event to the local end of the channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+*/
+typedef VOID
+(*XENBUS_EVTCHN_TRIGGER)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel
+    );
+
+/*! \typedef XENBUS_EVTCHN_WAIT
+    \brief Wait for an event to the local end of the channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+    \param Timeout An optional timeout value (similar to KeWaitForSingleObject(), but non-zero values are allowed at DISPATCH_LEVEL).
+*/
+typedef NTSTATUS
+(*XENBUS_EVTCHN_WAIT)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
+    IN  PLARGE_INTEGER          Timeout OPTIONAL
+    );
+
+/*! \typedef XENBUS_EVTCHN_GET_PORT
+    \brief Get the local port number bound to the channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+    \return The port number
+*/
+typedef ULONG
+(*XENBUS_EVTCHN_GET_PORT)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel
+    );
+
+/*! \typedef XENBUS_EVTCHN_CLOSE
+    \brief Close an event channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+*/
+typedef VOID
+(*XENBUS_EVTCHN_CLOSE)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel
+    );
+
+// {BE2440AC-1098-4150-AF4D-452FADCEF923}
+DEFINE_GUID(GUID_XENBUS_EVTCHN_INTERFACE,
+0xbe2440ac, 0x1098, 0x4150, 0xaf, 0x4d, 0x45, 0x2f, 0xad, 0xce, 0xf9, 0x23);
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V1
+    \brief EVTCHN interface version 1
+    \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V1 {
+    INTERFACE               Interface;
+    XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
+    XENBUS_EVTCHN_RELEASE   EvtchnRelease;
+    XENBUS_EVTCHN_OPEN      EvtchnOpen;
+    XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
+    XENBUS_EVTCHN_SEND      EvtchnSend;
+    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
+    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
+    XENBUS_EVTCHN_CLOSE     EvtchnClose;
+};
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V2
+    \brief EVTCHN interface version 2
+    \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V2 {
+    INTERFACE               Interface;
+    XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
+    XENBUS_EVTCHN_RELEASE   EvtchnRelease;
+    XENBUS_EVTCHN_OPEN      EvtchnOpen;
+    XENBUS_EVTCHN_BIND_V2   EvtchnBindVersion2;
+    XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
+    XENBUS_EVTCHN_SEND      EvtchnSend;
+    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
+    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
+    XENBUS_EVTCHN_CLOSE     EvtchnClose;
+};
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V3
+    \brief EVTCHN interface version 3
+    \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V3 {
+    INTERFACE               Interface;
+    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;
+    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
+    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
+    XENBUS_EVTCHN_CLOSE     EvtchnClose;
+};
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V5
+    \brief EVTCHN interface version 5
+    \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V5 {
+    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;
+    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
+    XENBUS_EVTCHN_WAIT      EvtchnWait;
+    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
+    XENBUS_EVTCHN_CLOSE     EvtchnClose;
+};
+
+typedef struct _XENBUS_EVTCHN_INTERFACE_V5 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
+
+/*! \def XENBUS_EVTCHN
+    \brief Macro at assist in method invocation
+*/
+#define XENBUS_EVTCHN(_Method, _Interface, ...)    \
+    (_Interface)->Evtchn ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+
+#endif  // _WINDLL
+
+#define XENBUS_EVTCHN_INTERFACE_VERSION_MIN 1
+#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 5
+
+#endif  // _XENBUS_EVTCHN_INTERFACE_H
+
diff --git a/include/gnttab_interface.h b/include/gnttab_interface.h
new file mode 100644
index 0000000..b0f4adf
--- /dev/null
+++ b/include/gnttab_interface.h
@@ -0,0 +1,249 @@
+/* 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 gnttab_interface.h
+    \brief XENBUS GNTTAB Interface
+
+    This interface provides access to the hypervisor grant table
+*/
+
+#ifndef _XENBUS_GNTTAB_INTERFACE_H
+#define _XENBUS_GNTTAB_INTERFACE_H
+
+#include <cache_interface.h>
+
+#ifndef _WINDLL
+
+/*! \typedef XENBUS_GNTTAB_ENTRY
+    \brief Grant table entry handle
+*/
+typedef struct _XENBUS_GNTTAB_ENTRY XENBUS_GNTTAB_ENTRY, *PXENBUS_GNTTAB_ENTRY;
+
+/*! \typedef XENBUS_GNTTAB_CACHE
+    \brief Grant table cache handle
+*/
+typedef struct _XENBUS_GNTTAB_CACHE XENBUS_GNTTAB_CACHE, *PXENBUS_GNTTAB_CACHE;
+
+/*! \typedef XENBUS_GNTTAB_ACQUIRE
+    \brief Acquire a reference to the GNTTAB interface
+
+    \param Interface The interface header
+*/  
+typedef NTSTATUS
+(*XENBUS_GNTTAB_ACQUIRE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_GNTTAB_RELEASE
+    \brief Release a reference to the GNTTAB interface
+
+    \param Interface The interface header
+*/  
+typedef VOID
+(*XENBUS_GNTTAB_RELEASE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_GNTTAB_CREATE_CACHE
+    \brief Create a cache of grant table entries
+
+    \param Interface The interface header
+    \param Name A name for the cache which will be used in debug output
+    \param Reservation The target minimum population of the cache
+    \param AcquireLock A callback invoked to acquire a spinlock
+    \param ReleaseLock A callback invoked to release the spinlock
+    \param Argument An optional context argument passed to the callbacks
+    \param Cache A pointer to a grant table cache handle to be initialized
+*/  
+typedef NTSTATUS
+(*XENBUS_GNTTAB_CREATE_CACHE)(
+    IN  PINTERFACE                  Interface,
+    IN  const CHAR                  *Name,
+    IN  ULONG                       Reservation,
+    IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
+    IN  XENBUS_CACHE_RELEASE_LOCK   ReleaseLock,
+    IN  PVOID                       Argument OPTIONAL,
+    OUT PXENBUS_GNTTAB_CACHE        *Cache
+    );
+
+/*! \typedef XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS
+    \brief Get a table entry from the \a Cache permitting access to a given \a Pfn
+
+    \param Interface The interface header
+    \param Cache The grant table cache handle
+    \param Locked If mutually exclusive access to the cache is already
+    guaranteed then set this to TRUE
+    \param Domain The domid of the domain being granted access
+    \param Pfn The frame number of the page that we are granting access to
+    \param ReadOnly Set to TRUE if the foreign domain is only being granted
+    read access
+    \param Entry A pointer to a grant table entry handle to be initialized
+*/
+typedef NTSTATUS
+(*XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS)(
+    IN  PINTERFACE                  Interface,
+    IN  PXENBUS_GNTTAB_CACHE        Cache,
+    IN  BOOLEAN                     Locked,
+    IN  USHORT                      Domain,
+    IN  PFN_NUMBER                  Pfn,
+    IN  BOOLEAN                     ReadOnly,
+    OUT PXENBUS_GNTTAB_ENTRY        *Entry
+    );
+
+/*! \typedef XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS
+    \brief Revoke foreign access and return the \a Entry to the \a Cache
+
+    \param Interface The interface header
+    \param Cache The grant table cache handle
+    \param Locked If mutually exclusive access to the cache is already
+    guaranteed then set this to TRUE
+    \param Entry The grant table entry handle
+*/
+typedef NTSTATUS
+(*XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS)(
+    IN  PINTERFACE                  Interface,
+    IN  PXENBUS_GNTTAB_CACHE        Cache,
+    IN  BOOLEAN                     Locked,
+    IN  PXENBUS_GNTTAB_ENTRY        Entry
+    );
+
+/*! \typedef XENBUS_GNTTAB_GET_REFERENCE
+    \brief Get the reference number of the entry
+
+    \param Interface The interface header
+    \param Entry The grant table entry handle
+    \return The reference number
+*/  
+typedef ULONG
+(*XENBUS_GNTTAB_GET_REFERENCE)(
+    IN  PINTERFACE                  Interface,
+    IN  PXENBUS_GNTTAB_ENTRY        Entry
+    );
+
+/*! \typedef XENBUS_GNTTAB_DESTROY_CACHE
+    \brief Destroy a cache of grant table entries
+
+    \param Interface The interface header
+    \param Cache The grant table cache handle
+
+    All grant table entries must have been revoked prior to destruction
+    of the cache 
+*/  
+typedef VOID
+(*XENBUS_GNTTAB_DESTROY_CACHE)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_GNTTAB_CACHE    Cache
+    );
+
+/*! \typedef XENBUS_GNTTAB_MAP_FOREIGN_PAGES
+    \brief Map foreign memory pages into the system address space
+
+    \param Interface The interface header
+    \param Domain The domid of the foreign domain that granted the pages
+    \param NumberPages Number of pages to map
+    \param References Array of grant reference numbers shared by the foreign domain
+    \param ReadOnly If TRUE, pages are mapped with read-only access
+    \param Address The physical address that the foreign pages are mapped under
+*/
+
+typedef NTSTATUS
+(*XENBUS_GNTTAB_MAP_FOREIGN_PAGES)(
+    IN  PINTERFACE              Interface,
+    IN  USHORT                  Domain,
+    IN  ULONG                   NumberPages,
+    IN  PULONG                  References,
+    IN  BOOLEAN                 ReadOnly,
+    OUT PHYSICAL_ADDRESS        *Address
+    );
+
+/*! \typedef XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES
+    \brief Unmap foreign memory pages from the system address space
+
+    \param Interface The interface header
+    \param Address The physical address that the foreign pages are mapped under
+*/
+typedef NTSTATUS
+(*XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES)(
+    IN  PINTERFACE              Interface,
+    IN  PHYSICAL_ADDRESS        Address
+    );
+
+// {763679C5-E5C2-4A6D-8B88-6BB02EC42D8E}
+DEFINE_GUID(GUID_XENBUS_GNTTAB_INTERFACE, 
+0x763679c5, 0xe5c2, 0x4a6d, 0x8b, 0x88, 0x6b, 0xb0, 0x2e, 0xc4, 0x2d, 0x8e);
+
+/*! \struct _XENBUS_GNTTAB_INTERFACE_V1
+    \brief GNTTAB interface version 1
+    \ingroup interfaces
+*/
+struct _XENBUS_GNTTAB_INTERFACE_V1 {
+    INTERFACE                           Interface;
+    XENBUS_GNTTAB_ACQUIRE               GnttabAcquire;
+    XENBUS_GNTTAB_RELEASE               GnttabRelease;
+    XENBUS_GNTTAB_CREATE_CACHE          GnttabCreateCache;
+    XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS GnttabPermitForeignAccess;
+    XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS GnttabRevokeForeignAccess;
+    XENBUS_GNTTAB_GET_REFERENCE         GnttabGetReference;
+    XENBUS_GNTTAB_DESTROY_CACHE         GnttabDestroyCache;
+};
+
+/*! \struct _XENBUS_GNTTAB_INTERFACE_V2
+    \brief GNTTAB interface version 2
+    \ingroup interfaces
+*/
+struct _XENBUS_GNTTAB_INTERFACE_V2 {
+    INTERFACE                           Interface;
+    XENBUS_GNTTAB_ACQUIRE               GnttabAcquire;
+    XENBUS_GNTTAB_RELEASE               GnttabRelease;
+    XENBUS_GNTTAB_CREATE_CACHE          GnttabCreateCache;
+    XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS GnttabPermitForeignAccess;
+    XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS GnttabRevokeForeignAccess;
+    XENBUS_GNTTAB_GET_REFERENCE         GnttabGetReference;
+    XENBUS_GNTTAB_DESTROY_CACHE         GnttabDestroyCache;
+    XENBUS_GNTTAB_MAP_FOREIGN_PAGES     GnttabMapForeignPages;
+    XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES   GnttabUnmapForeignPages;
+};
+
+typedef struct _XENBUS_GNTTAB_INTERFACE_V2 XENBUS_GNTTAB_INTERFACE, *PXENBUS_GNTTAB_INTERFACE;
+
+/*! \def XENBUS_GNTTAB
+    \brief Macro at assist in method invocation
+*/
+#define XENBUS_GNTTAB(_Method, _Interface, ...)    \
+    (_Interface)->Gnttab ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+
+#endif  // _WINDLL
+
+#define XENBUS_GNTTAB_INTERFACE_VERSION_MIN 1
+#define XENBUS_GNTTAB_INTERFACE_VERSION_MAX 2
+
+#endif  // _XENBUS_GNTTAB_INTERFACE_H
+
diff --git a/include/store_interface.h b/include/store_interface.h
index 5bcbba3..52f1a1d 100644
--- a/include/store_interface.h
+++ b/include/store_interface.h
@@ -50,6 +50,23 @@ typedef struct _XENBUS_STORE_TRANSACTION    XENBUS_STORE_TRANSACTION, *PXENBUS_S
 */
 typedef struct _XENBUS_STORE_WATCH          XENBUS_STORE_WATCH, *PXENBUS_STORE_WATCH;
 
+/*! \typedef XENBUS_STORE_PERMISSION_MASK
+    \brief Bitmask of XenStore key permissions
+*/
+typedef enum _XENBUS_STORE_PERMISSION_MASK {
+    XENBUS_STORE_PERM_NONE = 0,
+    XENBUS_STORE_PERM_READ = 1,
+    XENBUS_STORE_PERM_WRITE = 2,
+} XENBUS_STORE_PERMISSION_MASK;
+
+/*! \typedef XENBUS_STORE_PERMISSION
+    \brief XenStore key permissions entry for a single domain
+*/
+typedef struct _XENBUS_STORE_PERMISSION {
+    USHORT                          Domain;
+    XENBUS_STORE_PERMISSION_MASK    Mask;
+} XENBUS_STORE_PERMISSION, *PXENBUS_STORE_PERMISSION;
+
 /*! \typedef XENBUS_STORE_ACQUIRE
     \brief Acquire a reference to the STORE interface
 
@@ -247,31 +264,74 @@ typedef VOID
     IN  PINTERFACE  Interface
     );
 
+/*! \typedef XENBUS_STORE_PERMISSIONS_SET
+    \brief Set permissions for a XenStore key
+
+    \param Interface The interface header
+    \param Transaction The transaction handle (NULL if this is not
+    part of a transaction)
+    \param Prefix An optional prefix for the \a Node
+    \param Node The concatenation of the \a Prefix and this value specifies
+    the XenStore key to set permissions of
+    \param Permissions An array of permissions to set
+    \param NumberPermissions Number of elements in the \a Permissions array
+*/
+typedef NTSTATUS
+(*XENBUS_STORE_PERMISSIONS_SET)(
+    IN  PINTERFACE                  Interface,
+    IN  PXENBUS_STORE_TRANSACTION   Transaction OPTIONAL,
+    IN  PCHAR                       Prefix OPTIONAL,
+    IN  PCHAR                       Node,
+    IN  PXENBUS_STORE_PERMISSION    Permissions,
+    IN  ULONG                       NumberPermissions
+    );
+
 // {86824C3B-D34E-4753-B281-2F1E3AD214D7}
 DEFINE_GUID(GUID_XENBUS_STORE_INTERFACE, 
 0x86824c3b, 0xd34e, 0x4753, 0xb2, 0x81, 0x2f, 0x1e, 0x3a, 0xd2, 0x14, 0xd7);
 
-struct _XENBUS_STORE_INTERFACE_V1 {
-    INTERFACE                       Interface;
-    XENBUS_STORE_ACQUIRE            StoreAcquire;
-    XENBUS_STORE_RELEASE            StoreRelease;
-    XENBUS_STORE_FREE               StoreFree;
-    XENBUS_STORE_READ               StoreRead;
-    XENBUS_STORE_PRINTF             StorePrintf;
-    XENBUS_STORE_REMOVE             StoreRemove;
-    XENBUS_STORE_DIRECTORY          StoreDirectory;
-    XENBUS_STORE_TRANSACTION_START  StoreTransactionStart;
-    XENBUS_STORE_TRANSACTION_END    StoreTransactionEnd;
-    XENBUS_STORE_WATCH_ADD          StoreWatchAdd;
-    XENBUS_STORE_WATCH_REMOVE       StoreWatchRemove;
-    XENBUS_STORE_POLL               StorePoll;
-};
-
 /*! \struct _XENBUS_STORE_INTERFACE_V1
     \brief STORE interface version 1
     \ingroup interfaces
 */
-typedef struct _XENBUS_STORE_INTERFACE_V1 XENBUS_STORE_INTERFACE, *PXENBUS_STORE_INTERFACE;
+struct _XENBUS_STORE_INTERFACE_V1 {
+    INTERFACE                       Interface;
+    XENBUS_STORE_ACQUIRE            StoreAcquire;
+    XENBUS_STORE_RELEASE            StoreRelease;
+    XENBUS_STORE_FREE               StoreFree;
+    XENBUS_STORE_READ               StoreRead;
+    XENBUS_STORE_PRINTF             StorePrintf;
+    XENBUS_STORE_REMOVE             StoreRemove;
+    XENBUS_STORE_DIRECTORY          StoreDirectory;
+    XENBUS_STORE_TRANSACTION_START  StoreTransactionStart;
+    XENBUS_STORE_TRANSACTION_END    StoreTransactionEnd;
+    XENBUS_STORE_WATCH_ADD          StoreWatchAdd;
+    XENBUS_STORE_WATCH_REMOVE       StoreWatchRemove;
+    XENBUS_STORE_POLL               StorePoll;
+};
+
+/*! \struct _XENBUS_STORE_INTERFACE_V2
+    \brief STORE interface version 2
+    \ingroup interfaces
+*/
+struct _XENBUS_STORE_INTERFACE_V2 {
+    INTERFACE                       Interface;
+    XENBUS_STORE_ACQUIRE            StoreAcquire;
+    XENBUS_STORE_RELEASE            StoreRelease;
+    XENBUS_STORE_FREE               StoreFree;
+    XENBUS_STORE_READ               StoreRead;
+    XENBUS_STORE_PRINTF             StorePrintf;
+    XENBUS_STORE_PERMISSIONS_SET    StorePermissionsSet;
+    XENBUS_STORE_REMOVE             StoreRemove;
+    XENBUS_STORE_DIRECTORY          StoreDirectory;
+    XENBUS_STORE_TRANSACTION_START  StoreTransactionStart;
+    XENBUS_STORE_TRANSACTION_END    StoreTransactionEnd;
+    XENBUS_STORE_WATCH_ADD          StoreWatchAdd;
+    XENBUS_STORE_WATCH_REMOVE       StoreWatchRemove;
+    XENBUS_STORE_POLL               StorePoll;
+};
+
+typedef struct _XENBUS_STORE_INTERFACE_V2 XENBUS_STORE_INTERFACE, *PXENBUS_STORE_INTERFACE;
 
 /*! \def XENBUS_STORE
     \brief Macro at assist in method invocation
@@ -282,7 +342,7 @@ typedef struct _XENBUS_STORE_INTERFACE_V1 XENBUS_STORE_INTERFACE, *PXENBUS_STORE
 #endif  // _WINDLL
 
 #define XENBUS_STORE_INTERFACE_VERSION_MIN  1
-#define XENBUS_STORE_INTERFACE_VERSION_MAX  1
+#define XENBUS_STORE_INTERFACE_VERSION_MAX  2
 
 #endif  // _XENBUS_STORE_INTERFACE_H
 
-- 
1.8.1.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 Wed Oct 21 05:25:42 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 21 Oct 2015 05:25: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 1Zolu9-0007iI-6S; Wed, 21 Oct 2015 05:25:41 +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 1Zolu6-0007iD-QE
	for win-pv-devel@lists.xenproject.org; Wed, 21 Oct 2015 05:25:39 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	E9/8A-12889-2D127265; Wed, 21 Oct 2015 05:25:38 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1445405136!24084925!1
X-Originating-IP: [66.111.4.27]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjcgPT4gODQ2Mw==\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21916 invoked from network); 21 Oct 2015 05:25:36 -0000
Received: from out3-smtp.messagingengine.com (HELO
	out3-smtp.messagingengine.com) (66.111.4.27)
	by server-2.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2015 05:25:36 -0000
Received: from compute2.internal (compute2.nyi.internal [10.202.2.42])
	by mailout.nyi.internal (Postfix) with ESMTP id 1AD7420606
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:25:36 -0400 (EDT)
Received: from frontend1 ([10.202.2.160])
	by compute2.internal (MEProxy); Wed, 21 Oct 2015 01:25:36 -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=iVXiY27XG7h4EZQeXRg/BTjo5mY=; b=bdny9B
	JTsuaz/r+7TtOzyyIx4QL6xRh3cWQwAIMgWc/0vXeiBk3cFXVCVcOwDctDm9MOdj
	lkjYv451F8i3OewuhtLwaI1p0St61nojI/5ho57HkCBUHon8jlIUZju2mND0fvHv
	cpHUHAaFGOKzZLjzQ6QGf18vuO1jrSm5RxwEw=
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=iVXiY27XG7h4EZQeXRg/BTjo5mY=; b=G7VSr
	HsAlzbOQSJS1pWG0DA2aCFkmaWhFaHSnI1dL+V6NfOG6aqxlFUF5fzLL/w95uMqD
	KHX0bMAc708573JS2sMQ5R9YiPhRyLMO6x16Js5yEFBxGBIjVdKUO4l8hRYRy8Rl
	QB+Lzsdxx7m0UaQKSEW4uYER4Oh8QNsAmjBuPs=
X-Sasl-enc: KwyLiWWwg83xdsCHeOljVXRBBpOz/Xm77Wq1YVkcqS0a 1445405135
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id E401DC0001D
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:25:34 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N0010
Message-ID: <562721CF.6020708@invisiblethingslab.com>
Date: Wed, 21 Oct 2015 07:25:35 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 1/6] Update XENBUS interface headers
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

Also add headers needed for next patches in the series.

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 include/cache_interface.h  | 233 ++++++++++++++++++++++++++++++++
 include/evtchn_interface.h | 325 +++++++++++++++++++++++++++++++++++++++++++++
 include/gnttab_interface.h | 249 ++++++++++++++++++++++++++++++++++
 include/store_interface.h  |  96 ++++++++++---
 4 files changed, 885 insertions(+), 18 deletions(-)
 create mode 100644 include/cache_interface.h
 create mode 100644 include/evtchn_interface.h
 create mode 100644 include/gnttab_interface.h

diff --git a/include/cache_interface.h b/include/cache_interface.h
new file mode 100644
index 0000000..dae3ac6
--- /dev/null
+++ b/include/cache_interface.h
@@ -0,0 +1,233 @@
+/* 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 cache_interface.h
+    \brief XENBUS CACHE Interface
+
+    This interface provides access to XENBUS's object cache
+    implementation.
+*/
+
+#ifndef _XENBUS_CACHE_INTERFACE_H
+#define _XENBUS_CACHE_INTERFACE_H
+
+#ifndef _WINDLL
+
+/*! \typedef XENBUS_CACHE
+    \brief Cache handle
+*/
+typedef struct _XENBUS_CACHE    XENBUS_CACHE, *PXENBUS_CACHE;
+
+/*! \typedef XENBUS_CACHE_ACQUIRE
+    \brief Acquire a reference to the CACHE interface
+
+    \param Interface The interface header
+*/  
+typedef NTSTATUS
+(*XENBUS_CACHE_ACQUIRE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_CACHE_RELEASE
+    \brief Release a reference to the CACHE interface
+
+    \param Interface The interface header
+*/  
+typedef VOID
+(*XENBUS_CACHE_RELEASE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_CACHE_CTOR
+    \brief Object creator callback
+
+    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
+    \param Object Newly allocated object
+
+    This callback is invoked just after a new object is allocated and may
+    be used to initialize any object data prior to its insertion into the
+    cache.
+*/
+typedef NTSTATUS
+(*XENBUS_CACHE_CTOR)(
+    IN  PVOID   Argument,
+    IN  PVOID   Object
+    );
+
+/*! \typedef XENBUS_CACHE_DTOR
+    \brief Object destructor callback
+
+    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
+    \param Object Object about to be freed
+
+    This callback is invoked just after an object is removed from the
+    cache and before it is freed and may be used to tear down any object data.
+*/
+typedef VOID
+(*XENBUS_CACHE_DTOR)(
+    IN  PVOID   Argument,
+    IN  PVOID   Object
+    );
+
+/*! \typedef XENBUS_CACHE_ACQUIRE_LOCK
+    \brief Cache lock callback
+
+    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
+
+    This callback is invoked if the cache implementation requires mutual
+    exclusion.
+*/
+typedef VOID
+(*XENBUS_CACHE_ACQUIRE_LOCK)(
+    IN  PVOID   Argument
+    );
+
+/*! \typedef XENBUS_CACHE_RELEASE_LOCK
+    \brief Cache unlock callback
+
+    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
+
+    This callback is invoked to release the mutual exclusion lock acquired
+    by a previous invocation of \a XENBUS_CACHE_ACQUIRE_LOCK.
+*/
+typedef VOID
+(*XENBUS_CACHE_RELEASE_LOCK)(
+    IN  PVOID   Argument
+    );
+
+/*! \typedef XENBUS_CACHE_CREATE
+    \brief Create a cache of objects of the given \a Size
+
+    \param Interface The interface header
+    \param Name A name for the cache which will be used in debug output
+    \param Size The size of each object in bytes
+    \param Reservation The target minimum population of the cache
+    \param Ctor A callback which is invoked when a new object created
+    \param Dtor A callback which is invoked when an object is destroyed
+    \param AcquireLock A callback invoked to acquire a spinlock
+    \param ReleaseLock A callback invoked to release the spinlock
+    \param Argument An optional context argument passed to the callbacks
+    \param Cache A pointer to a cache handle to be initialized
+
+    If a non-zero \a Reservation is specified then this method will fail
+    unless that number of objects can be immediately created.
+*/  
+typedef NTSTATUS
+(*XENBUS_CACHE_CREATE)(
+    IN  PINTERFACE                  Interface,
+    IN  const CHAR                  *Name,
+    IN  ULONG                       Size,
+    IN  ULONG                       Reservation,
+    IN  XENBUS_CACHE_CTOR           Ctor,
+    IN  XENBUS_CACHE_DTOR           Dtor,
+    IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
+    IN  XENBUS_CACHE_RELEASE_LOCK   ReleaseLock,
+    IN  PVOID                       Argument OPTIONAL,
+    OUT PXENBUS_CACHE               *Cache
+    );
+
+/*! \typedef XENBUS_CACHE_GET
+    \brief Get an object from a \a Cache
+
+    \param Interface The interface header
+    \param Cache The cache handle
+    \param Locked If mutually exclusive access to the cache is already
+    guaranteed then set this to TRUE
+*/
+typedef PVOID
+(*XENBUS_CACHE_GET)(
+    IN  PINTERFACE      Interface,
+    IN  PXENBUS_CACHE   Cache,
+    IN  BOOLEAN         Locked
+    );
+
+/*! \typedef XENBUS_CACHE_PUT
+    \brief Return an object to a \a Cache
+
+    \param Interface The interface header
+    \param Cache The cache handle
+    \param Locked If mutually exclusive access to the cache is already
+    guaranteed then set this to TRUE
+*/
+typedef VOID
+(*XENBUS_CACHE_PUT)(
+    IN  PINTERFACE      Interface,
+    IN  PXENBUS_CACHE   Cache,
+    IN  PVOID           Object,
+    IN  BOOLEAN         Locked
+    );
+
+/*! \typedef XENBUS_CACHE_DESTROY
+    \brief Destroy a \a Cache
+
+    \param Interface The interface header
+    \param Cache The cache handle
+
+    All objects must have been returned to the cache prior to destruction
+*/
+typedef VOID
+(*XENBUS_CACHE_DESTROY)(
+    IN  PINTERFACE      Interface,
+    IN  PXENBUS_CACHE   Cache
+    );
+
+// {A98DFD78-416A-4949-92A5-E084F2F4B44E}
+DEFINE_GUID(GUID_XENBUS_CACHE_INTERFACE, 
+0xa98dfd78, 0x416a, 0x4949, 0x92, 0xa5, 0xe0, 0x84, 0xf2, 0xf4, 0xb4, 0x4e);
+
+/*! \struct _XENBUS_CACHE_INTERFACE_V1
+    \brief CACHE interface version 1
+    \ingroup interfaces
+*/
+struct _XENBUS_CACHE_INTERFACE_V1 {
+    INTERFACE               Interface;
+    XENBUS_CACHE_ACQUIRE    CacheAcquire;
+    XENBUS_CACHE_RELEASE    CacheRelease;
+    XENBUS_CACHE_CREATE     CacheCreate;
+    XENBUS_CACHE_GET        CacheGet;
+    XENBUS_CACHE_PUT        CachePut;
+    XENBUS_CACHE_DESTROY    CacheDestroy;
+};
+
+typedef struct _XENBUS_CACHE_INTERFACE_V1 XENBUS_CACHE_INTERFACE, *PXENBUS_CACHE_INTERFACE;
+
+/*! \def XENBUS_CACHE
+    \brief Macro at assist in method invocation
+*/
+#define XENBUS_CACHE(_Method, _Interface, ...)    \
+    (_Interface)->Cache ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+
+#endif  // _WINDLL
+
+#define XENBUS_CACHE_INTERFACE_VERSION_MIN  1
+#define XENBUS_CACHE_INTERFACE_VERSION_MAX  1
+
+#endif  // _XENBUS_CACHE_INTERFACE_H
diff --git a/include/evtchn_interface.h b/include/evtchn_interface.h
new file mode 100644
index 0000000..c63f063
--- /dev/null
+++ b/include/evtchn_interface.h
@@ -0,0 +1,325 @@
+/* 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 evtchn_interface.h
+    \brief XENBUS EVTCHN Interface
+
+    This interface provides access to hypervisor event channels
+*/
+
+#ifndef _XENBUS_EVTCHN_INTERFACE_H
+#define _XENBUS_EVTCHN_INTERFACE_H
+
+#ifndef _WINDLL
+
+/*! \enum _XENBUS_EVTCHN_TYPE
+    \brief Event channel type to be opened
+*/
+typedef enum _XENBUS_EVTCHN_TYPE {
+    XENBUS_EVTCHN_TYPE_INVALID = 0,
+    XENBUS_EVTCHN_TYPE_FIXED,           /*!< Fixed */
+    XENBUS_EVTCHN_TYPE_UNBOUND,         /*!< Unbound */
+    XENBUS_EVTCHN_TYPE_INTER_DOMAIN,    /*!< Interdomain */
+    XENBUS_EVTCHN_TYPE_VIRQ             /*!< VIRQ */
+} XENBUS_EVTCHN_TYPE, *PXENBUS_EVTCHN_TYPE;
+
+/*! \typedef XENBUS_EVTCHN_CHANNEL
+    \brief Event channel handle
+*/
+typedef struct _XENBUS_EVTCHN_CHANNEL XENBUS_EVTCHN_CHANNEL, *PXENBUS_EVTCHN_CHANNEL;
+
+/*! \typedef XENBUS_EVTCHN_ACQUIRE
+    \brief Acquire a reference to the EVTCHN interface
+
+    \param Interface The interface header
+*/
+typedef NTSTATUS
+(*XENBUS_EVTCHN_ACQUIRE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_EVTCHN_RELEASE
+    \brief Release a reference to the EVTCHN interface
+
+    \param Interface The interface header
+*/
+typedef VOID
+(*XENBUS_EVTCHN_RELEASE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_EVTCHN_OPEN
+    \brief Open an event channel
+
+    \param Interface The interface header
+    \param Type The type of event channel to open
+    \param Function The callback function
+    \param Argument An optional context argument passed to the callback
+    \param ... Additional parameters required by \a Type
+
+    \b Fixed:
+    \param LocalPort The local port number of the (already bound) channel
+    \param Mask Set to TRUE if the channel should be automatically masked before invoking the callback
+
+    \b Unbound:
+    \param RemoteDomain The domid of the remote domain which will bind the channel
+    \param Mask Set to TRUE if the channel should be automatically masked before invoking the callback
+
+    \b Interdomain:
+    \param RemoteDomain The domid of the remote domain which has already bound the channel
+    \param RemotePort The port number bound to the channel in the remote domain
+    \param Mask Set to TRUE if the channel should be automatically masked before invoking the callback
+
+    \b VIRQ:
+    \param Index The index number of the VIRQ
+
+    \return Event channel handle
+*/
+typedef PXENBUS_EVTCHN_CHANNEL
+(*XENBUS_EVTCHN_OPEN)(
+    IN  PINTERFACE          Interface,
+    IN  XENBUS_EVTCHN_TYPE  Type,
+    IN  PKSERVICE_ROUTINE   Function,
+    IN  PVOID               Argument OPTIONAL,
+    ...
+    );
+
+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 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  USHORT                  Group,
+    IN  UCHAR                   Number
+    );
+
+typedef BOOLEAN
+(*XENBUS_EVTCHN_UNMASK_V1)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
+    IN  BOOLEAN                 InCallback
+    );
+
+/*! \typedef XENBUS_EVTCHN_UNMASK
+    \brief Unmask an event channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+    \param InCallback Set to TRUE if this method is invoked in context of the channel callback
+*/
+typedef VOID
+(*XENBUS_EVTCHN_UNMASK)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
+    IN  BOOLEAN                 InCallback
+    );
+
+/*! \typedef XENBUS_EVTCHN_SEND
+    \brief Send an event to the remote end of the channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+*/
+typedef VOID
+(*XENBUS_EVTCHN_SEND)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel
+    );
+
+/*! \typedef XENBUS_EVTCHN_TRIGGER
+    \brief Send an event to the local end of the channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+*/
+typedef VOID
+(*XENBUS_EVTCHN_TRIGGER)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel
+    );
+
+/*! \typedef XENBUS_EVTCHN_WAIT
+    \brief Wait for an event to the local end of the channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+    \param Timeout An optional timeout value (similar to KeWaitForSingleObject(), but non-zero values are allowed at DISPATCH_LEVEL).
+*/
+typedef NTSTATUS
+(*XENBUS_EVTCHN_WAIT)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
+    IN  PLARGE_INTEGER          Timeout OPTIONAL
+    );
+
+/*! \typedef XENBUS_EVTCHN_GET_PORT
+    \brief Get the local port number bound to the channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+    \return The port number
+*/
+typedef ULONG
+(*XENBUS_EVTCHN_GET_PORT)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel
+    );
+
+/*! \typedef XENBUS_EVTCHN_CLOSE
+    \brief Close an event channel
+
+    \param Interface The interface header
+    \param Channel The channel handle
+*/
+typedef VOID
+(*XENBUS_EVTCHN_CLOSE)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel
+    );
+
+// {BE2440AC-1098-4150-AF4D-452FADCEF923}
+DEFINE_GUID(GUID_XENBUS_EVTCHN_INTERFACE,
+0xbe2440ac, 0x1098, 0x4150, 0xaf, 0x4d, 0x45, 0x2f, 0xad, 0xce, 0xf9, 0x23);
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V1
+    \brief EVTCHN interface version 1
+    \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V1 {
+    INTERFACE               Interface;
+    XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
+    XENBUS_EVTCHN_RELEASE   EvtchnRelease;
+    XENBUS_EVTCHN_OPEN      EvtchnOpen;
+    XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
+    XENBUS_EVTCHN_SEND      EvtchnSend;
+    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
+    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
+    XENBUS_EVTCHN_CLOSE     EvtchnClose;
+};
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V2
+    \brief EVTCHN interface version 2
+    \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V2 {
+    INTERFACE               Interface;
+    XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
+    XENBUS_EVTCHN_RELEASE   EvtchnRelease;
+    XENBUS_EVTCHN_OPEN      EvtchnOpen;
+    XENBUS_EVTCHN_BIND_V2   EvtchnBindVersion2;
+    XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
+    XENBUS_EVTCHN_SEND      EvtchnSend;
+    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
+    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
+    XENBUS_EVTCHN_CLOSE     EvtchnClose;
+};
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V3
+    \brief EVTCHN interface version 3
+    \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V3 {
+    INTERFACE               Interface;
+    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;
+    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
+    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
+    XENBUS_EVTCHN_CLOSE     EvtchnClose;
+};
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V5
+    \brief EVTCHN interface version 5
+    \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V5 {
+    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;
+    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
+    XENBUS_EVTCHN_WAIT      EvtchnWait;
+    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
+    XENBUS_EVTCHN_CLOSE     EvtchnClose;
+};
+
+typedef struct _XENBUS_EVTCHN_INTERFACE_V5 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
+
+/*! \def XENBUS_EVTCHN
+    \brief Macro at assist in method invocation
+*/
+#define XENBUS_EVTCHN(_Method, _Interface, ...)    \
+    (_Interface)->Evtchn ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+
+#endif  // _WINDLL
+
+#define XENBUS_EVTCHN_INTERFACE_VERSION_MIN 1
+#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 5
+
+#endif  // _XENBUS_EVTCHN_INTERFACE_H
+
diff --git a/include/gnttab_interface.h b/include/gnttab_interface.h
new file mode 100644
index 0000000..b0f4adf
--- /dev/null
+++ b/include/gnttab_interface.h
@@ -0,0 +1,249 @@
+/* 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 gnttab_interface.h
+    \brief XENBUS GNTTAB Interface
+
+    This interface provides access to the hypervisor grant table
+*/
+
+#ifndef _XENBUS_GNTTAB_INTERFACE_H
+#define _XENBUS_GNTTAB_INTERFACE_H
+
+#include <cache_interface.h>
+
+#ifndef _WINDLL
+
+/*! \typedef XENBUS_GNTTAB_ENTRY
+    \brief Grant table entry handle
+*/
+typedef struct _XENBUS_GNTTAB_ENTRY XENBUS_GNTTAB_ENTRY, *PXENBUS_GNTTAB_ENTRY;
+
+/*! \typedef XENBUS_GNTTAB_CACHE
+    \brief Grant table cache handle
+*/
+typedef struct _XENBUS_GNTTAB_CACHE XENBUS_GNTTAB_CACHE, *PXENBUS_GNTTAB_CACHE;
+
+/*! \typedef XENBUS_GNTTAB_ACQUIRE
+    \brief Acquire a reference to the GNTTAB interface
+
+    \param Interface The interface header
+*/  
+typedef NTSTATUS
+(*XENBUS_GNTTAB_ACQUIRE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_GNTTAB_RELEASE
+    \brief Release a reference to the GNTTAB interface
+
+    \param Interface The interface header
+*/  
+typedef VOID
+(*XENBUS_GNTTAB_RELEASE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_GNTTAB_CREATE_CACHE
+    \brief Create a cache of grant table entries
+
+    \param Interface The interface header
+    \param Name A name for the cache which will be used in debug output
+    \param Reservation The target minimum population of the cache
+    \param AcquireLock A callback invoked to acquire a spinlock
+    \param ReleaseLock A callback invoked to release the spinlock
+    \param Argument An optional context argument passed to the callbacks
+    \param Cache A pointer to a grant table cache handle to be initialized
+*/  
+typedef NTSTATUS
+(*XENBUS_GNTTAB_CREATE_CACHE)(
+    IN  PINTERFACE                  Interface,
+    IN  const CHAR                  *Name,
+    IN  ULONG                       Reservation,
+    IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
+    IN  XENBUS_CACHE_RELEASE_LOCK   ReleaseLock,
+    IN  PVOID                       Argument OPTIONAL,
+    OUT PXENBUS_GNTTAB_CACHE        *Cache
+    );
+
+/*! \typedef XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS
+    \brief Get a table entry from the \a Cache permitting access to a given \a Pfn
+
+    \param Interface The interface header
+    \param Cache The grant table cache handle
+    \param Locked If mutually exclusive access to the cache is already
+    guaranteed then set this to TRUE
+    \param Domain The domid of the domain being granted access
+    \param Pfn The frame number of the page that we are granting access to
+    \param ReadOnly Set to TRUE if the foreign domain is only being granted
+    read access
+    \param Entry A pointer to a grant table entry handle to be initialized
+*/
+typedef NTSTATUS
+(*XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS)(
+    IN  PINTERFACE                  Interface,
+    IN  PXENBUS_GNTTAB_CACHE        Cache,
+    IN  BOOLEAN                     Locked,
+    IN  USHORT                      Domain,
+    IN  PFN_NUMBER                  Pfn,
+    IN  BOOLEAN                     ReadOnly,
+    OUT PXENBUS_GNTTAB_ENTRY        *Entry
+    );
+
+/*! \typedef XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS
+    \brief Revoke foreign access and return the \a Entry to the \a Cache
+
+    \param Interface The interface header
+    \param Cache The grant table cache handle
+    \param Locked If mutually exclusive access to the cache is already
+    guaranteed then set this to TRUE
+    \param Entry The grant table entry handle
+*/
+typedef NTSTATUS
+(*XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS)(
+    IN  PINTERFACE                  Interface,
+    IN  PXENBUS_GNTTAB_CACHE        Cache,
+    IN  BOOLEAN                     Locked,
+    IN  PXENBUS_GNTTAB_ENTRY        Entry
+    );
+
+/*! \typedef XENBUS_GNTTAB_GET_REFERENCE
+    \brief Get the reference number of the entry
+
+    \param Interface The interface header
+    \param Entry The grant table entry handle
+    \return The reference number
+*/  
+typedef ULONG
+(*XENBUS_GNTTAB_GET_REFERENCE)(
+    IN  PINTERFACE                  Interface,
+    IN  PXENBUS_GNTTAB_ENTRY        Entry
+    );
+
+/*! \typedef XENBUS_GNTTAB_DESTROY_CACHE
+    \brief Destroy a cache of grant table entries
+
+    \param Interface The interface header
+    \param Cache The grant table cache handle
+
+    All grant table entries must have been revoked prior to destruction
+    of the cache 
+*/  
+typedef VOID
+(*XENBUS_GNTTAB_DESTROY_CACHE)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_GNTTAB_CACHE    Cache
+    );
+
+/*! \typedef XENBUS_GNTTAB_MAP_FOREIGN_PAGES
+    \brief Map foreign memory pages into the system address space
+
+    \param Interface The interface header
+    \param Domain The domid of the foreign domain that granted the pages
+    \param NumberPages Number of pages to map
+    \param References Array of grant reference numbers shared by the foreign domain
+    \param ReadOnly If TRUE, pages are mapped with read-only access
+    \param Address The physical address that the foreign pages are mapped under
+*/
+
+typedef NTSTATUS
+(*XENBUS_GNTTAB_MAP_FOREIGN_PAGES)(
+    IN  PINTERFACE              Interface,
+    IN  USHORT                  Domain,
+    IN  ULONG                   NumberPages,
+    IN  PULONG                  References,
+    IN  BOOLEAN                 ReadOnly,
+    OUT PHYSICAL_ADDRESS        *Address
+    );
+
+/*! \typedef XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES
+    \brief Unmap foreign memory pages from the system address space
+
+    \param Interface The interface header
+    \param Address The physical address that the foreign pages are mapped under
+*/
+typedef NTSTATUS
+(*XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES)(
+    IN  PINTERFACE              Interface,
+    IN  PHYSICAL_ADDRESS        Address
+    );
+
+// {763679C5-E5C2-4A6D-8B88-6BB02EC42D8E}
+DEFINE_GUID(GUID_XENBUS_GNTTAB_INTERFACE, 
+0x763679c5, 0xe5c2, 0x4a6d, 0x8b, 0x88, 0x6b, 0xb0, 0x2e, 0xc4, 0x2d, 0x8e);
+
+/*! \struct _XENBUS_GNTTAB_INTERFACE_V1
+    \brief GNTTAB interface version 1
+    \ingroup interfaces
+*/
+struct _XENBUS_GNTTAB_INTERFACE_V1 {
+    INTERFACE                           Interface;
+    XENBUS_GNTTAB_ACQUIRE               GnttabAcquire;
+    XENBUS_GNTTAB_RELEASE               GnttabRelease;
+    XENBUS_GNTTAB_CREATE_CACHE          GnttabCreateCache;
+    XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS GnttabPermitForeignAccess;
+    XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS GnttabRevokeForeignAccess;
+    XENBUS_GNTTAB_GET_REFERENCE         GnttabGetReference;
+    XENBUS_GNTTAB_DESTROY_CACHE         GnttabDestroyCache;
+};
+
+/*! \struct _XENBUS_GNTTAB_INTERFACE_V2
+    \brief GNTTAB interface version 2
+    \ingroup interfaces
+*/
+struct _XENBUS_GNTTAB_INTERFACE_V2 {
+    INTERFACE                           Interface;
+    XENBUS_GNTTAB_ACQUIRE               GnttabAcquire;
+    XENBUS_GNTTAB_RELEASE               GnttabRelease;
+    XENBUS_GNTTAB_CREATE_CACHE          GnttabCreateCache;
+    XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS GnttabPermitForeignAccess;
+    XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS GnttabRevokeForeignAccess;
+    XENBUS_GNTTAB_GET_REFERENCE         GnttabGetReference;
+    XENBUS_GNTTAB_DESTROY_CACHE         GnttabDestroyCache;
+    XENBUS_GNTTAB_MAP_FOREIGN_PAGES     GnttabMapForeignPages;
+    XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES   GnttabUnmapForeignPages;
+};
+
+typedef struct _XENBUS_GNTTAB_INTERFACE_V2 XENBUS_GNTTAB_INTERFACE, *PXENBUS_GNTTAB_INTERFACE;
+
+/*! \def XENBUS_GNTTAB
+    \brief Macro at assist in method invocation
+*/
+#define XENBUS_GNTTAB(_Method, _Interface, ...)    \
+    (_Interface)->Gnttab ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+
+#endif  // _WINDLL
+
+#define XENBUS_GNTTAB_INTERFACE_VERSION_MIN 1
+#define XENBUS_GNTTAB_INTERFACE_VERSION_MAX 2
+
+#endif  // _XENBUS_GNTTAB_INTERFACE_H
+
diff --git a/include/store_interface.h b/include/store_interface.h
index 5bcbba3..52f1a1d 100644
--- a/include/store_interface.h
+++ b/include/store_interface.h
@@ -50,6 +50,23 @@ typedef struct _XENBUS_STORE_TRANSACTION    XENBUS_STORE_TRANSACTION, *PXENBUS_S
 */
 typedef struct _XENBUS_STORE_WATCH          XENBUS_STORE_WATCH, *PXENBUS_STORE_WATCH;
 
+/*! \typedef XENBUS_STORE_PERMISSION_MASK
+    \brief Bitmask of XenStore key permissions
+*/
+typedef enum _XENBUS_STORE_PERMISSION_MASK {
+    XENBUS_STORE_PERM_NONE = 0,
+    XENBUS_STORE_PERM_READ = 1,
+    XENBUS_STORE_PERM_WRITE = 2,
+} XENBUS_STORE_PERMISSION_MASK;
+
+/*! \typedef XENBUS_STORE_PERMISSION
+    \brief XenStore key permissions entry for a single domain
+*/
+typedef struct _XENBUS_STORE_PERMISSION {
+    USHORT                          Domain;
+    XENBUS_STORE_PERMISSION_MASK    Mask;
+} XENBUS_STORE_PERMISSION, *PXENBUS_STORE_PERMISSION;
+
 /*! \typedef XENBUS_STORE_ACQUIRE
     \brief Acquire a reference to the STORE interface
 
@@ -247,31 +264,74 @@ typedef VOID
     IN  PINTERFACE  Interface
     );
 
+/*! \typedef XENBUS_STORE_PERMISSIONS_SET
+    \brief Set permissions for a XenStore key
+
+    \param Interface The interface header
+    \param Transaction The transaction handle (NULL if this is not
+    part of a transaction)
+    \param Prefix An optional prefix for the \a Node
+    \param Node The concatenation of the \a Prefix and this value specifies
+    the XenStore key to set permissions of
+    \param Permissions An array of permissions to set
+    \param NumberPermissions Number of elements in the \a Permissions array
+*/
+typedef NTSTATUS
+(*XENBUS_STORE_PERMISSIONS_SET)(
+    IN  PINTERFACE                  Interface,
+    IN  PXENBUS_STORE_TRANSACTION   Transaction OPTIONAL,
+    IN  PCHAR                       Prefix OPTIONAL,
+    IN  PCHAR                       Node,
+    IN  PXENBUS_STORE_PERMISSION    Permissions,
+    IN  ULONG                       NumberPermissions
+    );
+
 // {86824C3B-D34E-4753-B281-2F1E3AD214D7}
 DEFINE_GUID(GUID_XENBUS_STORE_INTERFACE, 
 0x86824c3b, 0xd34e, 0x4753, 0xb2, 0x81, 0x2f, 0x1e, 0x3a, 0xd2, 0x14, 0xd7);
 
-struct _XENBUS_STORE_INTERFACE_V1 {
-    INTERFACE                       Interface;
-    XENBUS_STORE_ACQUIRE            StoreAcquire;
-    XENBUS_STORE_RELEASE            StoreRelease;
-    XENBUS_STORE_FREE               StoreFree;
-    XENBUS_STORE_READ               StoreRead;
-    XENBUS_STORE_PRINTF             StorePrintf;
-    XENBUS_STORE_REMOVE             StoreRemove;
-    XENBUS_STORE_DIRECTORY          StoreDirectory;
-    XENBUS_STORE_TRANSACTION_START  StoreTransactionStart;
-    XENBUS_STORE_TRANSACTION_END    StoreTransactionEnd;
-    XENBUS_STORE_WATCH_ADD          StoreWatchAdd;
-    XENBUS_STORE_WATCH_REMOVE       StoreWatchRemove;
-    XENBUS_STORE_POLL               StorePoll;
-};
-
 /*! \struct _XENBUS_STORE_INTERFACE_V1
     \brief STORE interface version 1
     \ingroup interfaces
 */
-typedef struct _XENBUS_STORE_INTERFACE_V1 XENBUS_STORE_INTERFACE, *PXENBUS_STORE_INTERFACE;
+struct _XENBUS_STORE_INTERFACE_V1 {
+    INTERFACE                       Interface;
+    XENBUS_STORE_ACQUIRE            StoreAcquire;
+    XENBUS_STORE_RELEASE            StoreRelease;
+    XENBUS_STORE_FREE               StoreFree;
+    XENBUS_STORE_READ               StoreRead;
+    XENBUS_STORE_PRINTF             StorePrintf;
+    XENBUS_STORE_REMOVE             StoreRemove;
+    XENBUS_STORE_DIRECTORY          StoreDirectory;
+    XENBUS_STORE_TRANSACTION_START  StoreTransactionStart;
+    XENBUS_STORE_TRANSACTION_END    StoreTransactionEnd;
+    XENBUS_STORE_WATCH_ADD          StoreWatchAdd;
+    XENBUS_STORE_WATCH_REMOVE       StoreWatchRemove;
+    XENBUS_STORE_POLL               StorePoll;
+};
+
+/*! \struct _XENBUS_STORE_INTERFACE_V2
+    \brief STORE interface version 2
+    \ingroup interfaces
+*/
+struct _XENBUS_STORE_INTERFACE_V2 {
+    INTERFACE                       Interface;
+    XENBUS_STORE_ACQUIRE            StoreAcquire;
+    XENBUS_STORE_RELEASE            StoreRelease;
+    XENBUS_STORE_FREE               StoreFree;
+    XENBUS_STORE_READ               StoreRead;
+    XENBUS_STORE_PRINTF             StorePrintf;
+    XENBUS_STORE_PERMISSIONS_SET    StorePermissionsSet;
+    XENBUS_STORE_REMOVE             StoreRemove;
+    XENBUS_STORE_DIRECTORY          StoreDirectory;
+    XENBUS_STORE_TRANSACTION_START  StoreTransactionStart;
+    XENBUS_STORE_TRANSACTION_END    StoreTransactionEnd;
+    XENBUS_STORE_WATCH_ADD          StoreWatchAdd;
+    XENBUS_STORE_WATCH_REMOVE       StoreWatchRemove;
+    XENBUS_STORE_POLL               StorePoll;
+};
+
+typedef struct _XENBUS_STORE_INTERFACE_V2 XENBUS_STORE_INTERFACE, *PXENBUS_STORE_INTERFACE;
 
 /*! \def XENBUS_STORE
     \brief Macro at assist in method invocation
@@ -282,7 +342,7 @@ typedef struct _XENBUS_STORE_INTERFACE_V1 XENBUS_STORE_INTERFACE, *PXENBUS_STORE
 #endif  // _WINDLL
 
 #define XENBUS_STORE_INTERFACE_VERSION_MIN  1
-#define XENBUS_STORE_INTERFACE_VERSION_MAX  1
+#define XENBUS_STORE_INTERFACE_VERSION_MAX  2
 
 #endif  // _XENBUS_STORE_INTERFACE_H
 
-- 
1.8.1.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 Wed Oct 21 05:25:58 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 21 Oct 2015 05:25: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 1ZoluQ-0007j2-AD; Wed, 21 Oct 2015 05:25:58 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1ZoluP-0007iv-IP
	for win-pv-devel@lists.xenproject.org; Wed, 21 Oct 2015 05:25:57 +0000
Received: from [85.158.139.211] by server-2.bemta-5.messagelabs.com id
	17/4D-31450-4E127265; Wed, 21 Oct 2015 05:25:56 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-6.tower-206.messagelabs.com!1445405153!43821359!1
X-Originating-IP: [66.111.4.27]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjcgPT4gODQ2Mw==\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25442 invoked from network); 21 Oct 2015 05:25:56 -0000
Received: from out3-smtp.messagingengine.com (HELO
	out3-smtp.messagingengine.com) (66.111.4.27)
	by server-6.tower-206.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2015 05:25:56 -0000
Received: from compute3.internal (compute3.nyi.internal [10.202.2.43])
	by mailout.nyi.internal (Postfix) with ESMTP id 882C620847
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:25:53 -0400 (EDT)
Received: from frontend1 ([10.202.2.160])
	by compute3.internal (MEProxy); Wed, 21 Oct 2015 01:25:53 -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=/OfPcLLVmLZwF2oSxSpVMcXKgCo=; b=Y9XC2Y
	4mWQVT4Fo00bS88g4v3maH5SPrTSM1IyTaff0P7q3jQAAiOdcigpRHM5MxW8IO3R
	4W6tsGXUCcE1Ekm9yWDWEiid1TU+gPyrwW2MmusIozEZRNStR66AccPNyXCvSKYK
	w2NPnT3yTo1fFDlJ87neN0DPGMo39StQ53+l0=
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=/OfPcLLVmLZwF2oSxSpVMcXKgCo=; b=gfbOP
	wL6U3XP6/KrYnsDP5AZen+sDXOY4LtE7i+/9zQGQlG6f00tixWA+1mCWtMM5uO0+
	VAKnbphXccPP4FkEsChAZCrHVaShxaxeLwe/WyOEvCoQtCP0c0Rg0W/fjZqla3dZ
	Zeyb/afC5bGgxd/DVGZNQDSFTcgplowzHZGPSA=
X-Sasl-enc: iJZ1ClIlbce9xAGFGYMWeWUnecBc1T0eiG9KzFTOQfGa 1445405153
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 07DDCC00016
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:25:52 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <562721E2.9090506@invisiblethingslab.com>
Date: Wed, 21 Oct 2015 07:25:54 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 2/6] Include ntifs.h instead of ntddk.h
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

Gnttab code uses KeStackAttachProcess which is only declared in ntifs.h
(conflicts with ntddk.h).

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 src/xeniface/driver.c | 3 +--
 src/xeniface/driver.h | 2 +-
 src/xeniface/fdo.c    | 2 +-
 src/xeniface/fdo.h    | 2 +-
 src/xeniface/wmi.c    | 3 +--
 src/xeniface/wmi.h    | 2 +-
 6 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/src/xeniface/driver.c b/src/xeniface/driver.c
index 281ebdf..1c84467 100644
--- a/src/xeniface/driver.c
+++ b/src/xeniface/driver.c
@@ -29,8 +29,7 @@
  * SUCH DAMAGE.
  */
 
-#include <ntddk.h>
-//#include <util.h>
+#include <ntifs.h>
 #include <version.h>
 
 #include "fdo.h"
diff --git a/src/xeniface/driver.h b/src/xeniface/driver.h
index 93ac645..00f2d8f 100644
--- a/src/xeniface/driver.h
+++ b/src/xeniface/driver.h
@@ -44,7 +44,7 @@
 #pragma warning(disable:4100 4057)
 
 #include <wmilib.h>
-#include <ntddk.h>
+#include <ntifs.h>
 extern PDRIVER_OBJECT   DriverObject;
 
 
diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index 321bfb3..51bda24 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -30,7 +30,7 @@
  */
 
 
-#include <ntddk.h>
+#include <ntifs.h>
 #include <wdmguid.h>
 #include <ntstrsafe.h>
 #include <stdlib.h>
diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
index 32f6bb1..4416064 100644
--- a/src/xeniface/fdo.h
+++ b/src/xeniface/fdo.h
@@ -32,7 +32,7 @@
 #ifndef _XENIFACE_FDO_H
 #define _XENIFACE_FDO_H
 
-#include <ntddk.h>
+#include <ntifs.h>
 #include <store_interface.h>
 #include <suspend_interface.h>
 #include <shared_info_interface.h>
diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
index 4285ada..1bdb834 100644
--- a/src/xeniface/wmi.c
+++ b/src/xeniface/wmi.c
@@ -30,12 +30,11 @@
  */
 
 
-#include <ntddk.h>
+#include <ntifs.h>
 #include <initguid.h>
 #include <wmistr.h>
 #include <wmilib.h>
 #include <stdio.h>
-#include <ntddk.h>
 #include <guiddef.h>
 #define NTSTRSAFE_LIB
 #include<ntstrsafe.h>
diff --git a/src/xeniface/wmi.h b/src/xeniface/wmi.h
index 7fb67ca..ed77af7 100644
--- a/src/xeniface/wmi.h
+++ b/src/xeniface/wmi.h
@@ -33,7 +33,7 @@
 #ifndef _XEVTCHN_WMI_H
 #define _XEVTCHN_WMI_H
 
-#include <ntddk.h>
+#include <ntifs.h>
 #include "driver.h"
 #include "wmi_generated.h"
 
-- 
1.8.1.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 Wed Oct 21 05:25:58 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 21 Oct 2015 05:25: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 1ZoluQ-0007j2-AD; Wed, 21 Oct 2015 05:25:58 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1ZoluP-0007iv-IP
	for win-pv-devel@lists.xenproject.org; Wed, 21 Oct 2015 05:25:57 +0000
Received: from [85.158.139.211] by server-2.bemta-5.messagelabs.com id
	17/4D-31450-4E127265; Wed, 21 Oct 2015 05:25:56 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-6.tower-206.messagelabs.com!1445405153!43821359!1
X-Originating-IP: [66.111.4.27]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjcgPT4gODQ2Mw==\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25442 invoked from network); 21 Oct 2015 05:25:56 -0000
Received: from out3-smtp.messagingengine.com (HELO
	out3-smtp.messagingengine.com) (66.111.4.27)
	by server-6.tower-206.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2015 05:25:56 -0000
Received: from compute3.internal (compute3.nyi.internal [10.202.2.43])
	by mailout.nyi.internal (Postfix) with ESMTP id 882C620847
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:25:53 -0400 (EDT)
Received: from frontend1 ([10.202.2.160])
	by compute3.internal (MEProxy); Wed, 21 Oct 2015 01:25:53 -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=/OfPcLLVmLZwF2oSxSpVMcXKgCo=; b=Y9XC2Y
	4mWQVT4Fo00bS88g4v3maH5SPrTSM1IyTaff0P7q3jQAAiOdcigpRHM5MxW8IO3R
	4W6tsGXUCcE1Ekm9yWDWEiid1TU+gPyrwW2MmusIozEZRNStR66AccPNyXCvSKYK
	w2NPnT3yTo1fFDlJ87neN0DPGMo39StQ53+l0=
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=/OfPcLLVmLZwF2oSxSpVMcXKgCo=; b=gfbOP
	wL6U3XP6/KrYnsDP5AZen+sDXOY4LtE7i+/9zQGQlG6f00tixWA+1mCWtMM5uO0+
	VAKnbphXccPP4FkEsChAZCrHVaShxaxeLwe/WyOEvCoQtCP0c0Rg0W/fjZqla3dZ
	Zeyb/afC5bGgxd/DVGZNQDSFTcgplowzHZGPSA=
X-Sasl-enc: iJZ1ClIlbce9xAGFGYMWeWUnecBc1T0eiG9KzFTOQfGa 1445405153
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 07DDCC00016
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:25:52 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <562721E2.9090506@invisiblethingslab.com>
Date: Wed, 21 Oct 2015 07:25:54 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 2/6] Include ntifs.h instead of ntddk.h
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

Gnttab code uses KeStackAttachProcess which is only declared in ntifs.h
(conflicts with ntddk.h).

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 src/xeniface/driver.c | 3 +--
 src/xeniface/driver.h | 2 +-
 src/xeniface/fdo.c    | 2 +-
 src/xeniface/fdo.h    | 2 +-
 src/xeniface/wmi.c    | 3 +--
 src/xeniface/wmi.h    | 2 +-
 6 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/src/xeniface/driver.c b/src/xeniface/driver.c
index 281ebdf..1c84467 100644
--- a/src/xeniface/driver.c
+++ b/src/xeniface/driver.c
@@ -29,8 +29,7 @@
  * SUCH DAMAGE.
  */
 
-#include <ntddk.h>
-//#include <util.h>
+#include <ntifs.h>
 #include <version.h>
 
 #include "fdo.h"
diff --git a/src/xeniface/driver.h b/src/xeniface/driver.h
index 93ac645..00f2d8f 100644
--- a/src/xeniface/driver.h
+++ b/src/xeniface/driver.h
@@ -44,7 +44,7 @@
 #pragma warning(disable:4100 4057)
 
 #include <wmilib.h>
-#include <ntddk.h>
+#include <ntifs.h>
 extern PDRIVER_OBJECT   DriverObject;
 
 
diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index 321bfb3..51bda24 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -30,7 +30,7 @@
  */
 
 
-#include <ntddk.h>
+#include <ntifs.h>
 #include <wdmguid.h>
 #include <ntstrsafe.h>
 #include <stdlib.h>
diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
index 32f6bb1..4416064 100644
--- a/src/xeniface/fdo.h
+++ b/src/xeniface/fdo.h
@@ -32,7 +32,7 @@
 #ifndef _XENIFACE_FDO_H
 #define _XENIFACE_FDO_H
 
-#include <ntddk.h>
+#include <ntifs.h>
 #include <store_interface.h>
 #include <suspend_interface.h>
 #include <shared_info_interface.h>
diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
index 4285ada..1bdb834 100644
--- a/src/xeniface/wmi.c
+++ b/src/xeniface/wmi.c
@@ -30,12 +30,11 @@
  */
 
 
-#include <ntddk.h>
+#include <ntifs.h>
 #include <initguid.h>
 #include <wmistr.h>
 #include <wmilib.h>
 #include <stdio.h>
-#include <ntddk.h>
 #include <guiddef.h>
 #define NTSTRSAFE_LIB
 #include<ntstrsafe.h>
diff --git a/src/xeniface/wmi.h b/src/xeniface/wmi.h
index 7fb67ca..ed77af7 100644
--- a/src/xeniface/wmi.h
+++ b/src/xeniface/wmi.h
@@ -33,7 +33,7 @@
 #ifndef _XEVTCHN_WMI_H
 #define _XEVTCHN_WMI_H
 
-#include <ntddk.h>
+#include <ntifs.h>
 #include "driver.h"
 #include "wmi_generated.h"
 
-- 
1.8.1.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 Wed Oct 21 05:26:11 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 21 Oct 2015 05:26:11 +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 1Zolud-0007jm-C5; Wed, 21 Oct 2015 05:26:11 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1Zolub-0007jh-OD
	for win-pv-devel@lists.xenproject.org; Wed, 21 Oct 2015 05:26:10 +0000
Received: from [85.158.139.211] by server-13.bemta-5.messagelabs.com id
	7F/E1-02324-1F127265; Wed, 21 Oct 2015 05:26:09 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-6.tower-206.messagelabs.com!1445405166!43821386!1
X-Originating-IP: [66.111.4.27]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjcgPT4gODQ2Mw==\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25980 invoked from network); 21 Oct 2015 05:26:07 -0000
Received: from out3-smtp.messagingengine.com (HELO
	out3-smtp.messagingengine.com) (66.111.4.27)
	by server-6.tower-206.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2015 05:26:07 -0000
Received: from compute2.internal (compute2.nyi.internal [10.202.2.42])
	by mailout.nyi.internal (Postfix) with ESMTP id CD169204DC
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:26:06 -0400 (EDT)
Received: from frontend1 ([10.202.2.160])
	by compute2.internal (MEProxy); Wed, 21 Oct 2015 01:26:06 -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=EN0uUkkbVhe9mSsvQCN1b/rtreg=; b=o+pcXO
	wSedEt2SswKzXkkcBkJpm9hZiaWI5rYsnouueb8SFv94DSgT3FWd8bHzc8DlHZr5
	N+qyFKQbkfF5EZ0/XKpO6KYYtxLWrFo57kPcVROXqxTEWk9JvtDvYScaWu8oZ/lO
	Tn/RtLwAILNTkmki8qbz4SDzWXokM9VxifGYY=
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=EN0uUkkbVhe9mSsvQCN1b/rtreg=; b=Kp0Gp
	1zErtDHUk9ZCNU0cYg/+9j0qxOQt3lH9mmrtpQSHawUZ8X8MzQfxaltBaz/I+ChH
	TPk7Mnldwrha/CzKnavaNkHtW950ES2bvdeqhWq/jmT06d4M37QonUCYqUD8H8qq
	IUUhWJit3FipDpNnGt/A7kAkoavc61hy1CQvOA=
X-Sasl-enc: K+eCwM3jfRfgHFMKaviEkBblvnj3vC0beOFUglUz3Jqj 1445405165
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 8DE3EC00014
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:26:05 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <562721EE.6090909@invisiblethingslab.com>
Date: Wed, 21 Oct 2015 07:26:06 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 3/6] Untabify the whole XENIFACE project
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

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 include/util.h        |   8 +-
 src/xeniface/driver.c |  32 +--
 src/xeniface/driver.h |   2 +-
 src/xeniface/fdo.c    | 268 +++++++++++-----------
 src/xeniface/fdo.h    |  14 +-
 src/xeniface/ioctls.c |   4 +-
 src/xeniface/log.h    |   4 +-
 src/xeniface/thread.c |   2 +-
 src/xeniface/wmi.c    | 604 +++++++++++++++++++++++++-------------------------
 src/xeniface/wmi.h    |   8 +-
 10 files changed, 473 insertions(+), 473 deletions(-)

diff --git a/include/util.h b/include/util.h
index a05fb34..10e5414 100644
--- a/include/util.h
+++ b/include/util.h
@@ -232,10 +232,10 @@ __AllocatePage(
 
     MdlMappedSystemVa = MmMapLockedPagesSpecifyCache(Mdl,
                                                      KernelMode,
-						                             MmCached,   
-						                             NULL,
-						                             FALSE,
-						                             NormalPagePriority);
+                                                     MmCached,
+                                                     NULL,
+                                                     FALSE,
+                                                     NormalPagePriority);
 
     status = STATUS_UNSUCCESSFUL;
     if (MdlMappedSystemVa == NULL)
diff --git a/src/xeniface/driver.c b/src/xeniface/driver.c
index 1c84467..40b1669 100644
--- a/src/xeniface/driver.c
+++ b/src/xeniface/driver.c
@@ -58,9 +58,9 @@ DriverUnload(
         goto done;
 
 
-	if (DriverParameters.RegistryPath.Buffer != NULL) {
-		ExFreePool(DriverParameters.RegistryPath.Buffer);
-	}
+    if (DriverParameters.RegistryPath.Buffer != NULL) {
+        ExFreePool(DriverParameters.RegistryPath.Buffer);
+    }
 
 done:
     DriverObject = NULL;
@@ -145,7 +145,7 @@ DriverEntry(
     )
 {
     ULONG               Index;
-	NTSTATUS status = STATUS_UNSUCCESSFUL;
+    NTSTATUS status = STATUS_UNSUCCESSFUL;
     ASSERT3P(DriverObject, ==, NULL);
 
     ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
@@ -156,16 +156,16 @@ DriverEntry(
          MAJOR_VERSION_STR "." MINOR_VERSION_STR "." MICRO_VERSION_STR "." BUILD_NUMBER_STR,
          DAY_STR "/" MONTH_STR "/" YEAR_STR);
 
-	DriverParameters.RegistryPath.MaximumLength = RegistryPath->Length + sizeof(UNICODE_NULL);
-	DriverParameters.RegistryPath.Length = RegistryPath->Length;
-	DriverParameters.RegistryPath.Buffer = ExAllocatePoolWithTag (PagedPool, 
-												DriverParameters.RegistryPath.MaximumLength,
-												XENIFACE_POOL_TAG);
-	if (NULL == DriverParameters.RegistryPath.Buffer) {
-		status = STATUS_INSUFFICIENT_RESOURCES;
-		goto fail1;
-	}
-	RtlCopyUnicodeString(&DriverParameters.RegistryPath, RegistryPath);
+    DriverParameters.RegistryPath.MaximumLength = RegistryPath->Length + sizeof(UNICODE_NULL);
+    DriverParameters.RegistryPath.Length = RegistryPath->Length;
+    DriverParameters.RegistryPath.Buffer = ExAllocatePoolWithTag (PagedPool, 
+                                                DriverParameters.RegistryPath.MaximumLength,
+                                                XENIFACE_POOL_TAG);
+    if (NULL == DriverParameters.RegistryPath.Buffer) {
+        status = STATUS_INSUFFICIENT_RESOURCES;
+        goto fail1;
+    }
+    RtlCopyUnicodeString(&DriverParameters.RegistryPath, RegistryPath);
 
 
     DriverObject = _DriverObject;
@@ -187,6 +187,6 @@ done:
 
     return STATUS_SUCCESS;
 fail1:
-	Error("fail1 (%08x)\n", status);
-	return status;
+    Error("fail1 (%08x)\n", status);
+    return status;
 }
diff --git a/src/xeniface/driver.h b/src/xeniface/driver.h
index 00f2d8f..f3c86e8 100644
--- a/src/xeniface/driver.h
+++ b/src/xeniface/driver.h
@@ -51,7 +51,7 @@ extern PDRIVER_OBJECT   DriverObject;
 #define MAX_DEVICE_ID_LEN   200
 
 typedef struct _XENIFACE_PARAMETERS {
-	UNICODE_STRING RegistryPath;
+    UNICODE_STRING RegistryPath;
 
 } XENIFACE_PARAMETERS, *PXENIFACE_PARAMETERS;
 
diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index 51bda24..b73dee1 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -1,31 +1,31 @@
 /* Copyright (c) Citrix Systems Inc.
  * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, 
- * with or without modification, are permitted provided 
+ *
+ * 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 
+ *
+ * *   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 
+ * *   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 
+ *
+ * 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.
  */
 
@@ -70,7 +70,7 @@ FdoInitialiseXSRegistryEntries(
     ANSI_STRING AnsiValue;
     char *value;
     NTSTATUS status;
-	NT_ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
+    NT_ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
     status = XENBUS_STORE(Read,
                           &Fdo->StoreInterface,
                           NULL,
@@ -113,7 +113,7 @@ FdoInitialiseXSRegistryEntries(
     }
 
     ZwClose(RegHandle);
-    
+
     RtlFreeUnicodeString(&UnicodeValue);
     XENBUS_STORE(Free, &Fdo->StoreInterface, value);
 
@@ -140,40 +140,40 @@ failXS:
 #define REGISTRY_THREAD_END_EVENT 1
 #define REGISTRY_EVENTS 2
 
-static NTSTATUS FdoRegistryThreadHandler(IN  PXENIFACE_THREAD  Self, 
-								  IN PVOID StartContext) {
-	KEVENT* threadevents[REGISTRY_EVENTS];
-	PXENIFACE_FDO Fdo = (PXENIFACE_FDO)StartContext;
-	NTSTATUS status;
+static NTSTATUS FdoRegistryThreadHandler(IN  PXENIFACE_THREAD  Self,
+                                         IN  PVOID StartContext) {
+    KEVENT* threadevents[REGISTRY_EVENTS];
+    PXENIFACE_FDO Fdo = (PXENIFACE_FDO)StartContext;
+    NTSTATUS status;
 
-	PKEVENT             Event;
+    PKEVENT             Event;
 
     Event = ThreadGetEvent(Self);
 
-	threadevents[REGISTRY_WRITE_EVENT] = &Fdo->registryWriteEvent;
-	threadevents[REGISTRY_THREAD_END_EVENT] = Event;
+    threadevents[REGISTRY_WRITE_EVENT] = &Fdo->registryWriteEvent;
+    threadevents[REGISTRY_THREAD_END_EVENT] = Event;
 
-	for(;;) {
-		
-		status = KeWaitForMultipleObjects(REGISTRY_EVENTS, (PVOID *)threadevents, WaitAny, Executive, KernelMode, TRUE, NULL, NULL);
-		if ((status>=STATUS_WAIT_0) && (status < STATUS_WAIT_0+REGISTRY_EVENTS)) {
-			if (status == STATUS_WAIT_0+REGISTRY_WRITE_EVENT) {
+    for(;;) {
+
+        status = KeWaitForMultipleObjects(REGISTRY_EVENTS, (PVOID *)threadevents, WaitAny, Executive, KernelMode, TRUE, NULL, NULL);
+        if ((status>=STATUS_WAIT_0) && (status < STATUS_WAIT_0+REGISTRY_EVENTS)) {
+            if (status == STATUS_WAIT_0+REGISTRY_WRITE_EVENT) {
                 XenIfaceDebugPrint(ERROR,"WriteRegistry\n");
                 FdoInitialiseXSRegistryEntries(Fdo);
                 KeClearEvent(threadevents[REGISTRY_WRITE_EVENT]);
-			}
-			if (status == STATUS_WAIT_0+REGISTRY_THREAD_END_EVENT) {
-				if (ThreadIsAlerted(Self))
-					return STATUS_SUCCESS;
-				KeClearEvent(threadevents[REGISTRY_THREAD_END_EVENT]);
-			}
-			
-		}
-		else if (!NT_SUCCESS(status)) {
-			XenIfaceDebugPrint(ERROR, "Registry handler thread failed %x\n", status);
-			return status;
-		}
-	}
+            }
+            if (status == STATUS_WAIT_0+REGISTRY_THREAD_END_EVENT) {
+                if (ThreadIsAlerted(Self))
+                    return STATUS_SUCCESS;
+                KeClearEvent(threadevents[REGISTRY_THREAD_END_EVENT]);
+            }
+
+        }
+        else if (!NT_SUCCESS(status)) {
+            XenIfaceDebugPrint(ERROR, "Registry handler thread failed %x\n", status);
+            return status;
+        }
+    }
 
 }
 
@@ -311,7 +311,7 @@ __FdoSetName(
     status = RtlUnicodeStringToAnsiString(&Ansi, &Unicode, FALSE);
     if (!NT_SUCCESS(status))
         goto fail1;
-    
+
     for (Index = 0; Dx->Name[Index] != '\0'; Index++) {
         if (!isalnum((UCHAR)Dx->Name[Index]))
             Dx->Name[Index] = '_';
@@ -437,7 +437,7 @@ __FdoForwardIrpSynchronously(
     IN  PVOID           Context
     )
 {
-	PKEVENT             Event = (PKEVENT)Context;
+    PKEVENT             Event = (PKEVENT)Context;
 
     UNREFERENCED_PARAMETER(DeviceObject);
     UNREFERENCED_PARAMETER(Irp);
@@ -595,7 +595,7 @@ __FdoFreeAnsi(
 
     for (Index = 0; Ansi[Index].Buffer != NULL; Index++)
         __FdoFree(Ansi[Index].Buffer);
-        
+
     __FdoFree(Ansi);
 }
 
@@ -752,7 +752,7 @@ FdoD3ToD0(
     if (!NT_SUCCESS(status))
         goto fail4;
 
-	Fdo->InterfacesAcquired = TRUE;
+    Fdo->InterfacesAcquired = TRUE;
     KeLowerIrql(Irql);
 
     return STATUS_SUCCESS;
@@ -760,7 +760,7 @@ FdoD3ToD0(
 fail4:
     Error("fail4\n");
 
-	XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
+    XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
 
 fail3:
     Error("fail3\n");
@@ -788,7 +788,7 @@ FdoD0ToD3(
     KIRQL           Irql;
 
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
-	Fdo->InterfacesAcquired = FALSE;
+    Fdo->InterfacesAcquired = FALSE;
     KeRaiseIrql(DISPATCH_LEVEL, &Irql);
 
     XENBUS_SUSPEND(Deregister,
@@ -796,12 +796,12 @@ FdoD0ToD3(
                    Fdo->SuspendCallbackLate);
     Fdo->SuspendCallbackLate = NULL;
 
-	XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
+    XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
 
     XENBUS_SUSPEND(Release, &Fdo->SuspendInterface);
 
     __FdoD0ToD3(Fdo);
-	
+
     KeLowerIrql(Irql);
 }
 
@@ -854,16 +854,16 @@ FdoStartDevice(
     if (!NT_SUCCESS(status))
         goto fail3;
 
-	status =  IoSetDeviceInterfaceState(&Fdo->InterfaceName, TRUE);
-	if (!NT_SUCCESS(status))
-		goto fail4;
+    status =  IoSetDeviceInterfaceState(&Fdo->InterfaceName, TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail4;
 
 
-	if (__FdoGetDevicePnpState(Fdo) != Stopped) {
-		status = WmiInit(Fdo);
-		if (!NT_SUCCESS(status))
-			goto fail5;
-	}
+    if (__FdoGetDevicePnpState(Fdo) != Stopped) {
+        status = WmiInit(Fdo);
+        if (!NT_SUCCESS(status))
+            goto fail5;
+    }
 
     __FdoSetDevicePnpState(Fdo, Started);
 
@@ -874,13 +874,13 @@ FdoStartDevice(
     return status;
 
 fail5:
-	Error("fail5\n");
+    Error("fail5\n");
 #pragma warning(suppress : 6031)
-	IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
+    IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
 
 fail4:
-	Error("fail4\n");
-	FdoD0ToD3(Fdo);
+    Error("fail4\n");
+    FdoD0ToD3(Fdo);
 
 fail3:
     Error("fail3\n");
@@ -1008,7 +1008,7 @@ FdoSurpriseRemoval(
     __FdoSetDevicePnpState(Fdo, SurpriseRemovePending);
 
     Irp->IoStatus.Status = STATUS_SUCCESS;
-#pragma warning(suppress : 6031) 
+#pragma warning(suppress : 6031)
     IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
     WmiFinalise(Fdo);
 
@@ -1031,7 +1031,7 @@ FdoRemoveDevice(
     if (__FdoGetDevicePowerState(Fdo) != PowerDeviceD0)
         goto done;
 
-	FdoD0ToD3(Fdo);
+    FdoD0ToD3(Fdo);
 
     __FdoSetSystemPowerState(Fdo, PowerSystemSleeping3);
     FdoS3ToS4(Fdo);
@@ -1043,7 +1043,7 @@ done:
     __FdoSetDevicePnpState(Fdo, Deleted);
 
     Irp->IoStatus.Status = STATUS_SUCCESS;
-#pragma warning(suppress : 6031) 
+#pragma warning(suppress : 6031)
     IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
     WmiFinalise(Fdo);
 
@@ -1139,7 +1139,7 @@ FdoDeviceUsageNotification(
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    NotDisableable = FALSE;    
+    NotDisableable = FALSE;
     for (Type = (DEVICE_USAGE_NOTIFICATION_TYPE)0; Type <= DeviceUsageTypeDumpFile; Type++) {
         if (Fdo->Usage[Type] != 0) {
             NotDisableable = TRUE;
@@ -1151,7 +1151,7 @@ FdoDeviceUsageNotification(
 
     if (Fdo->NotDisableable != NotDisableable) {
         Fdo->NotDisableable = NotDisableable;
-    
+
         IoInvalidateDeviceState(__FdoGetPhysicalDeviceObject(Fdo));
     }
 
@@ -1210,8 +1210,8 @@ FdoDispatchPnp(
     MinorFunction = StackLocation->MinorFunction;
 
     Trace("====> (%02x:%s)\n",
-          MinorFunction, 
-          PnpMinorFunctionName(MinorFunction)); 
+          MinorFunction,
+          PnpMinorFunctionName(MinorFunction));
 
     switch (StackLocation->MinorFunction) {
     case IRP_MN_START_DEVICE:
@@ -1265,9 +1265,9 @@ FdoDispatchPnp(
     }
 
     Trace("<==== (%02x:%s)(%08x)\n",
-          MinorFunction, 
+          MinorFunction,
           PnpMinorFunctionName(MinorFunction),
-          status); 
+          status);
 
     return status;
 }
@@ -1299,7 +1299,7 @@ __FdoSetDevicePowerUp(
 
     ASSERT3U(DeviceState, ==, PowerDeviceD0);
     status = FdoD3ToD0(Fdo);
-	SessionsResumeAll(Fdo);
+    SessionsResumeAll(Fdo);
     ASSERT(NT_SUCCESS(status));
 
 done:
@@ -1332,9 +1332,9 @@ __FdoSetDevicePowerDown(
     ASSERT3U(DeviceState, ==, PowerDeviceD3);
 
     if (__FdoGetDevicePowerState(Fdo) == PowerDeviceD0){
-		SessionsSuspendAll(Fdo);
+        SessionsSuspendAll(Fdo);
         FdoD0ToD3(Fdo);
-	}
+    }
 
     IoSkipCurrentIrpStackLocation(Irp);
     status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
@@ -1358,7 +1358,7 @@ __FdoSetDevicePower(
     PowerAction = StackLocation->Parameters.Power.ShutdownType;
 
     Trace("====> (%s:%s)\n",
-          PowerDeviceStateName(DeviceState), 
+          PowerDeviceStateName(DeviceState),
           PowerActionName(PowerAction));
 
     ASSERT3U(PowerAction, <, PowerActionShutdown);
@@ -1376,7 +1376,7 @@ __FdoSetDevicePower(
 
 done:
     Trace("<==== (%s:%s)(%08x)\n",
-          PowerDeviceStateName(DeviceState), 
+          PowerDeviceStateName(DeviceState),
           PowerActionName(PowerAction),
           status);
     return status;
@@ -1532,7 +1532,7 @@ __FdoSetSystemPower(
     PowerAction = StackLocation->Parameters.Power.ShutdownType;
 
     Trace("====> (%s:%s)\n",
-          PowerSystemStateName(SystemState), 
+          PowerSystemStateName(SystemState),
           PowerActionName(PowerAction));
 
     ASSERT3U(PowerAction, <, PowerActionShutdown);
@@ -1550,7 +1550,7 @@ __FdoSetSystemPower(
 
 done:
     Trace("<==== (%s:%s)(%08x)\n",
-          PowerSystemStateName(SystemState), 
+          PowerSystemStateName(SystemState),
           PowerActionName(PowerAction),
           status);
     return status;
@@ -1616,7 +1616,7 @@ __FdoQueryDevicePower(
     PowerAction = StackLocation->Parameters.Power.ShutdownType;
 
     Trace("====> (%s:%s)\n",
-          PowerDeviceStateName(DeviceState), 
+          PowerDeviceStateName(DeviceState),
           PowerActionName(PowerAction));
 
     ASSERT3U(PowerAction, <, PowerActionShutdown);
@@ -1634,7 +1634,7 @@ __FdoQueryDevicePower(
 
 done:
     Trace("<==== (%s:%s)(%08x)\n",
-          PowerDeviceStateName(DeviceState), 
+          PowerDeviceStateName(DeviceState),
           PowerActionName(PowerAction),
           status);
     return status;
@@ -1768,7 +1768,7 @@ __FdoQuerySystemPower(
     PowerAction = StackLocation->Parameters.Power.ShutdownType;
 
     Trace("====> (%s:%s)\n",
-          PowerSystemStateName(SystemState), 
+          PowerSystemStateName(SystemState),
           PowerActionName(PowerAction));
 
     ASSERT3U(PowerAction, <, PowerActionShutdown);
@@ -1786,7 +1786,7 @@ __FdoQuerySystemPower(
 
 done:
     Trace("<==== (%s:%s)(%08x)\n",
-          PowerSystemStateName(SystemState), 
+          PowerSystemStateName(SystemState),
           PowerActionName(PowerAction),
           status);
 
@@ -2080,26 +2080,26 @@ FdoDispatch(
         status = FdoDispatchPower(Fdo, Irp);
         break;
 
-	case IRP_MJ_DEVICE_CONTROL:
-		status = XenIFaceIoctl(Fdo, Irp);
-		break;
+    case IRP_MJ_DEVICE_CONTROL:
+        status = XenIFaceIoctl(Fdo, Irp);
+        break;
 
-	case IRP_MJ_SYSTEM_CONTROL:
-		status = XenIfaceSystemControl(Fdo, Irp);
-		break;
+    case IRP_MJ_SYSTEM_CONTROL:
+        status = XenIfaceSystemControl(Fdo, Irp);
+        break;
 
-	case IRP_MJ_READ:
-	case IRP_MJ_WRITE:
-		status = FdoReadWrite(Fdo, Irp);
-		break;
+    case IRP_MJ_READ:
+    case IRP_MJ_WRITE:
+        status = FdoReadWrite(Fdo, Irp);
+        break;
 
-	case IRP_MJ_CREATE:
-		status = FdoCreateFile(Fdo, Irp);
-		break;
+    case IRP_MJ_CREATE:
+        status = FdoCreateFile(Fdo, Irp);
+        break;
 
-	case IRP_MJ_CLOSE:
-		status = FdoClose(Fdo, Irp);
-		break;
+    case IRP_MJ_CLOSE:
+        status = FdoClose(Fdo, Irp);
+        break;
 
     default:
         status = FdoDispatchDefault(Fdo, Irp);
@@ -2149,7 +2149,7 @@ FdoQueryInterface(
     StackLocation->Parameters.QueryInterface.Size = (USHORT)Size;
     StackLocation->Parameters.QueryInterface.Version = (USHORT)Version;
     StackLocation->Parameters.QueryInterface.Interface = Interface;
-    
+
     Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
 
     status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
@@ -2227,7 +2227,7 @@ FdoCreate(
     Dx->SystemPowerState = PowerSystemShutdown;
     Dx->DevicePowerState = PowerDeviceD3;
 
-	FunctionDeviceObject->Flags |= DO_POWER_PAGABLE;
+    FunctionDeviceObject->Flags |= DO_POWER_PAGABLE;
     FunctionDeviceObject->Flags |= DO_BUFFERED_IO;
 
     Fdo = (PXENIFACE_FDO)__FdoAllocate(sizeof (XENIFACE_FDO));
@@ -2258,12 +2258,12 @@ FdoCreate(
         goto fail5;
 
 #pragma prefast(suppress:6014) // Possibly leaking Fdo->InterfaceName
-	status = IoRegisterDeviceInterface(PhysicalDeviceObject,
-										(LPGUID)&GUID_INTERFACE_XENIFACE,
-										NULL,
-										&Fdo->InterfaceName);
-	if (!NT_SUCCESS(status))
-		goto fail6;
+    status = IoRegisterDeviceInterface(PhysicalDeviceObject,
+                                       (LPGUID)&GUID_INTERFACE_XENIFACE,
+                                       NULL,
+                                       &Fdo->InterfaceName);
+    if (!NT_SUCCESS(status))
+        goto fail6;
 
     status = __FdoSetName(Fdo, Name);
     if (!NT_SUCCESS(status))
@@ -2300,13 +2300,13 @@ FdoCreate(
     InitializeListHead(&Dx->ListEntry);
     Fdo->References = 1;
 
-	FdoInitialiseXSRegistryEntries(Fdo);
+    FdoInitialiseXSRegistryEntries(Fdo);
 
-	KeInitializeEvent(&Fdo->registryWriteEvent, NotificationEvent, FALSE);
+    KeInitializeEvent(&Fdo->registryWriteEvent, NotificationEvent, FALSE);
 
-	status = ThreadCreate(FdoRegistryThreadHandler, Fdo, &Fdo->registryThread);
-	if (!NT_SUCCESS(status))
-		goto fail11;
+    status = ThreadCreate(FdoRegistryThreadHandler, Fdo, &Fdo->registryThread);
+    if (!NT_SUCCESS(status))
+        goto fail11;
 
     Info("%p (%s)\n",
          FunctionDeviceObject,
@@ -2317,15 +2317,15 @@ FdoCreate(
 
     return STATUS_SUCCESS;
 
-	
+
 fail11:
-	Error("fail11\n");
+    Error("fail11\n");
 
     RtlZeroMemory(&Fdo->StoreInterface,
                   sizeof (XENBUS_STORE_INTERFACE));
 
 fail10:
-	Error("fail10\n");
+    Error("fail10\n");
 
     RtlZeroMemory(&Fdo->SharedInfoInterface,
                   sizeof (XENBUS_SHARED_INFO_INTERFACE));
@@ -2341,8 +2341,8 @@ fail8:
 
 fail7:
     Error("fail7\n");
-	RtlFreeUnicodeString(&Fdo->InterfaceName);
-	RtlZeroMemory(&Fdo->InterfaceName,sizeof(UNICODE_STRING));
+    RtlFreeUnicodeString(&Fdo->InterfaceName);
+    RtlZeroMemory(&Fdo->InterfaceName,sizeof(UNICODE_STRING));
 
 fail6:
     Error("fail6\n");
@@ -2353,14 +2353,14 @@ fail5:
     ThreadAlert(Fdo->DevicePowerThread);
     ThreadJoin(Fdo->DevicePowerThread);
     Fdo->DevicePowerThread = NULL;
-    
+
 fail4:
     Error("fail4\n");
 
     ThreadAlert(Fdo->SystemPowerThread);
     ThreadJoin(Fdo->SystemPowerThread);
     Fdo->SystemPowerThread = NULL;
-    
+
 fail3:
     Error("fail3\n");
 
@@ -2410,7 +2410,7 @@ FdoDestroy(
 
     RtlZeroMemory(&Fdo->Mutex, sizeof (XENIFACE_MUTEX));
 
-	Fdo->InterfacesAcquired = FALSE;
+    Fdo->InterfacesAcquired = FALSE;
 
     RtlZeroMemory(&Fdo->StoreInterface,
                   sizeof (XENBUS_STORE_INTERFACE));
@@ -2421,7 +2421,7 @@ FdoDestroy(
     RtlZeroMemory(&Fdo->SuspendInterface,
                   sizeof (XENBUS_SUSPEND_INTERFACE));
 
-	ThreadAlert(Fdo->registryThread);
+    ThreadAlert(Fdo->registryThread);
     ThreadJoin(Fdo->registryThread);
     Fdo->registryThread = NULL;
 
@@ -2440,12 +2440,12 @@ FdoDestroy(
     Fdo->PhysicalDeviceObject = NULL;
     Fdo->Dx = NULL;
 
-	RtlZeroMemory(&Fdo->SessionLock, sizeof(FAST_MUTEX));
-	RtlZeroMemory(&Fdo->SessionHead, sizeof(LIST_ENTRY));
-	RtlZeroMemory(&Fdo->registryWriteEvent, sizeof(KEVENT));
+    RtlZeroMemory(&Fdo->SessionLock, sizeof(FAST_MUTEX));
+    RtlZeroMemory(&Fdo->SessionHead, sizeof(LIST_ENTRY));
+    RtlZeroMemory(&Fdo->registryWriteEvent, sizeof(KEVENT));
 
-	RtlFreeUnicodeString(&Fdo->InterfaceName);
-	RtlZeroMemory(&Fdo->InterfaceName,sizeof(UNICODE_STRING));
+    RtlFreeUnicodeString(&Fdo->InterfaceName);
+    RtlZeroMemory(&Fdo->InterfaceName,sizeof(UNICODE_STRING));
 
     ASSERT(IsZeroMemory(Fdo, sizeof (XENIFACE_FDO)));
     __FdoFree(Fdo);
diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
index 4416064..c859338 100644
--- a/src/xeniface/fdo.h
+++ b/src/xeniface/fdo.h
@@ -78,13 +78,13 @@ typedef struct _XENIFACE_FDO {
 
     XENBUS_SUSPEND_INTERFACE        SuspendInterface;
 
-	XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
+    XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
 
     PXENBUS_SUSPEND_CALLBACK        SuspendCallbackLate;
 
-	BOOLEAN						    InterfacesAcquired;
+    BOOLEAN						    InterfacesAcquired;
 
-	#define MAX_SESSIONS    (65536)
+    #define MAX_SESSIONS    (65536)
 
     int							    WmiReady;
 
@@ -92,13 +92,13 @@ typedef struct _XENIFACE_FDO {
     FAST_MUTEX					    SessionLock;
     LIST_ENTRY					    SessionHead;
 
-	PXENIFACE_THREAD			    registryThread;
-	KEVENT						    registryWriteEvent;
+    PXENIFACE_THREAD			    registryThread;
+    KEVENT						    registryWriteEvent;
 
 
-	UNICODE_STRING				    SuggestedInstanceName;
+    UNICODE_STRING				    SuggestedInstanceName;
 
-	UNICODE_STRING				    InterfaceName;
+    UNICODE_STRING				    InterfaceName;
 
 } XENIFACE_FDO, *PXENIFACE_FDO;
 
diff --git a/src/xeniface/ioctls.c b/src/xeniface/ioctls.c
index 3bef9ea..ead7f9b 100644
--- a/src/xeniface/ioctls.c
+++ b/src/xeniface/ioctls.c
@@ -325,9 +325,9 @@ XenIFaceIoctl(
 
 done:
 
-	Irp->IoStatus.Status = status;
+    Irp->IoStatus.Status = status;
 
-	IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
     return status;
 }
diff --git a/src/xeniface/log.h b/src/xeniface/log.h
index 375a61f..5524f05 100644
--- a/src/xeniface/log.h
+++ b/src/xeniface/log.h
@@ -142,11 +142,11 @@ __Info(
 
 
 #define XenIfaceDebugPrint(LEVEL, ...) \
-	__XenIfaceDebugPrint(__MODULE__ "|" __FUNCTION__ ": ",LEVEL, __VA_ARGS__)
+    __XenIfaceDebugPrint(__MODULE__ "|" __FUNCTION__ ": ",LEVEL, __VA_ARGS__)
 
 static __inline VOID
 __XenIfaceDebugPrint    (
-	__in const CHAR *Prefix,
+    __in const CHAR *Prefix,
     __in ULONG   DebugPrintLevel,
     __in PCCHAR  DebugMessage,
     ...
diff --git a/src/xeniface/thread.c b/src/xeniface/thread.c
index 51967ed..f008834 100644
--- a/src/xeniface/thread.c
+++ b/src/xeniface/thread.c
@@ -129,7 +129,7 @@ ThreadCreate(
 
     (*Thread) = __ThreadAllocate(sizeof (XENIFACE_THREAD));
 
-	Warning("Create thread %p %p\n", Function, Thread);
+    Warning("Create thread %p %p\n", Function, Thread);
 
     status = STATUS_NO_MEMORY;
     if (*Thread == NULL)
diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
index 1bdb834..82592e3 100644
--- a/src/xeniface/wmi.c
+++ b/src/xeniface/wmi.c
@@ -1,31 +1,31 @@
 /* Copyright (c) Citrix Systems Inc.
  * All rights reserved.
  *
- * Redistribution and use in source and binary forms, 
- * with or without modification, are permitted provided 
+ * 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 
+ * *   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 
+ * *   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 
+ * 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.
  */
 
@@ -47,7 +47,7 @@
 #include <version.h>
 
 __drv_raisesIRQL(APC_LEVEL)
-__drv_savesIRQLGlobal(OldIrql, fdoData->SessionLock) 
+__drv_savesIRQLGlobal(OldIrql, fdoData->SessionLock)
 void LockSessions(
         XENIFACE_FDO* fdoData)
 {
@@ -93,7 +93,7 @@ NTSTATUS GetAnsiString(ANSI_STRING *ansi, USHORT maxlength, LPWSTR location) {
 
 // Rather inconveniently, xenstore needs UTF8 data, WMI works in UTF16
 // and windows doesn't provide conversion functions in any version
-// prior to Windows 7.  
+// prior to Windows 7.
 
 USHORT Utf32FromUtf16(ULONG *utf32, const WCHAR* utf16) {
     ULONG w;
@@ -132,22 +132,22 @@ USHORT Utf32FromUtf8(ULONG *utf32, const CHAR *utf8) {
     else if ((utf8[0] & 0xE0) == 0xC0) {
         y = utf8[0] & 0x1F;
         x = utf8[1] & 0x3F;
-        *utf32 = (y<<6) | x; 
+        *utf32 = (y<<6) | x;
         return 2;
     }
     else if ((utf8[0] & 0xF0) == 0xE0) {
         z = utf8[0] & 0x0F;
         y = utf8[1] & 0x3F;
         x = utf8[2] & 0x3F;
-       *utf32 = (z <<12) | (y<<6) | x; 
+       *utf32 = (z <<12) | (y<<6) | x;
        return 3;
-    } 
+    }
     else {
         ua = utf8[0] & 0x7;
         ub = (utf8[1] & 0x30) >> 4;
         u = (ua << 2) | ub;
         z = utf8[1] & 0x0f;
-        y = utf8[2] & 0x3f; 
+        y = utf8[2] & 0x3f;
         x = utf8[3] & 0x3f;
         *utf32 = (u<<16) | (z <<12) | (y <<6) | x;
         return 4;
@@ -277,7 +277,7 @@ NTSTATUS GetUTF8String(UTF8_STRING** utf8, USHORT bufsize, LPWSTR ustring)
 
     (*utf8)->Length = bytecount;
     (*utf8)->Buffer[bytecount]=0;
-    
+
     bytecount = 0;
     i=0;
     while (i < bufsize/sizeof(WCHAR)) {
@@ -305,7 +305,7 @@ void GetCountedUnicodeString(UNICODE_STRING *unicode, UCHAR *location)
     USHORT bufsize = *(USHORT*)location;
     LPWSTR ustring = (LPWSTR)(location+sizeof(USHORT));
     GetUnicodeString(unicode, bufsize, ustring);
-} 
+}
 
 NTSTATUS GetCountedAnsiString(ANSI_STRING *ansi, UCHAR *location)
 {
@@ -332,7 +332,7 @@ typedef enum {
     WMI_STRINGOFFSET
 } WMI_TYPE;
 
-int AccessWmiBuffer(PUCHAR Buffer, int readbuffer, ULONG * RequiredSize, 
+int AccessWmiBuffer(PUCHAR Buffer, int readbuffer, ULONG * RequiredSize,
                     size_t BufferSize, ...) {
     va_list vl;
     ULONG_PTR offset;
@@ -405,7 +405,7 @@ int AccessWmiBuffer(PUCHAR Buffer, int readbuffer, ULONG * RequiredSize,
                         UCHAR *bufferpos = Buffer + inpos;
                         ULONG insize = va_arg(vl, ULONG);
                         UCHAR **writebuf = va_arg(vl, UCHAR**);
-                        *writebuf = NULL; 
+                        *writebuf = NULL;
                         if (bufferpos+ insize > endbuffer) {;
                             overflow = TRUE;
                         }
@@ -460,12 +460,12 @@ int AccessWmiBuffer(PUCHAR Buffer, int readbuffer, ULONG * RequiredSize,
                         LPWSTR *val;
                         offset = (2-((ULONG_PTR)position%2))%2;
                         position += offset;
-                        if (position + sizeof(WCHAR)*25 > endbuffer) 
+                        if (position + sizeof(WCHAR)*25 > endbuffer)
                             overflow = TRUE;
-                        val = va_arg(vl, LPWSTR*); 
-                        *val = NULL; 
-                        if (!overflow) 
-                            *val = (LPWSTR )position; 
+                        val = va_arg(vl, LPWSTR*);
+                        *val = NULL;
+                        if (!overflow)
+                            *val = (LPWSTR )position;
                         position += sizeof(WCHAR)*25;
                     }
                     break;
@@ -477,7 +477,7 @@ int AccessWmiBuffer(PUCHAR Buffer, int readbuffer, ULONG * RequiredSize,
             break;
         }
     }
-    *RequiredSize = (ULONG)(position - Buffer); 
+    *RequiredSize = (ULONG)(position - Buffer);
     va_end(vl);
     if (overflow)
         return FALSE;
@@ -485,9 +485,9 @@ int AccessWmiBuffer(PUCHAR Buffer, int readbuffer, ULONG * RequiredSize,
 }
 
 
-NTSTATUS 
+NTSTATUS
 WriteCountedUnicodeString(
-    const UNICODE_STRING *ustr, 
+    const UNICODE_STRING *ustr,
     UCHAR *location
     )
 {
@@ -516,7 +516,7 @@ WriteCountedUTF8String(const char * string, UCHAR *location) {
     }
     buffer[bytesize/sizeof(WCHAR)] = 0;
 
-    i=0; 
+    i=0;
     b=0;
     while (string[i] != 0) {
         i += Utf32FromUtf8(&utf32, &string[i]);
@@ -533,7 +533,7 @@ NTSTATUS
 WriteCountedString(
     const char * string,
     UCHAR * location
-    ) 
+    )
 {
     ANSI_STRING ansi;
     UNICODE_STRING unicode;
@@ -542,7 +542,7 @@ WriteCountedString(
     RtlInitAnsiString(&ansi, string);
 
     status = RtlAnsiStringToUnicodeString(&unicode, &ansi, TRUE);
-    if (NT_SUCCESS(status)) { 
+    if (NT_SUCCESS(status)) {
 
         status = WriteCountedUnicodeString(&unicode, location);
         RtlFreeUnicodeString(&unicode);
@@ -583,7 +583,7 @@ CloneUnicodeString(UNICODE_STRING *dest, UNICODE_STRING *src) {
     return status;
 }
 
-NTSTATUS 
+NTSTATUS
 StringToUnicode(UNICODE_STRING *ustr, const char * str) {
     ANSI_STRING ansi;
     RtlInitAnsiString(&ansi, str);
@@ -632,7 +632,7 @@ GetInstanceName(UNICODE_STRING *dest, XENIFACE_FDO* FdoData, const char *string)
         return status;
     }
     destsz = FdoData->SuggestedInstanceName.Length +
-                sizeof(WCHAR) + 
+                sizeof(WCHAR) +
                 unicode.Length;
 
     AllocUnicodeStringBuffer(dest, (USHORT)destsz);
@@ -640,8 +640,8 @@ GetInstanceName(UNICODE_STRING *dest, XENIFACE_FDO* FdoData, const char *string)
         RtlFreeUnicodeString(&unicode);
         return STATUS_INSUFFICIENT_RESOURCES;
     }
-    status = RtlUnicodeStringPrintf(dest, L"%s\\%s", 
-                FdoData->SuggestedInstanceName.Buffer, 
+    status = RtlUnicodeStringPrintf(dest, L"%s\\%s",
+                FdoData->SuggestedInstanceName.Buffer,
                 unicode.Buffer);
     if (!NT_SUCCESS(status)) {
         RtlFreeUnicodeString(&unicode);
@@ -701,14 +701,14 @@ void UnicodeShallowCopy(UNICODE_STRING *dest, UNICODE_STRING *src) {
     dest->Buffer = src->Buffer;
     dest->Length = src->Length;
     dest->MaximumLength = src->MaximumLength;
-} 
+}
 
 
 XenStoreSession*
-FindSessionLocked(XENIFACE_FDO *fdoData, 
+FindSessionLocked(XENIFACE_FDO *fdoData,
                                 LONG id) {
     XenStoreSession *session;
-     
+
     session = (XenStoreSession *)fdoData->SessionHead.Flink;
     while (session != (XenStoreSession *)&fdoData->SessionHead){
         if (session->id == id) {
@@ -735,7 +735,7 @@ XenStoreWatch *
 SessionFindWatchLocked(XenStoreSession *session,
                         UNICODE_STRING *path) {
     XenStoreWatch * watch;
-    
+
     XenIfaceDebugPrint(TRACE,"Wait for session watch lock\n");
     ExAcquireFastMutex(&session->WatchMapLock);
     XenIfaceDebugPrint(TRACE,"got session watch lock\n");
@@ -751,11 +751,11 @@ SessionFindWatchLocked(XenStoreSession *session,
     XenIfaceDebugPrint(WARNING,"couldn't find watch\n");
     return NULL;
 
-} 
+}
 
 void FireSuspendEvent(PXENIFACE_FDO fdoData) {
-	XenIfaceDebugPrint(ERROR,"Ready to unsuspend Event\n");
-	KeSetEvent(&fdoData->registryWriteEvent, IO_NO_INCREMENT, FALSE);
+    XenIfaceDebugPrint(ERROR,"Ready to unsuspend Event\n");
+    KeSetEvent(&fdoData->registryWriteEvent, IO_NO_INCREMENT, FALSE);
     if (fdoData->WmiReady) {
         XenIfaceDebugPrint(TRACE,"Fire Suspend Event\n");
         WmiFireEvent(fdoData->Dx->DeviceObject,
@@ -764,7 +764,7 @@ void FireSuspendEvent(PXENIFACE_FDO fdoData) {
                      0,
                      NULL);
     }
-} 
+}
 void FireWatch(XenStoreWatch* watch) {
     UCHAR * eventdata;
     ULONG RequiredSize;
@@ -774,7 +774,7 @@ void FireWatch(XenStoreWatch* watch) {
             WMI_STRING, GetCountedUnicodeStringSize(&watch->path),
                 &sesbuf,
             WMI_DONE);
-    
+
     eventdata = ExAllocatePoolWithTag(NonPagedPool, RequiredSize,'XIEV');
     if (eventdata!=NULL) {
         AccessWmiBuffer(eventdata, FALSE, &RequiredSize, RequiredSize,
@@ -782,17 +782,17 @@ void FireWatch(XenStoreWatch* watch) {
                 &sesbuf,
             WMI_DONE);
 
-        WriteCountedUnicodeString(&watch->path, sesbuf); 
+        WriteCountedUnicodeString(&watch->path, sesbuf);
     }
 
     if (eventdata !=NULL) {
         XenIfaceDebugPrint(TRACE,"Fire Watch Event\n");
-        WmiFireEvent(watch->fdoData->Dx->DeviceObject, 
+        WmiFireEvent(watch->fdoData->Dx->DeviceObject,
                      (LPGUID)&OBJECT_GUID(XenStoreWatchEvent),
                      0,
-                     RequiredSize, 
+                     RequiredSize,
                      eventdata);
-    } 
+    }
 }
 
 
@@ -800,7 +800,7 @@ KSTART_ROUTINE WatchCallbackThread;
 NTSTATUS
 StartWatch(XENIFACE_FDO *fdoData, XenStoreWatch *watch)
 {
-    char *tmppath; 
+    char *tmppath;
     ANSI_STRING ansipath;
     NTSTATUS status;
     status = RtlUnicodeStringToAnsiString(&ansipath, &watch->path, TRUE);
@@ -814,7 +814,7 @@ StartWatch(XENIFACE_FDO *fdoData, XenStoreWatch *watch)
     }
     RtlZeroMemory(tmppath, ansipath.Length+1);
     RtlCopyBytes(tmppath,ansipath.Buffer, ansipath.Length);
-    
+
     status = XENBUS_STORE(WatchAdd, &fdoData->StoreInterface, NULL, tmppath, &watch->watchevent, &watch->watchhandle );
     if (!NT_SUCCESS(status)) {
         ExFreePool(tmppath);
@@ -848,7 +848,7 @@ VOID WatchCallbackThread(__in PVOID StartContext) {
                 watch = (XenStoreWatch *)watch->listentry.Flink;
             }
             session->mapchanged = FALSE;
-            session->watchevents[i] = &session->SessionChangedEvent; 
+            session->watchevents[i] = &session->SessionChangedEvent;
         }
         ExReleaseFastMutex(&session->WatchMapLock);
         XenIfaceDebugPrint(TRACE,"Wait for new event\n");
@@ -875,7 +875,7 @@ VOID WatchCallbackThread(__in PVOID StartContext) {
                     if (watch->suspendcount !=XENBUS_SUSPEND(GetCount, &watch->fdoData->SuspendInterface)) {
                         watch->suspendcount = XENBUS_SUSPEND(GetCount, &watch->fdoData->SuspendInterface);
                         XenIfaceDebugPrint(WARNING,"SessionSuspendResumeUnwatch %p\n", watch->watchhandle);
-                        
+
                         XENBUS_STORE(WatchRemove, &watch->fdoData->StoreInterface, watch->watchhandle);
                         StartWatch(watch->fdoData, watch);
                     }
@@ -886,13 +886,13 @@ VOID WatchCallbackThread(__in PVOID StartContext) {
         }
         else if ( status == STATUS_WAIT_0 + i) {
             ExAcquireFastMutex(&session->WatchMapLock);
-            KeClearEvent(&session->SessionChangedEvent); 
+            KeClearEvent(&session->SessionChangedEvent);
             if (session->closing==TRUE) {
                 XenIfaceDebugPrint(TRACE,"Trying to end session thread\n");
                 if (session->watchcount != 0) {
                     XenStoreWatch *watch;
-                    for (watch = (XenStoreWatch *)session->watches.Flink; 
-                        watch!=(XenStoreWatch *)&session->watches; 
+                    for (watch = (XenStoreWatch *)session->watches.Flink;
+                        watch!=(XenStoreWatch *)&session->watches;
                         watch=(XenStoreWatch *)session->watches.Flink) {
                             FreeUnicodeStringBuffer(&watch->path);
                             RemoveEntryList((LIST_ENTRY*)watch);
@@ -907,7 +907,7 @@ VOID WatchCallbackThread(__in PVOID StartContext) {
                 //ExReleaseFastMutex(&session->WatchMapLock);
             }
             else {
-                
+
                 ExReleaseFastMutex(&session->WatchMapLock);
             }
         }
@@ -916,12 +916,12 @@ VOID WatchCallbackThread(__in PVOID StartContext) {
 }
 
 NTSTATUS
-SessionAddWatchLocked(XenStoreSession *session, 
-                        XENIFACE_FDO* fdoData, 
+SessionAddWatchLocked(XenStoreSession *session,
+                        XENIFACE_FDO* fdoData,
                         UNICODE_STRING *path,
                         XenStoreWatch **watch) {
 
-    
+
     NTSTATUS status;
     XenStoreWatch *pwatch;
 
@@ -934,18 +934,18 @@ SessionAddWatchLocked(XenStoreSession *session,
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
-    (*watch)->finished = FALSE; 
+    (*watch)->finished = FALSE;
     (*watch)->fdoData = fdoData;
     UnicodeShallowCopy(&(*watch)->path, path);
 
 
-   
+
     (*watch)->suspendcount = XENBUS_SUSPEND(GetCount, &fdoData->SuspendInterface);
-    
+
 
     KeInitializeEvent(&(*watch)->watchevent, NotificationEvent, FALSE);
 
-    
+
     status = StartWatch(fdoData, *watch);
     if ((!NT_SUCCESS(status)) || ((*watch)->watchhandle == NULL)) {
         ExFreePool(*watch);
@@ -1001,8 +1001,8 @@ void SessionRemoveWatchesLocked(XenStoreSession *session) {
 
     XenIfaceDebugPrint(TRACE, "wait remove mutex\n");
     ExAcquireFastMutex(&session->WatchMapLock);
-    for (watch = (XenStoreWatch *)session->watches.Flink; 
-         watch!=(XenStoreWatch *)&session->watches; 
+    for (watch = (XenStoreWatch *)session->watches.Flink;
+         watch!=(XenStoreWatch *)&session->watches;
          watch=(XenStoreWatch *)watch->listentry.Flink) {
 
         XenIfaceDebugPrint(TRACE, "try remove %p\n",session->watches.Flink );
@@ -1017,7 +1017,7 @@ XenStoreSession*
 FindSessionByInstanceLocked(XENIFACE_FDO *fdoData,
                             UNICODE_STRING *instance) {
     XenStoreSession *session;
-     
+
     session = (XenStoreSession *)fdoData->SessionHead.Flink;
     while (session != (XenStoreSession *)&fdoData->SessionHead) {
         if (CompareUnicodeStrings(instance, &session->instancename)==0) {
@@ -1059,7 +1059,7 @@ PSTR Xmasprintf(const char *fmt, ...) {
         out =  ExAllocatePoolWithTag(NonPagedPool, basesize, 'XenP');
         if (out == NULL)
             return NULL;
-        
+
         status = RtlStringCbVPrintfExA(out, basesize, NULL, &unused,0, fmt, argv);
 
         ExFreePool(out);
@@ -1075,9 +1075,9 @@ PSTR Xmasprintf(const char *fmt, ...) {
     return out;
 }
 
-NTSTATUS 
-CreateNewSession(XENIFACE_FDO *fdoData, 
-                    UNICODE_STRING *stringid, 
+NTSTATUS
+CreateNewSession(XENIFACE_FDO *fdoData,
+                    UNICODE_STRING *stringid,
                     ULONG *sessionid) {
     XenStoreSession *session;
     PSTR iname;
@@ -1093,7 +1093,7 @@ CreateNewSession(XENIFACE_FDO *fdoData,
     if (session == NULL)
         return STATUS_INSUFFICIENT_RESOURCES;
     RtlZeroMemory(session, sizeof(XenStoreSession));
-    
+
     ExInitializeFastMutex(&session->WatchMapLock);
     session->mapchanged = TRUE;
     status = RtlUnicodeStringToAnsiString(&ansi, stringid, TRUE);
@@ -1109,7 +1109,7 @@ CreateNewSession(XENIFACE_FDO *fdoData,
         status = STATUS_NO_MEMORY;
         if (iname == NULL) {
             UnlockSessions(fdoData);
-            RtlFreeAnsiString(&ansi); 
+            RtlFreeAnsiString(&ansi);
             ExFreePool(session);
             return status;
         }
@@ -1118,18 +1118,18 @@ CreateNewSession(XENIFACE_FDO *fdoData,
         ExFreePool(iname);
         if (!NT_SUCCESS(status)) {
             UnlockSessions(fdoData);
-            RtlFreeAnsiString(&ansi); 
+            RtlFreeAnsiString(&ansi);
             ExFreePool(session);
             return status;
         }
         count++;
-        
+
     } while (FindSessionByInstanceLocked(fdoData, &session->instancename) != NULL);
 
-    
-    
-    
-    
+
+
+
+
     if (fdoData->SessionHead.Flink==&fdoData->SessionHead) {
         session->id=0;
     }
@@ -1142,12 +1142,12 @@ CreateNewSession(XENIFACE_FDO *fdoData,
     InsertHeadList((PLIST_ENTRY)&fdoData->SessionHead, (PLIST_ENTRY)session);
     *sessionid = session->id;
     UnicodeShallowCopy(&session->stringid, stringid);
-    
+
     InitializeListHead((PLIST_ENTRY)&session->watches);
-    
+
     KeInitializeEvent(&session->SessionChangedEvent, NotificationEvent, FALSE);
     session->closing = FALSE;
-    if (fdoData->InterfacesAcquired){ 
+    if (fdoData->InterfacesAcquired){
         XenIfaceDebugPrint(TRACE,"Add session unsuspended\n");
         session->suspended=FALSE;
     }
@@ -1161,7 +1161,7 @@ CreateNewSession(XENIFACE_FDO *fdoData,
 
     status = PsCreateSystemThread(&hthread, THREAD_ALL_ACCESS, &oa, NULL, NULL, WatchCallbackThread, session);
     if (!NT_SUCCESS(status)) {
-            RtlFreeAnsiString(&ansi); 
+            RtlFreeAnsiString(&ansi);
             ExFreePool(session);
             return status;
     }
@@ -1170,17 +1170,17 @@ CreateNewSession(XENIFACE_FDO *fdoData,
     return STATUS_SUCCESS;
 }
 
-void 
-RemoveSessionLocked(XENIFACE_FDO *fdoData, 
+void
+RemoveSessionLocked(XENIFACE_FDO *fdoData,
                     XenStoreSession *session) {
-     
+
     XenIfaceDebugPrint(TRACE,"RemoveSessionLocked\n");
     RemoveEntryList((LIST_ENTRY*)session);
     fdoData->Sessions--;
     SessionRemoveWatchesLocked(session);
     if (session->transaction != NULL) {
-        XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface, session->transaction, FALSE);  
-    }  
+        XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface, session->transaction, FALSE);
+    }
     session->closing = TRUE;
     KeSetEvent(&session->SessionChangedEvent, IO_NO_INCREMENT, FALSE);
     KeWaitForSingleObject(session->WatchThread, Executive, KernelMode, FALSE, NULL);
@@ -1191,7 +1191,7 @@ RemoveSessionLocked(XENIFACE_FDO *fdoData,
 }
 
 void
-RemoveSession(XENIFACE_FDO *fdoData, 
+RemoveSession(XENIFACE_FDO *fdoData,
                     XenStoreSession *session) {
     XenIfaceDebugPrint(TRACE,"RemoveSession\n");
     LockSessions(fdoData);
@@ -1200,15 +1200,15 @@ RemoveSession(XENIFACE_FDO *fdoData,
 }
 
 void SessionsRemoveAll(XENIFACE_FDO *fdoData) {
-	XenIfaceDebugPrint(TRACE,"lock");
+    XenIfaceDebugPrint(TRACE,"lock");
     LockSessions(fdoData);
-	XenIfaceDebugPrint(TRACE,"in lock");
+    XenIfaceDebugPrint(TRACE,"in lock");
     while (fdoData->SessionHead.Flink != &fdoData->SessionHead) {
         RemoveSessionLocked(fdoData, (XenStoreSession *)fdoData->SessionHead.Flink);
     }
-	XenIfaceDebugPrint(TRACE,"unlock");
+    XenIfaceDebugPrint(TRACE,"unlock");
     UnlockSessions(fdoData);
-	XenIfaceDebugPrint(TRACE,"unlocked");
+    XenIfaceDebugPrint(TRACE,"unlocked");
 }
 
 
@@ -1237,15 +1237,15 @@ void SessionUnwatchWatchesLocked(XenStoreSession *session)
     ExReleaseFastMutex(&session->WatchMapLock);
 }
 
-void SuspendSessionLocked(XENIFACE_FDO *fdoData, 
+void SuspendSessionLocked(XENIFACE_FDO *fdoData,
                          XenStoreSession *session) {
     SessionUnwatchWatchesLocked(session);
     if (session->transaction != NULL) {
         XenIfaceDebugPrint(TRACE, "End transaction %p\n",session->transaction);
-        
-        XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface, session->transaction, FALSE);  
+
+        XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface, session->transaction, FALSE);
         session->transaction = NULL;
-    }  
+    }
 }
 
 
@@ -1288,7 +1288,7 @@ void SessionRenewWatchesLocked(XenStoreSession *session) {
     ExReleaseFastMutex(&session->WatchMapLock);
 }
 
-void ResumeSessionLocked(XENIFACE_FDO *fdoData, 
+void ResumeSessionLocked(XENIFACE_FDO *fdoData,
                          XenStoreSession *session) {
     SessionRenewWatchesLocked(session);
 }
@@ -1310,40 +1310,40 @@ void SessionsResumeAll(XENIFACE_FDO *fdoData) {
 NTSTATUS
 WmiInit(
         PXENIFACE_FDO FdoData
-    ) 
+    )
 {
     NTSTATUS status = STATUS_SUCCESS;
     XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__);
     XenIfaceDebugPrint(INFO,"DRV: XenIface WMI Initialisation\n");
-   
-    
 
 
-	IoWMISuggestInstanceName(FdoData->PhysicalDeviceObject, NULL, FALSE, 
-                                &FdoData->SuggestedInstanceName);
+
+
+    IoWMISuggestInstanceName(FdoData->PhysicalDeviceObject, NULL, FALSE,
+                             &FdoData->SuggestedInstanceName);
     InitializeListHead(&FdoData->SessionHead);
     FdoData->Sessions = 0;
     ExInitializeFastMutex(&FdoData->SessionLock);
-    
+
     status = IoWMIRegistrationControl(FdoData->Dx->DeviceObject, WMIREG_ACTION_REGISTER);
     FdoData->WmiReady = 1;
     return status;
 }
 
 NTSTATUS
-WmiFinalise(       
+WmiFinalise(
     PXENIFACE_FDO FdoData
-    ) 
+    )
 {
     NTSTATUS status = STATUS_SUCCESS;
-    if (FdoData->WmiReady) { 
+    if (FdoData->WmiReady) {
         XenIfaceDebugPrint(INFO,"DRV: XenIface WMI Finalisation\n");
         XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__);
         SessionsRemoveAll(FdoData);
 
         status =IoWMIRegistrationControl(FdoData->Dx->DeviceObject, WMIREG_ACTION_DEREGISTER);
-		RtlFreeUnicodeString(&FdoData->SuggestedInstanceName);
-		RtlZeroBytes(&FdoData->SuggestedInstanceName, sizeof(UNICODE_STRING));
+        RtlFreeUnicodeString(&FdoData->SuggestedInstanceName);
+        RtlZeroBytes(&FdoData->SuggestedInstanceName, sizeof(UNICODE_STRING));
 
         FdoData->WmiReady = 0;
     }
@@ -1468,7 +1468,7 @@ SessionExecuteRemoveValue(UCHAR *InBuffer,
     }
 
     status = GetCountedUTF8String(&pathname, upathname);
-    if (!NT_SUCCESS(status)) 
+    if (!NT_SUCCESS(status))
         return status;
 
     status = STATUS_INSUFFICIENT_RESOURCES;
@@ -1478,7 +1478,7 @@ SessionExecuteRemoveValue(UCHAR *InBuffer,
     }
     RtlZeroMemory(tmpbuffer, pathname->Length+1);
     RtlCopyBytes(tmpbuffer,pathname->Buffer, pathname->Length);
-    
+
     status = STATUS_WMI_INSTANCE_NOT_FOUND;
     if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
             NULL){
@@ -1524,7 +1524,7 @@ SessionExecuteRemoveWatch(UCHAR *InBuffer,
     }
 
 
-    XenIfaceDebugPrint(TRACE, "Find Watch\n"); 
+    XenIfaceDebugPrint(TRACE, "Find Watch\n");
 
     watch = SessionFindWatchLocked(session, &unicpath_notbacked);
 
@@ -1533,7 +1533,7 @@ SessionExecuteRemoveWatch(UCHAR *InBuffer,
         SessionRemoveWatchLocked(session, watch);
     }
     else {
-        XenIfaceDebugPrint(WARNING, "No Watch\n"); 
+        XenIfaceDebugPrint(WARNING, "No Watch\n");
     }
 #pragma prefast (suppress:26110)
     ExReleaseFastMutex(&session->WatchMapLock);
@@ -1541,7 +1541,7 @@ SessionExecuteRemoveWatch(UCHAR *InBuffer,
 
     *byteswritten=0;
 
- 
+
 
     return STATUS_SUCCESS;
 
@@ -1586,11 +1586,11 @@ SessionExecuteSetWatch(UCHAR *InBuffer,
         FreeUnicodeStringBuffer(&unicpath_backed);
         return status;
     }
-    
+
 
     *byteswritten=0;
 
- 
+
 
     return STATUS_SUCCESS;
 
@@ -1604,7 +1604,7 @@ SessionExecuteEndSession(UCHAR *InBuffer,
                             UNICODE_STRING *instance,
                             OUT ULONG_PTR *byteswritten) {
     XenStoreSession *session;
-    XenIfaceDebugPrint(TRACE, "ExecuteEndSession\n"); 
+    XenIfaceDebugPrint(TRACE, "ExecuteEndSession\n");
     *byteswritten = 0;
     if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
             NULL){
@@ -1633,7 +1633,7 @@ SessionExecuteSetValue(UCHAR *InBuffer,
     char *tmppath;
     char* tmpvalue;
 
-    XenIfaceDebugPrint(TRACE, " Try to write\n"); 
+    XenIfaceDebugPrint(TRACE, " Try to write\n");
     if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
                             WMI_STRING, &upathname,
                             WMI_STRING, &uvalue,
@@ -1643,10 +1643,10 @@ SessionExecuteSetValue(UCHAR *InBuffer,
         return STATUS_INSUFFICIENT_RESOURCES;
     }
     status = GetCountedUTF8String(&pathname, upathname);
-    if (!NT_SUCCESS(status)) 
+    if (!NT_SUCCESS(status))
         return status;
 
-	status = STATUS_INSUFFICIENT_RESOURCES;
+    status = STATUS_INSUFFICIENT_RESOURCES;
     tmppath = ExAllocatePoolWithTag(NonPagedPool, pathname->Length+1, 'XenP');
     if (!tmppath) {
         goto fail1;
@@ -1654,7 +1654,7 @@ SessionExecuteSetValue(UCHAR *InBuffer,
     RtlZeroMemory(tmppath, pathname->Length+1);
     RtlCopyBytes(tmppath,pathname->Buffer, pathname->Length);
     status = GetCountedUTF8String(&value, uvalue);
-    if (!NT_SUCCESS(status)){ 
+    if (!NT_SUCCESS(status)){
         goto fail2;
     }
     status = STATUS_INSUFFICIENT_RESOURCES;
@@ -1664,14 +1664,14 @@ SessionExecuteSetValue(UCHAR *InBuffer,
     }
     RtlZeroMemory(tmpvalue, value->Length+1);
     RtlCopyBytes(tmpvalue,value->Buffer, value->Length);
-	
+
     status = STATUS_WMI_INSTANCE_NOT_FOUND;
     if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
             NULL){
         goto fail4;
     }
     status = XENBUS_STORE(Printf, &fdoData->StoreInterface, session->transaction, NULL, tmppath, tmpvalue);
-    XenIfaceDebugPrint(TRACE, " Write %s to %s (%p)\n", tmpvalue, tmppath, status); 
+    XenIfaceDebugPrint(TRACE, " Write %s to %s (%p)\n", tmpvalue, tmppath, status);
     UnlockSessions(fdoData);
 
 fail4:
@@ -1685,10 +1685,10 @@ fail2:
 
 fail1:
     FreeUTF8String(pathname);
-  
+
     *byteswritten = 0;
     return status;
-    
+
 }
 NTSTATUS
 SessionExecuteGetFirstChild(UCHAR *InBuffer,
@@ -1708,16 +1708,16 @@ SessionExecuteGetFirstChild(UCHAR *InBuffer,
     XenStoreSession *session;
     char *tmppath;
     if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
-                            WMI_STRING, &uloc, 
+                            WMI_STRING, &uloc,
                             WMI_DONE)){
         return  STATUS_INVALID_DEVICE_REQUEST;
     }
     if (!fdoData->InterfacesAcquired) {
         return STATUS_INSUFFICIENT_RESOURCES;
     }
-        
+
     status = GetCountedUTF8String(&path, uloc);
-                
+
     if (!NT_SUCCESS(status)) {
         return status;
     }
@@ -1737,7 +1737,7 @@ SessionExecuteGetFirstChild(UCHAR *InBuffer,
     }
     status = XENBUS_STORE(Directory,&fdoData->StoreInterface, session->transaction, NULL, tmppath, &listresults);
     UnlockSessions(fdoData);
-                        
+
     if (!NT_SUCCESS(status)) {
         goto fail2;
     }
@@ -1755,14 +1755,14 @@ SessionExecuteGetFirstChild(UCHAR *InBuffer,
     else {
         stringarraysize+=GetCountedUtf8Size("");
     }
-    
+
     status = STATUS_BUFFER_TOO_SMALL;
     if (!AccessWmiBuffer(InBuffer, FALSE, &RequiredSize, OutBufferSize,
                             WMI_STRING, stringarraysize, &valuepos,
                             WMI_DONE)){
         goto fail3;
     }
-    
+
     status = STATUS_SUCCESS;
     if ((listresults != NULL) && (listresults[0] != 0)) {
         PSTR fullpath;
@@ -1770,8 +1770,8 @@ SessionExecuteGetFirstChild(UCHAR *InBuffer,
             fullpath = Xmasprintf("/%s", listresults);
         }
         else {
-            fullpath = Xmasprintf("%s/%s", 
-                                    path->Buffer, listresults); 
+            fullpath = Xmasprintf("%s/%s",
+                                    path->Buffer, listresults);
         }
 
         if (fullpath == NULL) {
@@ -1826,16 +1826,16 @@ SessionExecuteGetNextSibling(UCHAR *InBuffer,
     int leafoffset;
     char *attemptstring;
     if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
-                            WMI_STRING, &uloc, 
+                            WMI_STRING, &uloc,
                             WMI_DONE)){
         return  STATUS_INVALID_DEVICE_REQUEST;
     }
     if (!fdoData->InterfacesAcquired) {
         return STATUS_INSUFFICIENT_RESOURCES;
     }
-        
+
     status = GetCountedUTF8String(&path, uloc);
-                
+
     if (!NT_SUCCESS(status)) {
         return status;
     }
@@ -1858,7 +1858,7 @@ SessionExecuteGetNextSibling(UCHAR *InBuffer,
             NULL){
         goto fail3;
     }
-    
+
     leafoffset = 0;
     if (path->Length>1) {
         leafoffset = path->Length;
@@ -1884,14 +1884,14 @@ SessionExecuteGetNextSibling(UCHAR *InBuffer,
 
     status = XENBUS_STORE(Directory,&fdoData->StoreInterface, session->transaction, NULL, tmppath, &listresults);
     UnlockSessions(fdoData);
-                        
+
     if (!NT_SUCCESS(status)) {
         goto fail3;
     }
 
     stringarraysize = 0;
     RtlInitAnsiString(&checkleaf, tmpleaf);
-    
+
     nextresult = listresults;
 
     while (*nextresult != 0) {
@@ -1928,14 +1928,14 @@ SessionExecuteGetNextSibling(UCHAR *InBuffer,
     else {
         stringarraysize+=GetCountedUtf8Size("");
     }
-    
+
     status = STATUS_BUFFER_TOO_SMALL;
     if (!AccessWmiBuffer(InBuffer, FALSE, &RequiredSize, OutBufferSize,
                             WMI_STRING, stringarraysize, &valuepos,
                             WMI_DONE)){
         goto fail4;
     }
-    
+
     status = STATUS_SUCCESS;
     if (attemptstring != NULL) {
         PSTR fullpath;
@@ -1943,8 +1943,8 @@ SessionExecuteGetNextSibling(UCHAR *InBuffer,
             fullpath = Xmasprintf("/%s", attemptstring);
         }
         else {
-            fullpath = Xmasprintf("%s/%s", 
-                                    tmppath, attemptstring); 
+            fullpath = Xmasprintf("%s/%s",
+                                    tmppath, attemptstring);
         }
 
         if (fullpath == NULL) {
@@ -1969,7 +1969,7 @@ fail3:
     ExFreePool(tmpleaf);
 
 fail2:
-	ExFreePool(tmppath);
+    ExFreePool(tmppath);
 
 fail1:
     FreeUTF8String(path);
@@ -1999,16 +1999,16 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
     XenStoreSession *session;
     char *tmppath;
     if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
-                            WMI_STRING, &uloc, 
+                            WMI_STRING, &uloc,
                             WMI_DONE)){
         return  STATUS_INVALID_DEVICE_REQUEST;
     }
     if (!fdoData->InterfacesAcquired) {
         return STATUS_INSUFFICIENT_RESOURCES;
     }
-        
+
     status = GetCountedUTF8String(&path, uloc);
-                
+
     if (!NT_SUCCESS(status)) {
         return status;
     }
@@ -2028,7 +2028,7 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
     }
     status = XENBUS_STORE(Directory,&fdoData->StoreInterface,session->transaction,NULL, tmppath, &listresults);
     UnlockSessions(fdoData);
-                        
+
     if (!NT_SUCCESS(status)) {
         goto fail2;
     }
@@ -2046,8 +2046,8 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
         stringarraysize+=GetCountedUtf8Size(nextresults);
         for (;*nextresults!=0;nextresults++);
         nextresults++;
-    } 
-                
+    }
+
     status = STATUS_BUFFER_TOO_SMALL;
     if (!AccessWmiBuffer(InBuffer, FALSE, &RequiredSize, OutBufferSize,
                             WMI_UINT32, &noofnodes,
@@ -2065,8 +2065,8 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
             fullpath = Xmasprintf("/%s", nextresults);
         }
         else {
-            fullpath = Xmasprintf("%s/%s", 
-                                    path->Buffer, nextresults); 
+            fullpath = Xmasprintf("%s/%s",
+                                    path->Buffer, nextresults);
         }
 
         if (fullpath == NULL) {
@@ -2113,13 +2113,13 @@ SessionExecuteLog(UCHAR *InBuffer,
     NTSTATUS status;
     ANSI_STRING message;
     if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
-                                            WMI_STRING, &uloc, 
+                                            WMI_STRING, &uloc,
                                             WMI_DONE))
         return STATUS_INVALID_DEVICE_REQUEST;
 
     status = GetCountedAnsiString(&message, uloc);
 
-    if (!NT_SUCCESS(status)) 
+    if (!NT_SUCCESS(status))
         return status;
 
     XenIfaceDebugPrint(INFO,"USER: %s\n", message.Buffer);
@@ -2141,7 +2141,7 @@ SessionExecuteStartTransaction(UCHAR *InBuffer,
 
     NTSTATUS status = STATUS_SUCCESS;
     XenStoreSession *session;
-    
+
     if (!fdoData->InterfacesAcquired) {
         status= STATUS_INSUFFICIENT_RESOURCES;
         goto failnotinitialised;
@@ -2158,7 +2158,7 @@ SessionExecuteStartTransaction(UCHAR *InBuffer,
     }
 
     XENBUS_STORE(TransactionStart, &fdoData->StoreInterface, &session->transaction);
-    
+
 
 failtransactionactive:
     UnlockSessions(fdoData);
@@ -2180,7 +2180,7 @@ SessionExecuteCommitTransaction(UCHAR *InBuffer,
 
     NTSTATUS status = STATUS_SUCCESS;
     XenStoreSession *session;
-    
+
     if (!fdoData->InterfacesAcquired) {
         status= STATUS_INSUFFICIENT_RESOURCES;
         goto failnotinitialised;
@@ -2197,7 +2197,7 @@ SessionExecuteCommitTransaction(UCHAR *InBuffer,
     }
 
     status = XENBUS_STORE(TransactionEnd,&fdoData->StoreInterface, session->transaction, TRUE);
-    
+
     session->transaction = NULL;
 
 failtransactionnotactive:
@@ -2220,7 +2220,7 @@ SessionExecuteAbortTransaction(UCHAR *InBuffer,
 
     NTSTATUS status = STATUS_SUCCESS;
     XenStoreSession *session;
-    
+
     if (!fdoData->InterfacesAcquired) {
         status= STATUS_INSUFFICIENT_RESOURCES;
         goto failnotinitialised;
@@ -2237,7 +2237,7 @@ SessionExecuteAbortTransaction(UCHAR *InBuffer,
     }
 
     status = XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface, session->transaction, FALSE);
-    
+
     session->transaction = NULL;
 
 failtransactionnotactive:
@@ -2269,18 +2269,18 @@ SessionExecuteGetValue(UCHAR *InBuffer,
 
     *byteswritten = 0;
     if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
-                                            WMI_STRING, &uloc, 
+                                            WMI_STRING, &uloc,
                                             WMI_DONE))
         return STATUS_INVALID_DEVICE_REQUEST;
     if (!fdoData->InterfacesAcquired) {
         return STATUS_INSUFFICIENT_RESOURCES;
     }
-        
+
     status = GetCountedUTF8String(&path, uloc);
-                
-    if (!NT_SUCCESS(status)) 
+
+    if (!NT_SUCCESS(status))
         return status;;
-    
+
     status = STATUS_INSUFFICIENT_RESOURCES;
     tmppath = ExAllocatePoolWithTag(NonPagedPool,path->Length+1,'XenP');
     if (!tmppath) {
@@ -2288,7 +2288,7 @@ SessionExecuteGetValue(UCHAR *InBuffer,
     }
     RtlZeroMemory(tmppath, path->Length+1);
     RtlCopyBytes(tmppath,path->Buffer, path->Length);
-    
+
 
     status = STATUS_WMI_INSTANCE_NOT_FOUND;
     if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
@@ -2297,10 +2297,10 @@ SessionExecuteGetValue(UCHAR *InBuffer,
     }
     status = XENBUS_STORE(Read, &fdoData->StoreInterface, session->transaction, NULL, tmppath, &value);
     UnlockSessions(fdoData);
-                
-    if (!NT_SUCCESS(status)) 
+
+    if (!NT_SUCCESS(status))
         goto fail2;
-   
+
     status = STATUS_BUFFER_TOO_SMALL;
     if (!AccessWmiBuffer(OutBuffer, FALSE, &RequiredSize, OutBufferSize,
                             WMI_STRING, GetCountedUtf8Size(value), &valuepos,
@@ -2335,7 +2335,7 @@ BaseExecuteAddSession(UCHAR *InBuffer,
     NTSTATUS status;
     *byteswritten = 0;
     if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
-                            WMI_STRING, &stringid, 
+                            WMI_STRING, &stringid,
                             WMI_DONE)){
         return STATUS_INVALID_DEVICE_REQUEST;
     }
@@ -2345,12 +2345,12 @@ BaseExecuteAddSession(UCHAR *InBuffer,
         *byteswritten = RequiredSize;
         return STATUS_BUFFER_TOO_SMALL;
     }
-    
+
     AllocUnicodeStringBuffer(&ustring, *(USHORT*)(stringid));
     if (ustring.Buffer == NULL)
         return STATUS_INSUFFICIENT_RESOURCES;
     status = RtlUnicodeStringCbCopyStringN(&ustring,
-                                            (LPCWSTR)(stringid+sizeof(USHORT)), 
+                                            (LPCWSTR)(stringid+sizeof(USHORT)),
                                             *(USHORT*)(stringid));
     if (!NT_SUCCESS(status)) {
         FreeUnicodeStringBuffer(&ustring);
@@ -2368,7 +2368,7 @@ BaseExecuteAddSession(UCHAR *InBuffer,
 }
 
 
-NTSTATUS 
+NTSTATUS
 SessionExecuteMethod(UCHAR *Buffer,
                     ULONG BufferSize,
                     XENIFACE_FDO* fdoData,
@@ -2397,115 +2397,115 @@ SessionExecuteMethod(UCHAR *Buffer,
         return STATUS_INVALID_DEVICE_REQUEST;
     }
 
-    InBuffer = Buffer + Method->DataBlockOffset; 
+    InBuffer = Buffer + Method->DataBlockOffset;
 
     GetCountedUnicodeString(&instance, InstStr);
 
-    
+
     XenIfaceDebugPrint(TRACE,"Method Id %d\n", Method->MethodId);
     switch (Method->MethodId) {
-        case GetValue: 
-            status = SessionExecuteGetValue(InBuffer, Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+        case GetValue:
+            status = SessionExecuteGetValue(InBuffer, Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
-        case SetValue: 
-            status = SessionExecuteSetValue(InBuffer, Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+        case SetValue:
+            status = SessionExecuteSetValue(InBuffer, Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
-        case GetChildren: 
-            status = SessionExecuteGetChildren(InBuffer, Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+        case GetChildren:
+            status = SessionExecuteGetChildren(InBuffer, Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
-        case SetWatch: 
-            status = SessionExecuteSetWatch(InBuffer, Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+        case SetWatch:
+            status = SessionExecuteSetWatch(InBuffer, Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
         case EndSession:
-            status = SessionExecuteEndSession(InBuffer, Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+            status = SessionExecuteEndSession(InBuffer, Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
-        case RemoveWatch: 
-            status = SessionExecuteRemoveWatch(InBuffer, Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+        case RemoveWatch:
+            status = SessionExecuteRemoveWatch(InBuffer, Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
-        case RemoveValue: 
-            status = SessionExecuteRemoveValue(InBuffer, Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+        case RemoveValue:
+            status = SessionExecuteRemoveValue(InBuffer, Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
         case Log:
-            status = SessionExecuteLog(InBuffer,  Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+            status = SessionExecuteLog(InBuffer,  Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
-        case StartTransaction: 
-            status = SessionExecuteStartTransaction(InBuffer,  Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+        case StartTransaction:
+            status = SessionExecuteStartTransaction(InBuffer,  Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
         case CommitTransaction:
-            status = SessionExecuteCommitTransaction(InBuffer,  Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+            status = SessionExecuteCommitTransaction(InBuffer,  Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
         case AbortTransaction:
-            status = SessionExecuteAbortTransaction(InBuffer,  Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+            status = SessionExecuteAbortTransaction(InBuffer,  Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
         case GetFirstChild:
-            status = SessionExecuteGetFirstChild(InBuffer,  Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+            status = SessionExecuteGetFirstChild(InBuffer,  Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
         case GetNextSibling:
-            status = SessionExecuteGetNextSibling(InBuffer,  Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+            status = SessionExecuteGetNextSibling(InBuffer,  Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
 
@@ -2519,11 +2519,11 @@ SessionExecuteMethod(UCHAR *Buffer,
     if (status == STATUS_BUFFER_TOO_SMALL) {
         return NodeTooSmall(Buffer, BufferSize, (ULONG)*byteswritten, byteswritten);
     }
-            
+
     Method->WnodeHeader.BufferSize = (ULONG)*byteswritten;
      return status;
 }
-NTSTATUS 
+NTSTATUS
 BaseExecuteMethod(UCHAR *Buffer,
                     ULONG BufferSize,
                     XENIFACE_FDO* fdoData,
@@ -2540,14 +2540,14 @@ BaseExecuteMethod(UCHAR *Buffer,
         return STATUS_INVALID_DEVICE_REQUEST;
     }
 
-    InBuffer = Buffer + Method->DataBlockOffset; 
+    InBuffer = Buffer + Method->DataBlockOffset;
 
     switch (Method->MethodId) {
-        case AddSession: 
-            status = BaseExecuteAddSession(InBuffer, Method->SizeDataBlock,  
-                                             Buffer+Method->DataBlockOffset, 
-                                             BufferSize-Method->DataBlockOffset, 
-                                             fdoData, 
+        case AddSession:
+            status = BaseExecuteAddSession(InBuffer, Method->SizeDataBlock,
+                                             Buffer+Method->DataBlockOffset,
+                                             BufferSize-Method->DataBlockOffset,
+                                             fdoData,
                                              byteswritten);
             Method->SizeDataBlock = (ULONG)*byteswritten;
             *byteswritten+=Method->DataBlockOffset;
@@ -2569,16 +2569,16 @@ WmiExecuteMethod(
     if (IsEqualGUID(stack->Parameters.WMI.DataPath,
                     &OBJECT_GUID(XenStoreBase))) {
         return BaseExecuteMethod(stack->Parameters.WMI.Buffer,
-                                    stack->Parameters.WMI.BufferSize,  
+                                    stack->Parameters.WMI.BufferSize,
                                     fdoData,  byteswritten);
     }
     else if (IsEqualGUID(stack->Parameters.WMI.DataPath,
                          &OBJECT_GUID(XenStoreSession))) {
         return SessionExecuteMethod(stack->Parameters.WMI.Buffer,
-                                    stack->Parameters.WMI.BufferSize,  
+                                    stack->Parameters.WMI.BufferSize,
                                     fdoData,  byteswritten);
     }
-    
+
     else
         return STATUS_NOT_SUPPORTED;
 }
@@ -2598,7 +2598,7 @@ GenerateSessionBlock(UCHAR *Buffer,
     ULONG* nameoffsets;
     UCHAR *data;
     UCHAR *names;
-    
+
 
     LockSessions(fdoData);
 
@@ -2615,14 +2615,14 @@ GenerateSessionBlock(UCHAR *Buffer,
 
         AccessWmiBuffer((PUCHAR)nodesizerequired, FALSE, &RequiredSize, 0,
                         WMI_UINT32, &id,
-                        WMI_STRING, 
-                            GetCountedUnicodeStringSize(&session->stringid), 
+                        WMI_STRING,
+                            GetCountedUnicodeStringSize(&session->stringid),
                             &sesbuf,
                         WMI_DONE);
         nodesizerequired += RequiredSize;
-        
+
         AccessWmiBuffer((PUCHAR)namesizerequired, FALSE, &RequiredSize, 0,
-                        WMI_STRING, 
+                        WMI_STRING,
                             GetCountedUnicodeStringSize(&session->instancename),
                             &inamebuf,
                         WMI_DONE);
@@ -2630,7 +2630,7 @@ GenerateSessionBlock(UCHAR *Buffer,
         entries++;
         session = (XenStoreSession *)session->listentry.Flink;
     }
-    
+
     //perform the access check
     if (!AccessWmiBuffer(Buffer, FALSE, &RequiredSize, BufferSize,
                             WMI_BUFFER, sizeof(WNODE_ALL_DATA), &node,
@@ -2665,21 +2665,21 @@ GenerateSessionBlock(UCHAR *Buffer,
 
             AccessWmiBuffer(datapos, FALSE, &RequiredSize, BufferSize+Buffer-datapos,
                             WMI_UINT32, &id,
-                            WMI_STRING, 
-                                GetCountedUnicodeStringSize(&session->stringid), 
+                            WMI_STRING,
+                                GetCountedUnicodeStringSize(&session->stringid),
                                 &sesbuf,
                             WMI_DONE);
 
-            node->OffsetInstanceDataAndLength[entrynum].OffsetInstanceData = 
+            node->OffsetInstanceDataAndLength[entrynum].OffsetInstanceData =
                 (ULONG)((UCHAR *)id - Buffer);
-            node->OffsetInstanceDataAndLength[entrynum].LengthInstanceData = 
+            node->OffsetInstanceDataAndLength[entrynum].LengthInstanceData =
                 RequiredSize;
             *id = session->id;
             WriteCountedUnicodeString(&session->stringid, sesbuf);
             datapos+=RequiredSize;
 
             AccessWmiBuffer(namepos, FALSE, &RequiredSize, BufferSize+Buffer-namepos,
-                            WMI_STRING, 
+                            WMI_STRING,
                                 GetCountedUnicodeStringSize(&session->instancename),
                                 &inamebuf,
                             WMI_DONE);
@@ -2773,8 +2773,8 @@ GenerateBaseInstance(
     else {
         *time = 0;
     }
-   
-    
+
+
     node->WnodeHeader.BufferSize = node->DataBlockOffset+RequiredSize;
     node->SizeDataBlock = RequiredSize;
 
@@ -2796,7 +2796,7 @@ GenerateSessionInstance(UCHAR *Buffer,
     ULONG* id;
     XenStoreSession *session;
     UCHAR *sesbuf;
-    
+
     if (!AccessWmiBuffer(Buffer, TRUE, &RequiredSize, BufferSize,
                             WMI_BUFFER, sizeof(WNODE_SINGLE_INSTANCE), &node,
                             WMI_DONE))
@@ -2805,7 +2805,7 @@ GenerateSessionInstance(UCHAR *Buffer,
     }
     if (!AccessWmiBuffer(Buffer, TRUE, &RequiredSize, BufferSize,
                             WMI_BUFFER, sizeof(WNODE_SINGLE_INSTANCE), &node,
-                            WMI_STRINGOFFSET, node->OffsetInstanceName, &InstStr, 
+                            WMI_STRINGOFFSET, node->OffsetInstanceName, &InstStr,
                             WMI_OFFSET, node->DataBlockOffset, 0, &dbo,
                             WMI_DONE))
     {
@@ -2818,10 +2818,10 @@ GenerateSessionInstance(UCHAR *Buffer,
         UnlockSessions(fdoData);
         return STATUS_WMI_INSTANCE_NOT_FOUND;
     }
-    
+
     if (!AccessWmiBuffer(dbo, FALSE, &RequiredSize, BufferSize-node->DataBlockOffset,
                             WMI_UINT32, &id,
-                            WMI_STRING, 
+                            WMI_STRING,
                                 GetCountedUnicodeStringSize(&session->stringid),
                                 &sesbuf,
                             WMI_DONE)) {
@@ -2837,7 +2837,7 @@ GenerateSessionInstance(UCHAR *Buffer,
     node->WnodeHeader.BufferSize = node->DataBlockOffset + RequiredSize;
     *byteswritten = node->DataBlockOffset + RequiredSize;
 
-    
+
 
 
     return STATUS_SUCCESS;
@@ -2851,17 +2851,17 @@ WmiQueryAllData(
     OUT ULONG_PTR *byteswritten
    )
 {
-  
-    if (IsEqualGUID(stack->Parameters.WMI.DataPath, 
+
+    if (IsEqualGUID(stack->Parameters.WMI.DataPath,
                     &OBJECT_GUID(XenStoreBase))) {
         return GenerateBaseBlock(   fdoData,
-                                    stack->Parameters.WMI.Buffer, 
+                                    stack->Parameters.WMI.Buffer,
                                     stack->Parameters.WMI.BufferSize,
                                     byteswritten);
     }
-    else if (IsEqualGUID(stack->Parameters.WMI.DataPath, 
+    else if (IsEqualGUID(stack->Parameters.WMI.DataPath,
                          &OBJECT_GUID(XenStoreSession))) {
-        return GenerateSessionBlock(stack->Parameters.WMI.Buffer, 
+        return GenerateSessionBlock(stack->Parameters.WMI.Buffer,
                                     stack->Parameters.WMI.BufferSize,
                                     fdoData,
                                     byteswritten);
@@ -2882,13 +2882,13 @@ WmiQuerySingleInstance(
     if (IsEqualGUID(stack->Parameters.WMI.DataPath,
                     &OBJECT_GUID(XenStoreBase))) {
         return GenerateBaseInstance(fdoData,
-                                    stack->Parameters.WMI.Buffer, 
+                                    stack->Parameters.WMI.Buffer,
                                     stack->Parameters.WMI.BufferSize,
                                     byteswritten);
     }
     else if (IsEqualGUID(stack->Parameters.WMI.DataPath,
                          &OBJECT_GUID(XenStoreSession))) {
-        return GenerateSessionInstance(stack->Parameters.WMI.Buffer, 
+        return GenerateSessionInstance(stack->Parameters.WMI.Buffer,
                                     stack->Parameters.WMI.BufferSize,
                                     fdoData,
                                     byteswritten);
@@ -2913,7 +2913,7 @@ WmiRegInfo(
     ULONG RequiredSize;
     int entries = 4;
     const static UNICODE_STRING mofname = RTL_CONSTANT_STRING(L"XENIFACEMOF");
-    
+
     size_t mofnamesz;
 
 
@@ -2927,12 +2927,12 @@ WmiRegInfo(
         mofnamesz = 0;
     }
     if(!AccessWmiBuffer(stack->Parameters.WMI.Buffer, FALSE,
-                        &RequiredSize, 
+                        &RequiredSize,
                         stack->Parameters.WMI.BufferSize,
                         WMI_BUFFER, sizeof(WMIREGINFO), (UCHAR **)&reginfo,
                         WMI_BUFFER, entries * sizeof(WMIREGGUID), (UCHAR **)&guiddata,
                         WMI_STRING, mofnamesz, &mofnameptr,
-                        WMI_STRING, DriverParameters.RegistryPath.Length+sizeof(USHORT), 
+                        WMI_STRING, DriverParameters.RegistryPath.Length+sizeof(USHORT),
                                     &regpath,
                         WMI_DONE)){
         reginfo->BufferSize = RequiredSize;
@@ -2940,7 +2940,7 @@ WmiRegInfo(
         return STATUS_BUFFER_TOO_SMALL;
 
     }
-    if (stack->Parameters.WMI.DataPath == WMIREGISTER) {    
+    if (stack->Parameters.WMI.DataPath == WMIREGISTER) {
         reginfo->MofResourceName = (ULONG)((ULONG_PTR)mofnameptr - (ULONG_PTR)reginfo);
         WriteCountedUnicodeString(&mofname, mofnameptr);
         reginfo->RegistryPath = (ULONG)((ULONG_PTR)regpath - (ULONG_PTR)reginfo);
@@ -2955,28 +2955,28 @@ WmiRegInfo(
     guid->InstanceCount = 1;
     guid->Guid = OBJECT_GUID(XenStoreBase);
     guid->Flags = WMIREG_FLAG_INSTANCE_PDO;
-    guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject; 
-	ObReferenceObject(fdoData->PhysicalDeviceObject);
-    
+    guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject;
+    ObReferenceObject(fdoData->PhysicalDeviceObject);
+
     guid = &reginfo->WmiRegGuid[1];
     guid->Guid = OBJECT_GUID(XenStoreSession);
     guid->Flags =0;
-    
+
     guid = &reginfo->WmiRegGuid[2];
     guid->InstanceCount = 1;
     guid->Guid = OBJECT_GUID(XenStoreWatchEvent);
     guid->Flags = WMIREG_FLAG_INSTANCE_PDO |
                 WMIREG_FLAG_EVENT_ONLY_GUID ;
-    guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject; 
-	ObReferenceObject(fdoData->PhysicalDeviceObject);
+    guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject;
+    ObReferenceObject(fdoData->PhysicalDeviceObject);
 
     guid = &reginfo->WmiRegGuid[3];
     guid->InstanceCount = 1;
     guid->Guid = OBJECT_GUID(XenStoreUnsuspendedEvent);
     guid->Flags = WMIREG_FLAG_INSTANCE_PDO |
                 WMIREG_FLAG_EVENT_ONLY_GUID ;
-	guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject; 
-	ObReferenceObject(fdoData->PhysicalDeviceObject);
+    guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject;
+    ObReferenceObject(fdoData->PhysicalDeviceObject);
 
 
     *byteswritten = RequiredSize;
@@ -2990,7 +2990,7 @@ WmiRegInfoEx(
     OUT ULONG_PTR *byteswritten
    )
 {
-   
+
     XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__);
     return WmiRegInfo(fdoData, stack, byteswritten);
 }
@@ -3006,17 +3006,17 @@ WmiProcessMinorFunction(
     PIO_STACK_LOCATION stack;
     UCHAR MinorFunction;
 
-	
+
 
     stack = IoGetCurrentIrpStackLocation(Irp);
 
-	if (stack->Parameters.WMI.ProviderId != (ULONG_PTR)fdoData->Dx->DeviceObject) {
-		XenIfaceDebugPrint(TRACE,"ProviderID %p %p", stack->Parameters.WMI.ProviderId, fdoData->PhysicalDeviceObject);
-		return STATUS_NOT_SUPPORTED;
-	}
-	else {
-		XenIfaceDebugPrint(TRACE,"ProviderID Match %p %p", stack->Parameters.WMI.ProviderId, fdoData->PhysicalDeviceObject);
-	}
+    if (stack->Parameters.WMI.ProviderId != (ULONG_PTR)fdoData->Dx->DeviceObject) {
+        XenIfaceDebugPrint(TRACE,"ProviderID %p %p", stack->Parameters.WMI.ProviderId, fdoData->PhysicalDeviceObject);
+        return STATUS_NOT_SUPPORTED;
+    }
+    else {
+        XenIfaceDebugPrint(TRACE,"ProviderID Match %p %p", stack->Parameters.WMI.ProviderId, fdoData->PhysicalDeviceObject);
+    }
     MinorFunction = stack->MinorFunction;
 
     switch (MinorFunction)
@@ -3060,9 +3060,9 @@ NTSTATUS XenIfaceSystemControl(
     status = WmiProcessMinorFunction(fdoData, Irp);
 
     if (status != STATUS_NOT_SUPPORTED) {
-		Irp->IoStatus.Status = status;
+        Irp->IoStatus.Status = status;
         IoCompleteRequest(Irp, IO_NO_INCREMENT);
-        
+
     }
     else {
         IoSkipCurrentIrpStackLocation(Irp);
diff --git a/src/xeniface/wmi.h b/src/xeniface/wmi.h
index ed77af7..a49f1b3 100644
--- a/src/xeniface/wmi.h
+++ b/src/xeniface/wmi.h
@@ -60,15 +60,15 @@ NTSTATUS XenIfaceSystemControl(
     );
 
 void FireSuspendEvent(
-	IN OUT PXENIFACE_FDO fdoData
-	);
+    IN OUT PXENIFACE_FDO fdoData
+    );
 
 void SessionsResumeAll(
-	XENIFACE_FDO *fdoData
+    XENIFACE_FDO *fdoData
 );
 
 void SessionsSuspendAll(
-	XENIFACE_FDO *fdoData
+    XENIFACE_FDO *fdoData
 );
 
 #endif
-- 
1.8.1.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 Wed Oct 21 05:26:11 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 21 Oct 2015 05:26:11 +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 1Zolud-0007jm-C5; Wed, 21 Oct 2015 05:26:11 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1Zolub-0007jh-OD
	for win-pv-devel@lists.xenproject.org; Wed, 21 Oct 2015 05:26:10 +0000
Received: from [85.158.139.211] by server-13.bemta-5.messagelabs.com id
	7F/E1-02324-1F127265; Wed, 21 Oct 2015 05:26:09 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-6.tower-206.messagelabs.com!1445405166!43821386!1
X-Originating-IP: [66.111.4.27]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjcgPT4gODQ2Mw==\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25980 invoked from network); 21 Oct 2015 05:26:07 -0000
Received: from out3-smtp.messagingengine.com (HELO
	out3-smtp.messagingengine.com) (66.111.4.27)
	by server-6.tower-206.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2015 05:26:07 -0000
Received: from compute2.internal (compute2.nyi.internal [10.202.2.42])
	by mailout.nyi.internal (Postfix) with ESMTP id CD169204DC
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:26:06 -0400 (EDT)
Received: from frontend1 ([10.202.2.160])
	by compute2.internal (MEProxy); Wed, 21 Oct 2015 01:26:06 -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=EN0uUkkbVhe9mSsvQCN1b/rtreg=; b=o+pcXO
	wSedEt2SswKzXkkcBkJpm9hZiaWI5rYsnouueb8SFv94DSgT3FWd8bHzc8DlHZr5
	N+qyFKQbkfF5EZ0/XKpO6KYYtxLWrFo57kPcVROXqxTEWk9JvtDvYScaWu8oZ/lO
	Tn/RtLwAILNTkmki8qbz4SDzWXokM9VxifGYY=
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=EN0uUkkbVhe9mSsvQCN1b/rtreg=; b=Kp0Gp
	1zErtDHUk9ZCNU0cYg/+9j0qxOQt3lH9mmrtpQSHawUZ8X8MzQfxaltBaz/I+ChH
	TPk7Mnldwrha/CzKnavaNkHtW950ES2bvdeqhWq/jmT06d4M37QonUCYqUD8H8qq
	IUUhWJit3FipDpNnGt/A7kAkoavc61hy1CQvOA=
X-Sasl-enc: K+eCwM3jfRfgHFMKaviEkBblvnj3vC0beOFUglUz3Jqj 1445405165
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 8DE3EC00014
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:26:05 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <562721EE.6090909@invisiblethingslab.com>
Date: Wed, 21 Oct 2015 07:26:06 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 3/6] Untabify the whole XENIFACE project
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

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 include/util.h        |   8 +-
 src/xeniface/driver.c |  32 +--
 src/xeniface/driver.h |   2 +-
 src/xeniface/fdo.c    | 268 +++++++++++-----------
 src/xeniface/fdo.h    |  14 +-
 src/xeniface/ioctls.c |   4 +-
 src/xeniface/log.h    |   4 +-
 src/xeniface/thread.c |   2 +-
 src/xeniface/wmi.c    | 604 +++++++++++++++++++++++++-------------------------
 src/xeniface/wmi.h    |   8 +-
 10 files changed, 473 insertions(+), 473 deletions(-)

diff --git a/include/util.h b/include/util.h
index a05fb34..10e5414 100644
--- a/include/util.h
+++ b/include/util.h
@@ -232,10 +232,10 @@ __AllocatePage(
 
     MdlMappedSystemVa = MmMapLockedPagesSpecifyCache(Mdl,
                                                      KernelMode,
-						                             MmCached,   
-						                             NULL,
-						                             FALSE,
-						                             NormalPagePriority);
+                                                     MmCached,
+                                                     NULL,
+                                                     FALSE,
+                                                     NormalPagePriority);
 
     status = STATUS_UNSUCCESSFUL;
     if (MdlMappedSystemVa == NULL)
diff --git a/src/xeniface/driver.c b/src/xeniface/driver.c
index 1c84467..40b1669 100644
--- a/src/xeniface/driver.c
+++ b/src/xeniface/driver.c
@@ -58,9 +58,9 @@ DriverUnload(
         goto done;
 
 
-	if (DriverParameters.RegistryPath.Buffer != NULL) {
-		ExFreePool(DriverParameters.RegistryPath.Buffer);
-	}
+    if (DriverParameters.RegistryPath.Buffer != NULL) {
+        ExFreePool(DriverParameters.RegistryPath.Buffer);
+    }
 
 done:
     DriverObject = NULL;
@@ -145,7 +145,7 @@ DriverEntry(
     )
 {
     ULONG               Index;
-	NTSTATUS status = STATUS_UNSUCCESSFUL;
+    NTSTATUS status = STATUS_UNSUCCESSFUL;
     ASSERT3P(DriverObject, ==, NULL);
 
     ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
@@ -156,16 +156,16 @@ DriverEntry(
          MAJOR_VERSION_STR "." MINOR_VERSION_STR "." MICRO_VERSION_STR "." BUILD_NUMBER_STR,
          DAY_STR "/" MONTH_STR "/" YEAR_STR);
 
-	DriverParameters.RegistryPath.MaximumLength = RegistryPath->Length + sizeof(UNICODE_NULL);
-	DriverParameters.RegistryPath.Length = RegistryPath->Length;
-	DriverParameters.RegistryPath.Buffer = ExAllocatePoolWithTag (PagedPool, 
-												DriverParameters.RegistryPath.MaximumLength,
-												XENIFACE_POOL_TAG);
-	if (NULL == DriverParameters.RegistryPath.Buffer) {
-		status = STATUS_INSUFFICIENT_RESOURCES;
-		goto fail1;
-	}
-	RtlCopyUnicodeString(&DriverParameters.RegistryPath, RegistryPath);
+    DriverParameters.RegistryPath.MaximumLength = RegistryPath->Length + sizeof(UNICODE_NULL);
+    DriverParameters.RegistryPath.Length = RegistryPath->Length;
+    DriverParameters.RegistryPath.Buffer = ExAllocatePoolWithTag (PagedPool, 
+                                                DriverParameters.RegistryPath.MaximumLength,
+                                                XENIFACE_POOL_TAG);
+    if (NULL == DriverParameters.RegistryPath.Buffer) {
+        status = STATUS_INSUFFICIENT_RESOURCES;
+        goto fail1;
+    }
+    RtlCopyUnicodeString(&DriverParameters.RegistryPath, RegistryPath);
 
 
     DriverObject = _DriverObject;
@@ -187,6 +187,6 @@ done:
 
     return STATUS_SUCCESS;
 fail1:
-	Error("fail1 (%08x)\n", status);
-	return status;
+    Error("fail1 (%08x)\n", status);
+    return status;
 }
diff --git a/src/xeniface/driver.h b/src/xeniface/driver.h
index 00f2d8f..f3c86e8 100644
--- a/src/xeniface/driver.h
+++ b/src/xeniface/driver.h
@@ -51,7 +51,7 @@ extern PDRIVER_OBJECT   DriverObject;
 #define MAX_DEVICE_ID_LEN   200
 
 typedef struct _XENIFACE_PARAMETERS {
-	UNICODE_STRING RegistryPath;
+    UNICODE_STRING RegistryPath;
 
 } XENIFACE_PARAMETERS, *PXENIFACE_PARAMETERS;
 
diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index 51bda24..b73dee1 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -1,31 +1,31 @@
 /* Copyright (c) Citrix Systems Inc.
  * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, 
- * with or without modification, are permitted provided 
+ *
+ * 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 
+ *
+ * *   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 
+ * *   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 
+ *
+ * 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.
  */
 
@@ -70,7 +70,7 @@ FdoInitialiseXSRegistryEntries(
     ANSI_STRING AnsiValue;
     char *value;
     NTSTATUS status;
-	NT_ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
+    NT_ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
     status = XENBUS_STORE(Read,
                           &Fdo->StoreInterface,
                           NULL,
@@ -113,7 +113,7 @@ FdoInitialiseXSRegistryEntries(
     }
 
     ZwClose(RegHandle);
-    
+
     RtlFreeUnicodeString(&UnicodeValue);
     XENBUS_STORE(Free, &Fdo->StoreInterface, value);
 
@@ -140,40 +140,40 @@ failXS:
 #define REGISTRY_THREAD_END_EVENT 1
 #define REGISTRY_EVENTS 2
 
-static NTSTATUS FdoRegistryThreadHandler(IN  PXENIFACE_THREAD  Self, 
-								  IN PVOID StartContext) {
-	KEVENT* threadevents[REGISTRY_EVENTS];
-	PXENIFACE_FDO Fdo = (PXENIFACE_FDO)StartContext;
-	NTSTATUS status;
+static NTSTATUS FdoRegistryThreadHandler(IN  PXENIFACE_THREAD  Self,
+                                         IN  PVOID StartContext) {
+    KEVENT* threadevents[REGISTRY_EVENTS];
+    PXENIFACE_FDO Fdo = (PXENIFACE_FDO)StartContext;
+    NTSTATUS status;
 
-	PKEVENT             Event;
+    PKEVENT             Event;
 
     Event = ThreadGetEvent(Self);
 
-	threadevents[REGISTRY_WRITE_EVENT] = &Fdo->registryWriteEvent;
-	threadevents[REGISTRY_THREAD_END_EVENT] = Event;
+    threadevents[REGISTRY_WRITE_EVENT] = &Fdo->registryWriteEvent;
+    threadevents[REGISTRY_THREAD_END_EVENT] = Event;
 
-	for(;;) {
-		
-		status = KeWaitForMultipleObjects(REGISTRY_EVENTS, (PVOID *)threadevents, WaitAny, Executive, KernelMode, TRUE, NULL, NULL);
-		if ((status>=STATUS_WAIT_0) && (status < STATUS_WAIT_0+REGISTRY_EVENTS)) {
-			if (status == STATUS_WAIT_0+REGISTRY_WRITE_EVENT) {
+    for(;;) {
+
+        status = KeWaitForMultipleObjects(REGISTRY_EVENTS, (PVOID *)threadevents, WaitAny, Executive, KernelMode, TRUE, NULL, NULL);
+        if ((status>=STATUS_WAIT_0) && (status < STATUS_WAIT_0+REGISTRY_EVENTS)) {
+            if (status == STATUS_WAIT_0+REGISTRY_WRITE_EVENT) {
                 XenIfaceDebugPrint(ERROR,"WriteRegistry\n");
                 FdoInitialiseXSRegistryEntries(Fdo);
                 KeClearEvent(threadevents[REGISTRY_WRITE_EVENT]);
-			}
-			if (status == STATUS_WAIT_0+REGISTRY_THREAD_END_EVENT) {
-				if (ThreadIsAlerted(Self))
-					return STATUS_SUCCESS;
-				KeClearEvent(threadevents[REGISTRY_THREAD_END_EVENT]);
-			}
-			
-		}
-		else if (!NT_SUCCESS(status)) {
-			XenIfaceDebugPrint(ERROR, "Registry handler thread failed %x\n", status);
-			return status;
-		}
-	}
+            }
+            if (status == STATUS_WAIT_0+REGISTRY_THREAD_END_EVENT) {
+                if (ThreadIsAlerted(Self))
+                    return STATUS_SUCCESS;
+                KeClearEvent(threadevents[REGISTRY_THREAD_END_EVENT]);
+            }
+
+        }
+        else if (!NT_SUCCESS(status)) {
+            XenIfaceDebugPrint(ERROR, "Registry handler thread failed %x\n", status);
+            return status;
+        }
+    }
 
 }
 
@@ -311,7 +311,7 @@ __FdoSetName(
     status = RtlUnicodeStringToAnsiString(&Ansi, &Unicode, FALSE);
     if (!NT_SUCCESS(status))
         goto fail1;
-    
+
     for (Index = 0; Dx->Name[Index] != '\0'; Index++) {
         if (!isalnum((UCHAR)Dx->Name[Index]))
             Dx->Name[Index] = '_';
@@ -437,7 +437,7 @@ __FdoForwardIrpSynchronously(
     IN  PVOID           Context
     )
 {
-	PKEVENT             Event = (PKEVENT)Context;
+    PKEVENT             Event = (PKEVENT)Context;
 
     UNREFERENCED_PARAMETER(DeviceObject);
     UNREFERENCED_PARAMETER(Irp);
@@ -595,7 +595,7 @@ __FdoFreeAnsi(
 
     for (Index = 0; Ansi[Index].Buffer != NULL; Index++)
         __FdoFree(Ansi[Index].Buffer);
-        
+
     __FdoFree(Ansi);
 }
 
@@ -752,7 +752,7 @@ FdoD3ToD0(
     if (!NT_SUCCESS(status))
         goto fail4;
 
-	Fdo->InterfacesAcquired = TRUE;
+    Fdo->InterfacesAcquired = TRUE;
     KeLowerIrql(Irql);
 
     return STATUS_SUCCESS;
@@ -760,7 +760,7 @@ FdoD3ToD0(
 fail4:
     Error("fail4\n");
 
-	XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
+    XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
 
 fail3:
     Error("fail3\n");
@@ -788,7 +788,7 @@ FdoD0ToD3(
     KIRQL           Irql;
 
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
-	Fdo->InterfacesAcquired = FALSE;
+    Fdo->InterfacesAcquired = FALSE;
     KeRaiseIrql(DISPATCH_LEVEL, &Irql);
 
     XENBUS_SUSPEND(Deregister,
@@ -796,12 +796,12 @@ FdoD0ToD3(
                    Fdo->SuspendCallbackLate);
     Fdo->SuspendCallbackLate = NULL;
 
-	XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
+    XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
 
     XENBUS_SUSPEND(Release, &Fdo->SuspendInterface);
 
     __FdoD0ToD3(Fdo);
-	
+
     KeLowerIrql(Irql);
 }
 
@@ -854,16 +854,16 @@ FdoStartDevice(
     if (!NT_SUCCESS(status))
         goto fail3;
 
-	status =  IoSetDeviceInterfaceState(&Fdo->InterfaceName, TRUE);
-	if (!NT_SUCCESS(status))
-		goto fail4;
+    status =  IoSetDeviceInterfaceState(&Fdo->InterfaceName, TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail4;
 
 
-	if (__FdoGetDevicePnpState(Fdo) != Stopped) {
-		status = WmiInit(Fdo);
-		if (!NT_SUCCESS(status))
-			goto fail5;
-	}
+    if (__FdoGetDevicePnpState(Fdo) != Stopped) {
+        status = WmiInit(Fdo);
+        if (!NT_SUCCESS(status))
+            goto fail5;
+    }
 
     __FdoSetDevicePnpState(Fdo, Started);
 
@@ -874,13 +874,13 @@ FdoStartDevice(
     return status;
 
 fail5:
-	Error("fail5\n");
+    Error("fail5\n");
 #pragma warning(suppress : 6031)
-	IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
+    IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
 
 fail4:
-	Error("fail4\n");
-	FdoD0ToD3(Fdo);
+    Error("fail4\n");
+    FdoD0ToD3(Fdo);
 
 fail3:
     Error("fail3\n");
@@ -1008,7 +1008,7 @@ FdoSurpriseRemoval(
     __FdoSetDevicePnpState(Fdo, SurpriseRemovePending);
 
     Irp->IoStatus.Status = STATUS_SUCCESS;
-#pragma warning(suppress : 6031) 
+#pragma warning(suppress : 6031)
     IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
     WmiFinalise(Fdo);
 
@@ -1031,7 +1031,7 @@ FdoRemoveDevice(
     if (__FdoGetDevicePowerState(Fdo) != PowerDeviceD0)
         goto done;
 
-	FdoD0ToD3(Fdo);
+    FdoD0ToD3(Fdo);
 
     __FdoSetSystemPowerState(Fdo, PowerSystemSleeping3);
     FdoS3ToS4(Fdo);
@@ -1043,7 +1043,7 @@ done:
     __FdoSetDevicePnpState(Fdo, Deleted);
 
     Irp->IoStatus.Status = STATUS_SUCCESS;
-#pragma warning(suppress : 6031) 
+#pragma warning(suppress : 6031)
     IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
     WmiFinalise(Fdo);
 
@@ -1139,7 +1139,7 @@ FdoDeviceUsageNotification(
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    NotDisableable = FALSE;    
+    NotDisableable = FALSE;
     for (Type = (DEVICE_USAGE_NOTIFICATION_TYPE)0; Type <= DeviceUsageTypeDumpFile; Type++) {
         if (Fdo->Usage[Type] != 0) {
             NotDisableable = TRUE;
@@ -1151,7 +1151,7 @@ FdoDeviceUsageNotification(
 
     if (Fdo->NotDisableable != NotDisableable) {
         Fdo->NotDisableable = NotDisableable;
-    
+
         IoInvalidateDeviceState(__FdoGetPhysicalDeviceObject(Fdo));
     }
 
@@ -1210,8 +1210,8 @@ FdoDispatchPnp(
     MinorFunction = StackLocation->MinorFunction;
 
     Trace("====> (%02x:%s)\n",
-          MinorFunction, 
-          PnpMinorFunctionName(MinorFunction)); 
+          MinorFunction,
+          PnpMinorFunctionName(MinorFunction));
 
     switch (StackLocation->MinorFunction) {
     case IRP_MN_START_DEVICE:
@@ -1265,9 +1265,9 @@ FdoDispatchPnp(
     }
 
     Trace("<==== (%02x:%s)(%08x)\n",
-          MinorFunction, 
+          MinorFunction,
           PnpMinorFunctionName(MinorFunction),
-          status); 
+          status);
 
     return status;
 }
@@ -1299,7 +1299,7 @@ __FdoSetDevicePowerUp(
 
     ASSERT3U(DeviceState, ==, PowerDeviceD0);
     status = FdoD3ToD0(Fdo);
-	SessionsResumeAll(Fdo);
+    SessionsResumeAll(Fdo);
     ASSERT(NT_SUCCESS(status));
 
 done:
@@ -1332,9 +1332,9 @@ __FdoSetDevicePowerDown(
     ASSERT3U(DeviceState, ==, PowerDeviceD3);
 
     if (__FdoGetDevicePowerState(Fdo) == PowerDeviceD0){
-		SessionsSuspendAll(Fdo);
+        SessionsSuspendAll(Fdo);
         FdoD0ToD3(Fdo);
-	}
+    }
 
     IoSkipCurrentIrpStackLocation(Irp);
     status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
@@ -1358,7 +1358,7 @@ __FdoSetDevicePower(
     PowerAction = StackLocation->Parameters.Power.ShutdownType;
 
     Trace("====> (%s:%s)\n",
-          PowerDeviceStateName(DeviceState), 
+          PowerDeviceStateName(DeviceState),
           PowerActionName(PowerAction));
 
     ASSERT3U(PowerAction, <, PowerActionShutdown);
@@ -1376,7 +1376,7 @@ __FdoSetDevicePower(
 
 done:
     Trace("<==== (%s:%s)(%08x)\n",
-          PowerDeviceStateName(DeviceState), 
+          PowerDeviceStateName(DeviceState),
           PowerActionName(PowerAction),
           status);
     return status;
@@ -1532,7 +1532,7 @@ __FdoSetSystemPower(
     PowerAction = StackLocation->Parameters.Power.ShutdownType;
 
     Trace("====> (%s:%s)\n",
-          PowerSystemStateName(SystemState), 
+          PowerSystemStateName(SystemState),
           PowerActionName(PowerAction));
 
     ASSERT3U(PowerAction, <, PowerActionShutdown);
@@ -1550,7 +1550,7 @@ __FdoSetSystemPower(
 
 done:
     Trace("<==== (%s:%s)(%08x)\n",
-          PowerSystemStateName(SystemState), 
+          PowerSystemStateName(SystemState),
           PowerActionName(PowerAction),
           status);
     return status;
@@ -1616,7 +1616,7 @@ __FdoQueryDevicePower(
     PowerAction = StackLocation->Parameters.Power.ShutdownType;
 
     Trace("====> (%s:%s)\n",
-          PowerDeviceStateName(DeviceState), 
+          PowerDeviceStateName(DeviceState),
           PowerActionName(PowerAction));
 
     ASSERT3U(PowerAction, <, PowerActionShutdown);
@@ -1634,7 +1634,7 @@ __FdoQueryDevicePower(
 
 done:
     Trace("<==== (%s:%s)(%08x)\n",
-          PowerDeviceStateName(DeviceState), 
+          PowerDeviceStateName(DeviceState),
           PowerActionName(PowerAction),
           status);
     return status;
@@ -1768,7 +1768,7 @@ __FdoQuerySystemPower(
     PowerAction = StackLocation->Parameters.Power.ShutdownType;
 
     Trace("====> (%s:%s)\n",
-          PowerSystemStateName(SystemState), 
+          PowerSystemStateName(SystemState),
           PowerActionName(PowerAction));
 
     ASSERT3U(PowerAction, <, PowerActionShutdown);
@@ -1786,7 +1786,7 @@ __FdoQuerySystemPower(
 
 done:
     Trace("<==== (%s:%s)(%08x)\n",
-          PowerSystemStateName(SystemState), 
+          PowerSystemStateName(SystemState),
           PowerActionName(PowerAction),
           status);
 
@@ -2080,26 +2080,26 @@ FdoDispatch(
         status = FdoDispatchPower(Fdo, Irp);
         break;
 
-	case IRP_MJ_DEVICE_CONTROL:
-		status = XenIFaceIoctl(Fdo, Irp);
-		break;
+    case IRP_MJ_DEVICE_CONTROL:
+        status = XenIFaceIoctl(Fdo, Irp);
+        break;
 
-	case IRP_MJ_SYSTEM_CONTROL:
-		status = XenIfaceSystemControl(Fdo, Irp);
-		break;
+    case IRP_MJ_SYSTEM_CONTROL:
+        status = XenIfaceSystemControl(Fdo, Irp);
+        break;
 
-	case IRP_MJ_READ:
-	case IRP_MJ_WRITE:
-		status = FdoReadWrite(Fdo, Irp);
-		break;
+    case IRP_MJ_READ:
+    case IRP_MJ_WRITE:
+        status = FdoReadWrite(Fdo, Irp);
+        break;
 
-	case IRP_MJ_CREATE:
-		status = FdoCreateFile(Fdo, Irp);
-		break;
+    case IRP_MJ_CREATE:
+        status = FdoCreateFile(Fdo, Irp);
+        break;
 
-	case IRP_MJ_CLOSE:
-		status = FdoClose(Fdo, Irp);
-		break;
+    case IRP_MJ_CLOSE:
+        status = FdoClose(Fdo, Irp);
+        break;
 
     default:
         status = FdoDispatchDefault(Fdo, Irp);
@@ -2149,7 +2149,7 @@ FdoQueryInterface(
     StackLocation->Parameters.QueryInterface.Size = (USHORT)Size;
     StackLocation->Parameters.QueryInterface.Version = (USHORT)Version;
     StackLocation->Parameters.QueryInterface.Interface = Interface;
-    
+
     Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
 
     status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
@@ -2227,7 +2227,7 @@ FdoCreate(
     Dx->SystemPowerState = PowerSystemShutdown;
     Dx->DevicePowerState = PowerDeviceD3;
 
-	FunctionDeviceObject->Flags |= DO_POWER_PAGABLE;
+    FunctionDeviceObject->Flags |= DO_POWER_PAGABLE;
     FunctionDeviceObject->Flags |= DO_BUFFERED_IO;
 
     Fdo = (PXENIFACE_FDO)__FdoAllocate(sizeof (XENIFACE_FDO));
@@ -2258,12 +2258,12 @@ FdoCreate(
         goto fail5;
 
 #pragma prefast(suppress:6014) // Possibly leaking Fdo->InterfaceName
-	status = IoRegisterDeviceInterface(PhysicalDeviceObject,
-										(LPGUID)&GUID_INTERFACE_XENIFACE,
-										NULL,
-										&Fdo->InterfaceName);
-	if (!NT_SUCCESS(status))
-		goto fail6;
+    status = IoRegisterDeviceInterface(PhysicalDeviceObject,
+                                       (LPGUID)&GUID_INTERFACE_XENIFACE,
+                                       NULL,
+                                       &Fdo->InterfaceName);
+    if (!NT_SUCCESS(status))
+        goto fail6;
 
     status = __FdoSetName(Fdo, Name);
     if (!NT_SUCCESS(status))
@@ -2300,13 +2300,13 @@ FdoCreate(
     InitializeListHead(&Dx->ListEntry);
     Fdo->References = 1;
 
-	FdoInitialiseXSRegistryEntries(Fdo);
+    FdoInitialiseXSRegistryEntries(Fdo);
 
-	KeInitializeEvent(&Fdo->registryWriteEvent, NotificationEvent, FALSE);
+    KeInitializeEvent(&Fdo->registryWriteEvent, NotificationEvent, FALSE);
 
-	status = ThreadCreate(FdoRegistryThreadHandler, Fdo, &Fdo->registryThread);
-	if (!NT_SUCCESS(status))
-		goto fail11;
+    status = ThreadCreate(FdoRegistryThreadHandler, Fdo, &Fdo->registryThread);
+    if (!NT_SUCCESS(status))
+        goto fail11;
 
     Info("%p (%s)\n",
          FunctionDeviceObject,
@@ -2317,15 +2317,15 @@ FdoCreate(
 
     return STATUS_SUCCESS;
 
-	
+
 fail11:
-	Error("fail11\n");
+    Error("fail11\n");
 
     RtlZeroMemory(&Fdo->StoreInterface,
                   sizeof (XENBUS_STORE_INTERFACE));
 
 fail10:
-	Error("fail10\n");
+    Error("fail10\n");
 
     RtlZeroMemory(&Fdo->SharedInfoInterface,
                   sizeof (XENBUS_SHARED_INFO_INTERFACE));
@@ -2341,8 +2341,8 @@ fail8:
 
 fail7:
     Error("fail7\n");
-	RtlFreeUnicodeString(&Fdo->InterfaceName);
-	RtlZeroMemory(&Fdo->InterfaceName,sizeof(UNICODE_STRING));
+    RtlFreeUnicodeString(&Fdo->InterfaceName);
+    RtlZeroMemory(&Fdo->InterfaceName,sizeof(UNICODE_STRING));
 
 fail6:
     Error("fail6\n");
@@ -2353,14 +2353,14 @@ fail5:
     ThreadAlert(Fdo->DevicePowerThread);
     ThreadJoin(Fdo->DevicePowerThread);
     Fdo->DevicePowerThread = NULL;
-    
+
 fail4:
     Error("fail4\n");
 
     ThreadAlert(Fdo->SystemPowerThread);
     ThreadJoin(Fdo->SystemPowerThread);
     Fdo->SystemPowerThread = NULL;
-    
+
 fail3:
     Error("fail3\n");
 
@@ -2410,7 +2410,7 @@ FdoDestroy(
 
     RtlZeroMemory(&Fdo->Mutex, sizeof (XENIFACE_MUTEX));
 
-	Fdo->InterfacesAcquired = FALSE;
+    Fdo->InterfacesAcquired = FALSE;
 
     RtlZeroMemory(&Fdo->StoreInterface,
                   sizeof (XENBUS_STORE_INTERFACE));
@@ -2421,7 +2421,7 @@ FdoDestroy(
     RtlZeroMemory(&Fdo->SuspendInterface,
                   sizeof (XENBUS_SUSPEND_INTERFACE));
 
-	ThreadAlert(Fdo->registryThread);
+    ThreadAlert(Fdo->registryThread);
     ThreadJoin(Fdo->registryThread);
     Fdo->registryThread = NULL;
 
@@ -2440,12 +2440,12 @@ FdoDestroy(
     Fdo->PhysicalDeviceObject = NULL;
     Fdo->Dx = NULL;
 
-	RtlZeroMemory(&Fdo->SessionLock, sizeof(FAST_MUTEX));
-	RtlZeroMemory(&Fdo->SessionHead, sizeof(LIST_ENTRY));
-	RtlZeroMemory(&Fdo->registryWriteEvent, sizeof(KEVENT));
+    RtlZeroMemory(&Fdo->SessionLock, sizeof(FAST_MUTEX));
+    RtlZeroMemory(&Fdo->SessionHead, sizeof(LIST_ENTRY));
+    RtlZeroMemory(&Fdo->registryWriteEvent, sizeof(KEVENT));
 
-	RtlFreeUnicodeString(&Fdo->InterfaceName);
-	RtlZeroMemory(&Fdo->InterfaceName,sizeof(UNICODE_STRING));
+    RtlFreeUnicodeString(&Fdo->InterfaceName);
+    RtlZeroMemory(&Fdo->InterfaceName,sizeof(UNICODE_STRING));
 
     ASSERT(IsZeroMemory(Fdo, sizeof (XENIFACE_FDO)));
     __FdoFree(Fdo);
diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
index 4416064..c859338 100644
--- a/src/xeniface/fdo.h
+++ b/src/xeniface/fdo.h
@@ -78,13 +78,13 @@ typedef struct _XENIFACE_FDO {
 
     XENBUS_SUSPEND_INTERFACE        SuspendInterface;
 
-	XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
+    XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
 
     PXENBUS_SUSPEND_CALLBACK        SuspendCallbackLate;
 
-	BOOLEAN						    InterfacesAcquired;
+    BOOLEAN						    InterfacesAcquired;
 
-	#define MAX_SESSIONS    (65536)
+    #define MAX_SESSIONS    (65536)
 
     int							    WmiReady;
 
@@ -92,13 +92,13 @@ typedef struct _XENIFACE_FDO {
     FAST_MUTEX					    SessionLock;
     LIST_ENTRY					    SessionHead;
 
-	PXENIFACE_THREAD			    registryThread;
-	KEVENT						    registryWriteEvent;
+    PXENIFACE_THREAD			    registryThread;
+    KEVENT						    registryWriteEvent;
 
 
-	UNICODE_STRING				    SuggestedInstanceName;
+    UNICODE_STRING				    SuggestedInstanceName;
 
-	UNICODE_STRING				    InterfaceName;
+    UNICODE_STRING				    InterfaceName;
 
 } XENIFACE_FDO, *PXENIFACE_FDO;
 
diff --git a/src/xeniface/ioctls.c b/src/xeniface/ioctls.c
index 3bef9ea..ead7f9b 100644
--- a/src/xeniface/ioctls.c
+++ b/src/xeniface/ioctls.c
@@ -325,9 +325,9 @@ XenIFaceIoctl(
 
 done:
 
-	Irp->IoStatus.Status = status;
+    Irp->IoStatus.Status = status;
 
-	IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
     return status;
 }
diff --git a/src/xeniface/log.h b/src/xeniface/log.h
index 375a61f..5524f05 100644
--- a/src/xeniface/log.h
+++ b/src/xeniface/log.h
@@ -142,11 +142,11 @@ __Info(
 
 
 #define XenIfaceDebugPrint(LEVEL, ...) \
-	__XenIfaceDebugPrint(__MODULE__ "|" __FUNCTION__ ": ",LEVEL, __VA_ARGS__)
+    __XenIfaceDebugPrint(__MODULE__ "|" __FUNCTION__ ": ",LEVEL, __VA_ARGS__)
 
 static __inline VOID
 __XenIfaceDebugPrint    (
-	__in const CHAR *Prefix,
+    __in const CHAR *Prefix,
     __in ULONG   DebugPrintLevel,
     __in PCCHAR  DebugMessage,
     ...
diff --git a/src/xeniface/thread.c b/src/xeniface/thread.c
index 51967ed..f008834 100644
--- a/src/xeniface/thread.c
+++ b/src/xeniface/thread.c
@@ -129,7 +129,7 @@ ThreadCreate(
 
     (*Thread) = __ThreadAllocate(sizeof (XENIFACE_THREAD));
 
-	Warning("Create thread %p %p\n", Function, Thread);
+    Warning("Create thread %p %p\n", Function, Thread);
 
     status = STATUS_NO_MEMORY;
     if (*Thread == NULL)
diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
index 1bdb834..82592e3 100644
--- a/src/xeniface/wmi.c
+++ b/src/xeniface/wmi.c
@@ -1,31 +1,31 @@
 /* Copyright (c) Citrix Systems Inc.
  * All rights reserved.
  *
- * Redistribution and use in source and binary forms, 
- * with or without modification, are permitted provided 
+ * 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 
+ * *   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 
+ * *   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 
+ * 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.
  */
 
@@ -47,7 +47,7 @@
 #include <version.h>
 
 __drv_raisesIRQL(APC_LEVEL)
-__drv_savesIRQLGlobal(OldIrql, fdoData->SessionLock) 
+__drv_savesIRQLGlobal(OldIrql, fdoData->SessionLock)
 void LockSessions(
         XENIFACE_FDO* fdoData)
 {
@@ -93,7 +93,7 @@ NTSTATUS GetAnsiString(ANSI_STRING *ansi, USHORT maxlength, LPWSTR location) {
 
 // Rather inconveniently, xenstore needs UTF8 data, WMI works in UTF16
 // and windows doesn't provide conversion functions in any version
-// prior to Windows 7.  
+// prior to Windows 7.
 
 USHORT Utf32FromUtf16(ULONG *utf32, const WCHAR* utf16) {
     ULONG w;
@@ -132,22 +132,22 @@ USHORT Utf32FromUtf8(ULONG *utf32, const CHAR *utf8) {
     else if ((utf8[0] & 0xE0) == 0xC0) {
         y = utf8[0] & 0x1F;
         x = utf8[1] & 0x3F;
-        *utf32 = (y<<6) | x; 
+        *utf32 = (y<<6) | x;
         return 2;
     }
     else if ((utf8[0] & 0xF0) == 0xE0) {
         z = utf8[0] & 0x0F;
         y = utf8[1] & 0x3F;
         x = utf8[2] & 0x3F;
-       *utf32 = (z <<12) | (y<<6) | x; 
+       *utf32 = (z <<12) | (y<<6) | x;
        return 3;
-    } 
+    }
     else {
         ua = utf8[0] & 0x7;
         ub = (utf8[1] & 0x30) >> 4;
         u = (ua << 2) | ub;
         z = utf8[1] & 0x0f;
-        y = utf8[2] & 0x3f; 
+        y = utf8[2] & 0x3f;
         x = utf8[3] & 0x3f;
         *utf32 = (u<<16) | (z <<12) | (y <<6) | x;
         return 4;
@@ -277,7 +277,7 @@ NTSTATUS GetUTF8String(UTF8_STRING** utf8, USHORT bufsize, LPWSTR ustring)
 
     (*utf8)->Length = bytecount;
     (*utf8)->Buffer[bytecount]=0;
-    
+
     bytecount = 0;
     i=0;
     while (i < bufsize/sizeof(WCHAR)) {
@@ -305,7 +305,7 @@ void GetCountedUnicodeString(UNICODE_STRING *unicode, UCHAR *location)
     USHORT bufsize = *(USHORT*)location;
     LPWSTR ustring = (LPWSTR)(location+sizeof(USHORT));
     GetUnicodeString(unicode, bufsize, ustring);
-} 
+}
 
 NTSTATUS GetCountedAnsiString(ANSI_STRING *ansi, UCHAR *location)
 {
@@ -332,7 +332,7 @@ typedef enum {
     WMI_STRINGOFFSET
 } WMI_TYPE;
 
-int AccessWmiBuffer(PUCHAR Buffer, int readbuffer, ULONG * RequiredSize, 
+int AccessWmiBuffer(PUCHAR Buffer, int readbuffer, ULONG * RequiredSize,
                     size_t BufferSize, ...) {
     va_list vl;
     ULONG_PTR offset;
@@ -405,7 +405,7 @@ int AccessWmiBuffer(PUCHAR Buffer, int readbuffer, ULONG * RequiredSize,
                         UCHAR *bufferpos = Buffer + inpos;
                         ULONG insize = va_arg(vl, ULONG);
                         UCHAR **writebuf = va_arg(vl, UCHAR**);
-                        *writebuf = NULL; 
+                        *writebuf = NULL;
                         if (bufferpos+ insize > endbuffer) {;
                             overflow = TRUE;
                         }
@@ -460,12 +460,12 @@ int AccessWmiBuffer(PUCHAR Buffer, int readbuffer, ULONG * RequiredSize,
                         LPWSTR *val;
                         offset = (2-((ULONG_PTR)position%2))%2;
                         position += offset;
-                        if (position + sizeof(WCHAR)*25 > endbuffer) 
+                        if (position + sizeof(WCHAR)*25 > endbuffer)
                             overflow = TRUE;
-                        val = va_arg(vl, LPWSTR*); 
-                        *val = NULL; 
-                        if (!overflow) 
-                            *val = (LPWSTR )position; 
+                        val = va_arg(vl, LPWSTR*);
+                        *val = NULL;
+                        if (!overflow)
+                            *val = (LPWSTR )position;
                         position += sizeof(WCHAR)*25;
                     }
                     break;
@@ -477,7 +477,7 @@ int AccessWmiBuffer(PUCHAR Buffer, int readbuffer, ULONG * RequiredSize,
             break;
         }
     }
-    *RequiredSize = (ULONG)(position - Buffer); 
+    *RequiredSize = (ULONG)(position - Buffer);
     va_end(vl);
     if (overflow)
         return FALSE;
@@ -485,9 +485,9 @@ int AccessWmiBuffer(PUCHAR Buffer, int readbuffer, ULONG * RequiredSize,
 }
 
 
-NTSTATUS 
+NTSTATUS
 WriteCountedUnicodeString(
-    const UNICODE_STRING *ustr, 
+    const UNICODE_STRING *ustr,
     UCHAR *location
     )
 {
@@ -516,7 +516,7 @@ WriteCountedUTF8String(const char * string, UCHAR *location) {
     }
     buffer[bytesize/sizeof(WCHAR)] = 0;
 
-    i=0; 
+    i=0;
     b=0;
     while (string[i] != 0) {
         i += Utf32FromUtf8(&utf32, &string[i]);
@@ -533,7 +533,7 @@ NTSTATUS
 WriteCountedString(
     const char * string,
     UCHAR * location
-    ) 
+    )
 {
     ANSI_STRING ansi;
     UNICODE_STRING unicode;
@@ -542,7 +542,7 @@ WriteCountedString(
     RtlInitAnsiString(&ansi, string);
 
     status = RtlAnsiStringToUnicodeString(&unicode, &ansi, TRUE);
-    if (NT_SUCCESS(status)) { 
+    if (NT_SUCCESS(status)) {
 
         status = WriteCountedUnicodeString(&unicode, location);
         RtlFreeUnicodeString(&unicode);
@@ -583,7 +583,7 @@ CloneUnicodeString(UNICODE_STRING *dest, UNICODE_STRING *src) {
     return status;
 }
 
-NTSTATUS 
+NTSTATUS
 StringToUnicode(UNICODE_STRING *ustr, const char * str) {
     ANSI_STRING ansi;
     RtlInitAnsiString(&ansi, str);
@@ -632,7 +632,7 @@ GetInstanceName(UNICODE_STRING *dest, XENIFACE_FDO* FdoData, const char *string)
         return status;
     }
     destsz = FdoData->SuggestedInstanceName.Length +
-                sizeof(WCHAR) + 
+                sizeof(WCHAR) +
                 unicode.Length;
 
     AllocUnicodeStringBuffer(dest, (USHORT)destsz);
@@ -640,8 +640,8 @@ GetInstanceName(UNICODE_STRING *dest, XENIFACE_FDO* FdoData, const char *string)
         RtlFreeUnicodeString(&unicode);
         return STATUS_INSUFFICIENT_RESOURCES;
     }
-    status = RtlUnicodeStringPrintf(dest, L"%s\\%s", 
-                FdoData->SuggestedInstanceName.Buffer, 
+    status = RtlUnicodeStringPrintf(dest, L"%s\\%s",
+                FdoData->SuggestedInstanceName.Buffer,
                 unicode.Buffer);
     if (!NT_SUCCESS(status)) {
         RtlFreeUnicodeString(&unicode);
@@ -701,14 +701,14 @@ void UnicodeShallowCopy(UNICODE_STRING *dest, UNICODE_STRING *src) {
     dest->Buffer = src->Buffer;
     dest->Length = src->Length;
     dest->MaximumLength = src->MaximumLength;
-} 
+}
 
 
 XenStoreSession*
-FindSessionLocked(XENIFACE_FDO *fdoData, 
+FindSessionLocked(XENIFACE_FDO *fdoData,
                                 LONG id) {
     XenStoreSession *session;
-     
+
     session = (XenStoreSession *)fdoData->SessionHead.Flink;
     while (session != (XenStoreSession *)&fdoData->SessionHead){
         if (session->id == id) {
@@ -735,7 +735,7 @@ XenStoreWatch *
 SessionFindWatchLocked(XenStoreSession *session,
                         UNICODE_STRING *path) {
     XenStoreWatch * watch;
-    
+
     XenIfaceDebugPrint(TRACE,"Wait for session watch lock\n");
     ExAcquireFastMutex(&session->WatchMapLock);
     XenIfaceDebugPrint(TRACE,"got session watch lock\n");
@@ -751,11 +751,11 @@ SessionFindWatchLocked(XenStoreSession *session,
     XenIfaceDebugPrint(WARNING,"couldn't find watch\n");
     return NULL;
 
-} 
+}
 
 void FireSuspendEvent(PXENIFACE_FDO fdoData) {
-	XenIfaceDebugPrint(ERROR,"Ready to unsuspend Event\n");
-	KeSetEvent(&fdoData->registryWriteEvent, IO_NO_INCREMENT, FALSE);
+    XenIfaceDebugPrint(ERROR,"Ready to unsuspend Event\n");
+    KeSetEvent(&fdoData->registryWriteEvent, IO_NO_INCREMENT, FALSE);
     if (fdoData->WmiReady) {
         XenIfaceDebugPrint(TRACE,"Fire Suspend Event\n");
         WmiFireEvent(fdoData->Dx->DeviceObject,
@@ -764,7 +764,7 @@ void FireSuspendEvent(PXENIFACE_FDO fdoData) {
                      0,
                      NULL);
     }
-} 
+}
 void FireWatch(XenStoreWatch* watch) {
     UCHAR * eventdata;
     ULONG RequiredSize;
@@ -774,7 +774,7 @@ void FireWatch(XenStoreWatch* watch) {
             WMI_STRING, GetCountedUnicodeStringSize(&watch->path),
                 &sesbuf,
             WMI_DONE);
-    
+
     eventdata = ExAllocatePoolWithTag(NonPagedPool, RequiredSize,'XIEV');
     if (eventdata!=NULL) {
         AccessWmiBuffer(eventdata, FALSE, &RequiredSize, RequiredSize,
@@ -782,17 +782,17 @@ void FireWatch(XenStoreWatch* watch) {
                 &sesbuf,
             WMI_DONE);
 
-        WriteCountedUnicodeString(&watch->path, sesbuf); 
+        WriteCountedUnicodeString(&watch->path, sesbuf);
     }
 
     if (eventdata !=NULL) {
         XenIfaceDebugPrint(TRACE,"Fire Watch Event\n");
-        WmiFireEvent(watch->fdoData->Dx->DeviceObject, 
+        WmiFireEvent(watch->fdoData->Dx->DeviceObject,
                      (LPGUID)&OBJECT_GUID(XenStoreWatchEvent),
                      0,
-                     RequiredSize, 
+                     RequiredSize,
                      eventdata);
-    } 
+    }
 }
 
 
@@ -800,7 +800,7 @@ KSTART_ROUTINE WatchCallbackThread;
 NTSTATUS
 StartWatch(XENIFACE_FDO *fdoData, XenStoreWatch *watch)
 {
-    char *tmppath; 
+    char *tmppath;
     ANSI_STRING ansipath;
     NTSTATUS status;
     status = RtlUnicodeStringToAnsiString(&ansipath, &watch->path, TRUE);
@@ -814,7 +814,7 @@ StartWatch(XENIFACE_FDO *fdoData, XenStoreWatch *watch)
     }
     RtlZeroMemory(tmppath, ansipath.Length+1);
     RtlCopyBytes(tmppath,ansipath.Buffer, ansipath.Length);
-    
+
     status = XENBUS_STORE(WatchAdd, &fdoData->StoreInterface, NULL, tmppath, &watch->watchevent, &watch->watchhandle );
     if (!NT_SUCCESS(status)) {
         ExFreePool(tmppath);
@@ -848,7 +848,7 @@ VOID WatchCallbackThread(__in PVOID StartContext) {
                 watch = (XenStoreWatch *)watch->listentry.Flink;
             }
             session->mapchanged = FALSE;
-            session->watchevents[i] = &session->SessionChangedEvent; 
+            session->watchevents[i] = &session->SessionChangedEvent;
         }
         ExReleaseFastMutex(&session->WatchMapLock);
         XenIfaceDebugPrint(TRACE,"Wait for new event\n");
@@ -875,7 +875,7 @@ VOID WatchCallbackThread(__in PVOID StartContext) {
                     if (watch->suspendcount !=XENBUS_SUSPEND(GetCount, &watch->fdoData->SuspendInterface)) {
                         watch->suspendcount = XENBUS_SUSPEND(GetCount, &watch->fdoData->SuspendInterface);
                         XenIfaceDebugPrint(WARNING,"SessionSuspendResumeUnwatch %p\n", watch->watchhandle);
-                        
+
                         XENBUS_STORE(WatchRemove, &watch->fdoData->StoreInterface, watch->watchhandle);
                         StartWatch(watch->fdoData, watch);
                     }
@@ -886,13 +886,13 @@ VOID WatchCallbackThread(__in PVOID StartContext) {
         }
         else if ( status == STATUS_WAIT_0 + i) {
             ExAcquireFastMutex(&session->WatchMapLock);
-            KeClearEvent(&session->SessionChangedEvent); 
+            KeClearEvent(&session->SessionChangedEvent);
             if (session->closing==TRUE) {
                 XenIfaceDebugPrint(TRACE,"Trying to end session thread\n");
                 if (session->watchcount != 0) {
                     XenStoreWatch *watch;
-                    for (watch = (XenStoreWatch *)session->watches.Flink; 
-                        watch!=(XenStoreWatch *)&session->watches; 
+                    for (watch = (XenStoreWatch *)session->watches.Flink;
+                        watch!=(XenStoreWatch *)&session->watches;
                         watch=(XenStoreWatch *)session->watches.Flink) {
                             FreeUnicodeStringBuffer(&watch->path);
                             RemoveEntryList((LIST_ENTRY*)watch);
@@ -907,7 +907,7 @@ VOID WatchCallbackThread(__in PVOID StartContext) {
                 //ExReleaseFastMutex(&session->WatchMapLock);
             }
             else {
-                
+
                 ExReleaseFastMutex(&session->WatchMapLock);
             }
         }
@@ -916,12 +916,12 @@ VOID WatchCallbackThread(__in PVOID StartContext) {
 }
 
 NTSTATUS
-SessionAddWatchLocked(XenStoreSession *session, 
-                        XENIFACE_FDO* fdoData, 
+SessionAddWatchLocked(XenStoreSession *session,
+                        XENIFACE_FDO* fdoData,
                         UNICODE_STRING *path,
                         XenStoreWatch **watch) {
 
-    
+
     NTSTATUS status;
     XenStoreWatch *pwatch;
 
@@ -934,18 +934,18 @@ SessionAddWatchLocked(XenStoreSession *session,
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
-    (*watch)->finished = FALSE; 
+    (*watch)->finished = FALSE;
     (*watch)->fdoData = fdoData;
     UnicodeShallowCopy(&(*watch)->path, path);
 
 
-   
+
     (*watch)->suspendcount = XENBUS_SUSPEND(GetCount, &fdoData->SuspendInterface);
-    
+
 
     KeInitializeEvent(&(*watch)->watchevent, NotificationEvent, FALSE);
 
-    
+
     status = StartWatch(fdoData, *watch);
     if ((!NT_SUCCESS(status)) || ((*watch)->watchhandle == NULL)) {
         ExFreePool(*watch);
@@ -1001,8 +1001,8 @@ void SessionRemoveWatchesLocked(XenStoreSession *session) {
 
     XenIfaceDebugPrint(TRACE, "wait remove mutex\n");
     ExAcquireFastMutex(&session->WatchMapLock);
-    for (watch = (XenStoreWatch *)session->watches.Flink; 
-         watch!=(XenStoreWatch *)&session->watches; 
+    for (watch = (XenStoreWatch *)session->watches.Flink;
+         watch!=(XenStoreWatch *)&session->watches;
          watch=(XenStoreWatch *)watch->listentry.Flink) {
 
         XenIfaceDebugPrint(TRACE, "try remove %p\n",session->watches.Flink );
@@ -1017,7 +1017,7 @@ XenStoreSession*
 FindSessionByInstanceLocked(XENIFACE_FDO *fdoData,
                             UNICODE_STRING *instance) {
     XenStoreSession *session;
-     
+
     session = (XenStoreSession *)fdoData->SessionHead.Flink;
     while (session != (XenStoreSession *)&fdoData->SessionHead) {
         if (CompareUnicodeStrings(instance, &session->instancename)==0) {
@@ -1059,7 +1059,7 @@ PSTR Xmasprintf(const char *fmt, ...) {
         out =  ExAllocatePoolWithTag(NonPagedPool, basesize, 'XenP');
         if (out == NULL)
             return NULL;
-        
+
         status = RtlStringCbVPrintfExA(out, basesize, NULL, &unused,0, fmt, argv);
 
         ExFreePool(out);
@@ -1075,9 +1075,9 @@ PSTR Xmasprintf(const char *fmt, ...) {
     return out;
 }
 
-NTSTATUS 
-CreateNewSession(XENIFACE_FDO *fdoData, 
-                    UNICODE_STRING *stringid, 
+NTSTATUS
+CreateNewSession(XENIFACE_FDO *fdoData,
+                    UNICODE_STRING *stringid,
                     ULONG *sessionid) {
     XenStoreSession *session;
     PSTR iname;
@@ -1093,7 +1093,7 @@ CreateNewSession(XENIFACE_FDO *fdoData,
     if (session == NULL)
         return STATUS_INSUFFICIENT_RESOURCES;
     RtlZeroMemory(session, sizeof(XenStoreSession));
-    
+
     ExInitializeFastMutex(&session->WatchMapLock);
     session->mapchanged = TRUE;
     status = RtlUnicodeStringToAnsiString(&ansi, stringid, TRUE);
@@ -1109,7 +1109,7 @@ CreateNewSession(XENIFACE_FDO *fdoData,
         status = STATUS_NO_MEMORY;
         if (iname == NULL) {
             UnlockSessions(fdoData);
-            RtlFreeAnsiString(&ansi); 
+            RtlFreeAnsiString(&ansi);
             ExFreePool(session);
             return status;
         }
@@ -1118,18 +1118,18 @@ CreateNewSession(XENIFACE_FDO *fdoData,
         ExFreePool(iname);
         if (!NT_SUCCESS(status)) {
             UnlockSessions(fdoData);
-            RtlFreeAnsiString(&ansi); 
+            RtlFreeAnsiString(&ansi);
             ExFreePool(session);
             return status;
         }
         count++;
-        
+
     } while (FindSessionByInstanceLocked(fdoData, &session->instancename) != NULL);
 
-    
-    
-    
-    
+
+
+
+
     if (fdoData->SessionHead.Flink==&fdoData->SessionHead) {
         session->id=0;
     }
@@ -1142,12 +1142,12 @@ CreateNewSession(XENIFACE_FDO *fdoData,
     InsertHeadList((PLIST_ENTRY)&fdoData->SessionHead, (PLIST_ENTRY)session);
     *sessionid = session->id;
     UnicodeShallowCopy(&session->stringid, stringid);
-    
+
     InitializeListHead((PLIST_ENTRY)&session->watches);
-    
+
     KeInitializeEvent(&session->SessionChangedEvent, NotificationEvent, FALSE);
     session->closing = FALSE;
-    if (fdoData->InterfacesAcquired){ 
+    if (fdoData->InterfacesAcquired){
         XenIfaceDebugPrint(TRACE,"Add session unsuspended\n");
         session->suspended=FALSE;
     }
@@ -1161,7 +1161,7 @@ CreateNewSession(XENIFACE_FDO *fdoData,
 
     status = PsCreateSystemThread(&hthread, THREAD_ALL_ACCESS, &oa, NULL, NULL, WatchCallbackThread, session);
     if (!NT_SUCCESS(status)) {
-            RtlFreeAnsiString(&ansi); 
+            RtlFreeAnsiString(&ansi);
             ExFreePool(session);
             return status;
     }
@@ -1170,17 +1170,17 @@ CreateNewSession(XENIFACE_FDO *fdoData,
     return STATUS_SUCCESS;
 }
 
-void 
-RemoveSessionLocked(XENIFACE_FDO *fdoData, 
+void
+RemoveSessionLocked(XENIFACE_FDO *fdoData,
                     XenStoreSession *session) {
-     
+
     XenIfaceDebugPrint(TRACE,"RemoveSessionLocked\n");
     RemoveEntryList((LIST_ENTRY*)session);
     fdoData->Sessions--;
     SessionRemoveWatchesLocked(session);
     if (session->transaction != NULL) {
-        XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface, session->transaction, FALSE);  
-    }  
+        XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface, session->transaction, FALSE);
+    }
     session->closing = TRUE;
     KeSetEvent(&session->SessionChangedEvent, IO_NO_INCREMENT, FALSE);
     KeWaitForSingleObject(session->WatchThread, Executive, KernelMode, FALSE, NULL);
@@ -1191,7 +1191,7 @@ RemoveSessionLocked(XENIFACE_FDO *fdoData,
 }
 
 void
-RemoveSession(XENIFACE_FDO *fdoData, 
+RemoveSession(XENIFACE_FDO *fdoData,
                     XenStoreSession *session) {
     XenIfaceDebugPrint(TRACE,"RemoveSession\n");
     LockSessions(fdoData);
@@ -1200,15 +1200,15 @@ RemoveSession(XENIFACE_FDO *fdoData,
 }
 
 void SessionsRemoveAll(XENIFACE_FDO *fdoData) {
-	XenIfaceDebugPrint(TRACE,"lock");
+    XenIfaceDebugPrint(TRACE,"lock");
     LockSessions(fdoData);
-	XenIfaceDebugPrint(TRACE,"in lock");
+    XenIfaceDebugPrint(TRACE,"in lock");
     while (fdoData->SessionHead.Flink != &fdoData->SessionHead) {
         RemoveSessionLocked(fdoData, (XenStoreSession *)fdoData->SessionHead.Flink);
     }
-	XenIfaceDebugPrint(TRACE,"unlock");
+    XenIfaceDebugPrint(TRACE,"unlock");
     UnlockSessions(fdoData);
-	XenIfaceDebugPrint(TRACE,"unlocked");
+    XenIfaceDebugPrint(TRACE,"unlocked");
 }
 
 
@@ -1237,15 +1237,15 @@ void SessionUnwatchWatchesLocked(XenStoreSession *session)
     ExReleaseFastMutex(&session->WatchMapLock);
 }
 
-void SuspendSessionLocked(XENIFACE_FDO *fdoData, 
+void SuspendSessionLocked(XENIFACE_FDO *fdoData,
                          XenStoreSession *session) {
     SessionUnwatchWatchesLocked(session);
     if (session->transaction != NULL) {
         XenIfaceDebugPrint(TRACE, "End transaction %p\n",session->transaction);
-        
-        XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface, session->transaction, FALSE);  
+
+        XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface, session->transaction, FALSE);
         session->transaction = NULL;
-    }  
+    }
 }
 
 
@@ -1288,7 +1288,7 @@ void SessionRenewWatchesLocked(XenStoreSession *session) {
     ExReleaseFastMutex(&session->WatchMapLock);
 }
 
-void ResumeSessionLocked(XENIFACE_FDO *fdoData, 
+void ResumeSessionLocked(XENIFACE_FDO *fdoData,
                          XenStoreSession *session) {
     SessionRenewWatchesLocked(session);
 }
@@ -1310,40 +1310,40 @@ void SessionsResumeAll(XENIFACE_FDO *fdoData) {
 NTSTATUS
 WmiInit(
         PXENIFACE_FDO FdoData
-    ) 
+    )
 {
     NTSTATUS status = STATUS_SUCCESS;
     XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__);
     XenIfaceDebugPrint(INFO,"DRV: XenIface WMI Initialisation\n");
-   
-    
 
 
-	IoWMISuggestInstanceName(FdoData->PhysicalDeviceObject, NULL, FALSE, 
-                                &FdoData->SuggestedInstanceName);
+
+
+    IoWMISuggestInstanceName(FdoData->PhysicalDeviceObject, NULL, FALSE,
+                             &FdoData->SuggestedInstanceName);
     InitializeListHead(&FdoData->SessionHead);
     FdoData->Sessions = 0;
     ExInitializeFastMutex(&FdoData->SessionLock);
-    
+
     status = IoWMIRegistrationControl(FdoData->Dx->DeviceObject, WMIREG_ACTION_REGISTER);
     FdoData->WmiReady = 1;
     return status;
 }
 
 NTSTATUS
-WmiFinalise(       
+WmiFinalise(
     PXENIFACE_FDO FdoData
-    ) 
+    )
 {
     NTSTATUS status = STATUS_SUCCESS;
-    if (FdoData->WmiReady) { 
+    if (FdoData->WmiReady) {
         XenIfaceDebugPrint(INFO,"DRV: XenIface WMI Finalisation\n");
         XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__);
         SessionsRemoveAll(FdoData);
 
         status =IoWMIRegistrationControl(FdoData->Dx->DeviceObject, WMIREG_ACTION_DEREGISTER);
-		RtlFreeUnicodeString(&FdoData->SuggestedInstanceName);
-		RtlZeroBytes(&FdoData->SuggestedInstanceName, sizeof(UNICODE_STRING));
+        RtlFreeUnicodeString(&FdoData->SuggestedInstanceName);
+        RtlZeroBytes(&FdoData->SuggestedInstanceName, sizeof(UNICODE_STRING));
 
         FdoData->WmiReady = 0;
     }
@@ -1468,7 +1468,7 @@ SessionExecuteRemoveValue(UCHAR *InBuffer,
     }
 
     status = GetCountedUTF8String(&pathname, upathname);
-    if (!NT_SUCCESS(status)) 
+    if (!NT_SUCCESS(status))
         return status;
 
     status = STATUS_INSUFFICIENT_RESOURCES;
@@ -1478,7 +1478,7 @@ SessionExecuteRemoveValue(UCHAR *InBuffer,
     }
     RtlZeroMemory(tmpbuffer, pathname->Length+1);
     RtlCopyBytes(tmpbuffer,pathname->Buffer, pathname->Length);
-    
+
     status = STATUS_WMI_INSTANCE_NOT_FOUND;
     if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
             NULL){
@@ -1524,7 +1524,7 @@ SessionExecuteRemoveWatch(UCHAR *InBuffer,
     }
 
 
-    XenIfaceDebugPrint(TRACE, "Find Watch\n"); 
+    XenIfaceDebugPrint(TRACE, "Find Watch\n");
 
     watch = SessionFindWatchLocked(session, &unicpath_notbacked);
 
@@ -1533,7 +1533,7 @@ SessionExecuteRemoveWatch(UCHAR *InBuffer,
         SessionRemoveWatchLocked(session, watch);
     }
     else {
-        XenIfaceDebugPrint(WARNING, "No Watch\n"); 
+        XenIfaceDebugPrint(WARNING, "No Watch\n");
     }
 #pragma prefast (suppress:26110)
     ExReleaseFastMutex(&session->WatchMapLock);
@@ -1541,7 +1541,7 @@ SessionExecuteRemoveWatch(UCHAR *InBuffer,
 
     *byteswritten=0;
 
- 
+
 
     return STATUS_SUCCESS;
 
@@ -1586,11 +1586,11 @@ SessionExecuteSetWatch(UCHAR *InBuffer,
         FreeUnicodeStringBuffer(&unicpath_backed);
         return status;
     }
-    
+
 
     *byteswritten=0;
 
- 
+
 
     return STATUS_SUCCESS;
 
@@ -1604,7 +1604,7 @@ SessionExecuteEndSession(UCHAR *InBuffer,
                             UNICODE_STRING *instance,
                             OUT ULONG_PTR *byteswritten) {
     XenStoreSession *session;
-    XenIfaceDebugPrint(TRACE, "ExecuteEndSession\n"); 
+    XenIfaceDebugPrint(TRACE, "ExecuteEndSession\n");
     *byteswritten = 0;
     if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
             NULL){
@@ -1633,7 +1633,7 @@ SessionExecuteSetValue(UCHAR *InBuffer,
     char *tmppath;
     char* tmpvalue;
 
-    XenIfaceDebugPrint(TRACE, " Try to write\n"); 
+    XenIfaceDebugPrint(TRACE, " Try to write\n");
     if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
                             WMI_STRING, &upathname,
                             WMI_STRING, &uvalue,
@@ -1643,10 +1643,10 @@ SessionExecuteSetValue(UCHAR *InBuffer,
         return STATUS_INSUFFICIENT_RESOURCES;
     }
     status = GetCountedUTF8String(&pathname, upathname);
-    if (!NT_SUCCESS(status)) 
+    if (!NT_SUCCESS(status))
         return status;
 
-	status = STATUS_INSUFFICIENT_RESOURCES;
+    status = STATUS_INSUFFICIENT_RESOURCES;
     tmppath = ExAllocatePoolWithTag(NonPagedPool, pathname->Length+1, 'XenP');
     if (!tmppath) {
         goto fail1;
@@ -1654,7 +1654,7 @@ SessionExecuteSetValue(UCHAR *InBuffer,
     RtlZeroMemory(tmppath, pathname->Length+1);
     RtlCopyBytes(tmppath,pathname->Buffer, pathname->Length);
     status = GetCountedUTF8String(&value, uvalue);
-    if (!NT_SUCCESS(status)){ 
+    if (!NT_SUCCESS(status)){
         goto fail2;
     }
     status = STATUS_INSUFFICIENT_RESOURCES;
@@ -1664,14 +1664,14 @@ SessionExecuteSetValue(UCHAR *InBuffer,
     }
     RtlZeroMemory(tmpvalue, value->Length+1);
     RtlCopyBytes(tmpvalue,value->Buffer, value->Length);
-	
+
     status = STATUS_WMI_INSTANCE_NOT_FOUND;
     if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
             NULL){
         goto fail4;
     }
     status = XENBUS_STORE(Printf, &fdoData->StoreInterface, session->transaction, NULL, tmppath, tmpvalue);
-    XenIfaceDebugPrint(TRACE, " Write %s to %s (%p)\n", tmpvalue, tmppath, status); 
+    XenIfaceDebugPrint(TRACE, " Write %s to %s (%p)\n", tmpvalue, tmppath, status);
     UnlockSessions(fdoData);
 
 fail4:
@@ -1685,10 +1685,10 @@ fail2:
 
 fail1:
     FreeUTF8String(pathname);
-  
+
     *byteswritten = 0;
     return status;
-    
+
 }
 NTSTATUS
 SessionExecuteGetFirstChild(UCHAR *InBuffer,
@@ -1708,16 +1708,16 @@ SessionExecuteGetFirstChild(UCHAR *InBuffer,
     XenStoreSession *session;
     char *tmppath;
     if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
-                            WMI_STRING, &uloc, 
+                            WMI_STRING, &uloc,
                             WMI_DONE)){
         return  STATUS_INVALID_DEVICE_REQUEST;
     }
     if (!fdoData->InterfacesAcquired) {
         return STATUS_INSUFFICIENT_RESOURCES;
     }
-        
+
     status = GetCountedUTF8String(&path, uloc);
-                
+
     if (!NT_SUCCESS(status)) {
         return status;
     }
@@ -1737,7 +1737,7 @@ SessionExecuteGetFirstChild(UCHAR *InBuffer,
     }
     status = XENBUS_STORE(Directory,&fdoData->StoreInterface, session->transaction, NULL, tmppath, &listresults);
     UnlockSessions(fdoData);
-                        
+
     if (!NT_SUCCESS(status)) {
         goto fail2;
     }
@@ -1755,14 +1755,14 @@ SessionExecuteGetFirstChild(UCHAR *InBuffer,
     else {
         stringarraysize+=GetCountedUtf8Size("");
     }
-    
+
     status = STATUS_BUFFER_TOO_SMALL;
     if (!AccessWmiBuffer(InBuffer, FALSE, &RequiredSize, OutBufferSize,
                             WMI_STRING, stringarraysize, &valuepos,
                             WMI_DONE)){
         goto fail3;
     }
-    
+
     status = STATUS_SUCCESS;
     if ((listresults != NULL) && (listresults[0] != 0)) {
         PSTR fullpath;
@@ -1770,8 +1770,8 @@ SessionExecuteGetFirstChild(UCHAR *InBuffer,
             fullpath = Xmasprintf("/%s", listresults);
         }
         else {
-            fullpath = Xmasprintf("%s/%s", 
-                                    path->Buffer, listresults); 
+            fullpath = Xmasprintf("%s/%s",
+                                    path->Buffer, listresults);
         }
 
         if (fullpath == NULL) {
@@ -1826,16 +1826,16 @@ SessionExecuteGetNextSibling(UCHAR *InBuffer,
     int leafoffset;
     char *attemptstring;
     if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
-                            WMI_STRING, &uloc, 
+                            WMI_STRING, &uloc,
                             WMI_DONE)){
         return  STATUS_INVALID_DEVICE_REQUEST;
     }
     if (!fdoData->InterfacesAcquired) {
         return STATUS_INSUFFICIENT_RESOURCES;
     }
-        
+
     status = GetCountedUTF8String(&path, uloc);
-                
+
     if (!NT_SUCCESS(status)) {
         return status;
     }
@@ -1858,7 +1858,7 @@ SessionExecuteGetNextSibling(UCHAR *InBuffer,
             NULL){
         goto fail3;
     }
-    
+
     leafoffset = 0;
     if (path->Length>1) {
         leafoffset = path->Length;
@@ -1884,14 +1884,14 @@ SessionExecuteGetNextSibling(UCHAR *InBuffer,
 
     status = XENBUS_STORE(Directory,&fdoData->StoreInterface, session->transaction, NULL, tmppath, &listresults);
     UnlockSessions(fdoData);
-                        
+
     if (!NT_SUCCESS(status)) {
         goto fail3;
     }
 
     stringarraysize = 0;
     RtlInitAnsiString(&checkleaf, tmpleaf);
-    
+
     nextresult = listresults;
 
     while (*nextresult != 0) {
@@ -1928,14 +1928,14 @@ SessionExecuteGetNextSibling(UCHAR *InBuffer,
     else {
         stringarraysize+=GetCountedUtf8Size("");
     }
-    
+
     status = STATUS_BUFFER_TOO_SMALL;
     if (!AccessWmiBuffer(InBuffer, FALSE, &RequiredSize, OutBufferSize,
                             WMI_STRING, stringarraysize, &valuepos,
                             WMI_DONE)){
         goto fail4;
     }
-    
+
     status = STATUS_SUCCESS;
     if (attemptstring != NULL) {
         PSTR fullpath;
@@ -1943,8 +1943,8 @@ SessionExecuteGetNextSibling(UCHAR *InBuffer,
             fullpath = Xmasprintf("/%s", attemptstring);
         }
         else {
-            fullpath = Xmasprintf("%s/%s", 
-                                    tmppath, attemptstring); 
+            fullpath = Xmasprintf("%s/%s",
+                                    tmppath, attemptstring);
         }
 
         if (fullpath == NULL) {
@@ -1969,7 +1969,7 @@ fail3:
     ExFreePool(tmpleaf);
 
 fail2:
-	ExFreePool(tmppath);
+    ExFreePool(tmppath);
 
 fail1:
     FreeUTF8String(path);
@@ -1999,16 +1999,16 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
     XenStoreSession *session;
     char *tmppath;
     if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
-                            WMI_STRING, &uloc, 
+                            WMI_STRING, &uloc,
                             WMI_DONE)){
         return  STATUS_INVALID_DEVICE_REQUEST;
     }
     if (!fdoData->InterfacesAcquired) {
         return STATUS_INSUFFICIENT_RESOURCES;
     }
-        
+
     status = GetCountedUTF8String(&path, uloc);
-                
+
     if (!NT_SUCCESS(status)) {
         return status;
     }
@@ -2028,7 +2028,7 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
     }
     status = XENBUS_STORE(Directory,&fdoData->StoreInterface,session->transaction,NULL, tmppath, &listresults);
     UnlockSessions(fdoData);
-                        
+
     if (!NT_SUCCESS(status)) {
         goto fail2;
     }
@@ -2046,8 +2046,8 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
         stringarraysize+=GetCountedUtf8Size(nextresults);
         for (;*nextresults!=0;nextresults++);
         nextresults++;
-    } 
-                
+    }
+
     status = STATUS_BUFFER_TOO_SMALL;
     if (!AccessWmiBuffer(InBuffer, FALSE, &RequiredSize, OutBufferSize,
                             WMI_UINT32, &noofnodes,
@@ -2065,8 +2065,8 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
             fullpath = Xmasprintf("/%s", nextresults);
         }
         else {
-            fullpath = Xmasprintf("%s/%s", 
-                                    path->Buffer, nextresults); 
+            fullpath = Xmasprintf("%s/%s",
+                                    path->Buffer, nextresults);
         }
 
         if (fullpath == NULL) {
@@ -2113,13 +2113,13 @@ SessionExecuteLog(UCHAR *InBuffer,
     NTSTATUS status;
     ANSI_STRING message;
     if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
-                                            WMI_STRING, &uloc, 
+                                            WMI_STRING, &uloc,
                                             WMI_DONE))
         return STATUS_INVALID_DEVICE_REQUEST;
 
     status = GetCountedAnsiString(&message, uloc);
 
-    if (!NT_SUCCESS(status)) 
+    if (!NT_SUCCESS(status))
         return status;
 
     XenIfaceDebugPrint(INFO,"USER: %s\n", message.Buffer);
@@ -2141,7 +2141,7 @@ SessionExecuteStartTransaction(UCHAR *InBuffer,
 
     NTSTATUS status = STATUS_SUCCESS;
     XenStoreSession *session;
-    
+
     if (!fdoData->InterfacesAcquired) {
         status= STATUS_INSUFFICIENT_RESOURCES;
         goto failnotinitialised;
@@ -2158,7 +2158,7 @@ SessionExecuteStartTransaction(UCHAR *InBuffer,
     }
 
     XENBUS_STORE(TransactionStart, &fdoData->StoreInterface, &session->transaction);
-    
+
 
 failtransactionactive:
     UnlockSessions(fdoData);
@@ -2180,7 +2180,7 @@ SessionExecuteCommitTransaction(UCHAR *InBuffer,
 
     NTSTATUS status = STATUS_SUCCESS;
     XenStoreSession *session;
-    
+
     if (!fdoData->InterfacesAcquired) {
         status= STATUS_INSUFFICIENT_RESOURCES;
         goto failnotinitialised;
@@ -2197,7 +2197,7 @@ SessionExecuteCommitTransaction(UCHAR *InBuffer,
     }
 
     status = XENBUS_STORE(TransactionEnd,&fdoData->StoreInterface, session->transaction, TRUE);
-    
+
     session->transaction = NULL;
 
 failtransactionnotactive:
@@ -2220,7 +2220,7 @@ SessionExecuteAbortTransaction(UCHAR *InBuffer,
 
     NTSTATUS status = STATUS_SUCCESS;
     XenStoreSession *session;
-    
+
     if (!fdoData->InterfacesAcquired) {
         status= STATUS_INSUFFICIENT_RESOURCES;
         goto failnotinitialised;
@@ -2237,7 +2237,7 @@ SessionExecuteAbortTransaction(UCHAR *InBuffer,
     }
 
     status = XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface, session->transaction, FALSE);
-    
+
     session->transaction = NULL;
 
 failtransactionnotactive:
@@ -2269,18 +2269,18 @@ SessionExecuteGetValue(UCHAR *InBuffer,
 
     *byteswritten = 0;
     if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
-                                            WMI_STRING, &uloc, 
+                                            WMI_STRING, &uloc,
                                             WMI_DONE))
         return STATUS_INVALID_DEVICE_REQUEST;
     if (!fdoData->InterfacesAcquired) {
         return STATUS_INSUFFICIENT_RESOURCES;
     }
-        
+
     status = GetCountedUTF8String(&path, uloc);
-                
-    if (!NT_SUCCESS(status)) 
+
+    if (!NT_SUCCESS(status))
         return status;;
-    
+
     status = STATUS_INSUFFICIENT_RESOURCES;
     tmppath = ExAllocatePoolWithTag(NonPagedPool,path->Length+1,'XenP');
     if (!tmppath) {
@@ -2288,7 +2288,7 @@ SessionExecuteGetValue(UCHAR *InBuffer,
     }
     RtlZeroMemory(tmppath, path->Length+1);
     RtlCopyBytes(tmppath,path->Buffer, path->Length);
-    
+
 
     status = STATUS_WMI_INSTANCE_NOT_FOUND;
     if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
@@ -2297,10 +2297,10 @@ SessionExecuteGetValue(UCHAR *InBuffer,
     }
     status = XENBUS_STORE(Read, &fdoData->StoreInterface, session->transaction, NULL, tmppath, &value);
     UnlockSessions(fdoData);
-                
-    if (!NT_SUCCESS(status)) 
+
+    if (!NT_SUCCESS(status))
         goto fail2;
-   
+
     status = STATUS_BUFFER_TOO_SMALL;
     if (!AccessWmiBuffer(OutBuffer, FALSE, &RequiredSize, OutBufferSize,
                             WMI_STRING, GetCountedUtf8Size(value), &valuepos,
@@ -2335,7 +2335,7 @@ BaseExecuteAddSession(UCHAR *InBuffer,
     NTSTATUS status;
     *byteswritten = 0;
     if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
-                            WMI_STRING, &stringid, 
+                            WMI_STRING, &stringid,
                             WMI_DONE)){
         return STATUS_INVALID_DEVICE_REQUEST;
     }
@@ -2345,12 +2345,12 @@ BaseExecuteAddSession(UCHAR *InBuffer,
         *byteswritten = RequiredSize;
         return STATUS_BUFFER_TOO_SMALL;
     }
-    
+
     AllocUnicodeStringBuffer(&ustring, *(USHORT*)(stringid));
     if (ustring.Buffer == NULL)
         return STATUS_INSUFFICIENT_RESOURCES;
     status = RtlUnicodeStringCbCopyStringN(&ustring,
-                                            (LPCWSTR)(stringid+sizeof(USHORT)), 
+                                            (LPCWSTR)(stringid+sizeof(USHORT)),
                                             *(USHORT*)(stringid));
     if (!NT_SUCCESS(status)) {
         FreeUnicodeStringBuffer(&ustring);
@@ -2368,7 +2368,7 @@ BaseExecuteAddSession(UCHAR *InBuffer,
 }
 
 
-NTSTATUS 
+NTSTATUS
 SessionExecuteMethod(UCHAR *Buffer,
                     ULONG BufferSize,
                     XENIFACE_FDO* fdoData,
@@ -2397,115 +2397,115 @@ SessionExecuteMethod(UCHAR *Buffer,
         return STATUS_INVALID_DEVICE_REQUEST;
     }
 
-    InBuffer = Buffer + Method->DataBlockOffset; 
+    InBuffer = Buffer + Method->DataBlockOffset;
 
     GetCountedUnicodeString(&instance, InstStr);
 
-    
+
     XenIfaceDebugPrint(TRACE,"Method Id %d\n", Method->MethodId);
     switch (Method->MethodId) {
-        case GetValue: 
-            status = SessionExecuteGetValue(InBuffer, Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+        case GetValue:
+            status = SessionExecuteGetValue(InBuffer, Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
-        case SetValue: 
-            status = SessionExecuteSetValue(InBuffer, Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+        case SetValue:
+            status = SessionExecuteSetValue(InBuffer, Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
-        case GetChildren: 
-            status = SessionExecuteGetChildren(InBuffer, Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+        case GetChildren:
+            status = SessionExecuteGetChildren(InBuffer, Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
-        case SetWatch: 
-            status = SessionExecuteSetWatch(InBuffer, Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+        case SetWatch:
+            status = SessionExecuteSetWatch(InBuffer, Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
         case EndSession:
-            status = SessionExecuteEndSession(InBuffer, Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+            status = SessionExecuteEndSession(InBuffer, Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
-        case RemoveWatch: 
-            status = SessionExecuteRemoveWatch(InBuffer, Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+        case RemoveWatch:
+            status = SessionExecuteRemoveWatch(InBuffer, Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
-        case RemoveValue: 
-            status = SessionExecuteRemoveValue(InBuffer, Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+        case RemoveValue:
+            status = SessionExecuteRemoveValue(InBuffer, Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
         case Log:
-            status = SessionExecuteLog(InBuffer,  Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+            status = SessionExecuteLog(InBuffer,  Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
-        case StartTransaction: 
-            status = SessionExecuteStartTransaction(InBuffer,  Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+        case StartTransaction:
+            status = SessionExecuteStartTransaction(InBuffer,  Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
         case CommitTransaction:
-            status = SessionExecuteCommitTransaction(InBuffer,  Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+            status = SessionExecuteCommitTransaction(InBuffer,  Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
         case AbortTransaction:
-            status = SessionExecuteAbortTransaction(InBuffer,  Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+            status = SessionExecuteAbortTransaction(InBuffer,  Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
         case GetFirstChild:
-            status = SessionExecuteGetFirstChild(InBuffer,  Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+            status = SessionExecuteGetFirstChild(InBuffer,  Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
         case GetNextSibling:
-            status = SessionExecuteGetNextSibling(InBuffer,  Method->SizeDataBlock,  
-                                              Buffer+Method->DataBlockOffset, 
-                                              BufferSize-Method->DataBlockOffset, 
+            status = SessionExecuteGetNextSibling(InBuffer,  Method->SizeDataBlock,
+                                              Buffer+Method->DataBlockOffset,
+                                              BufferSize-Method->DataBlockOffset,
                                               fdoData,
-                                              &instance, 
+                                              &instance,
                                               byteswritten);
             break;
 
@@ -2519,11 +2519,11 @@ SessionExecuteMethod(UCHAR *Buffer,
     if (status == STATUS_BUFFER_TOO_SMALL) {
         return NodeTooSmall(Buffer, BufferSize, (ULONG)*byteswritten, byteswritten);
     }
-            
+
     Method->WnodeHeader.BufferSize = (ULONG)*byteswritten;
      return status;
 }
-NTSTATUS 
+NTSTATUS
 BaseExecuteMethod(UCHAR *Buffer,
                     ULONG BufferSize,
                     XENIFACE_FDO* fdoData,
@@ -2540,14 +2540,14 @@ BaseExecuteMethod(UCHAR *Buffer,
         return STATUS_INVALID_DEVICE_REQUEST;
     }
 
-    InBuffer = Buffer + Method->DataBlockOffset; 
+    InBuffer = Buffer + Method->DataBlockOffset;
 
     switch (Method->MethodId) {
-        case AddSession: 
-            status = BaseExecuteAddSession(InBuffer, Method->SizeDataBlock,  
-                                             Buffer+Method->DataBlockOffset, 
-                                             BufferSize-Method->DataBlockOffset, 
-                                             fdoData, 
+        case AddSession:
+            status = BaseExecuteAddSession(InBuffer, Method->SizeDataBlock,
+                                             Buffer+Method->DataBlockOffset,
+                                             BufferSize-Method->DataBlockOffset,
+                                             fdoData,
                                              byteswritten);
             Method->SizeDataBlock = (ULONG)*byteswritten;
             *byteswritten+=Method->DataBlockOffset;
@@ -2569,16 +2569,16 @@ WmiExecuteMethod(
     if (IsEqualGUID(stack->Parameters.WMI.DataPath,
                     &OBJECT_GUID(XenStoreBase))) {
         return BaseExecuteMethod(stack->Parameters.WMI.Buffer,
-                                    stack->Parameters.WMI.BufferSize,  
+                                    stack->Parameters.WMI.BufferSize,
                                     fdoData,  byteswritten);
     }
     else if (IsEqualGUID(stack->Parameters.WMI.DataPath,
                          &OBJECT_GUID(XenStoreSession))) {
         return SessionExecuteMethod(stack->Parameters.WMI.Buffer,
-                                    stack->Parameters.WMI.BufferSize,  
+                                    stack->Parameters.WMI.BufferSize,
                                     fdoData,  byteswritten);
     }
-    
+
     else
         return STATUS_NOT_SUPPORTED;
 }
@@ -2598,7 +2598,7 @@ GenerateSessionBlock(UCHAR *Buffer,
     ULONG* nameoffsets;
     UCHAR *data;
     UCHAR *names;
-    
+
 
     LockSessions(fdoData);
 
@@ -2615,14 +2615,14 @@ GenerateSessionBlock(UCHAR *Buffer,
 
         AccessWmiBuffer((PUCHAR)nodesizerequired, FALSE, &RequiredSize, 0,
                         WMI_UINT32, &id,
-                        WMI_STRING, 
-                            GetCountedUnicodeStringSize(&session->stringid), 
+                        WMI_STRING,
+                            GetCountedUnicodeStringSize(&session->stringid),
                             &sesbuf,
                         WMI_DONE);
         nodesizerequired += RequiredSize;
-        
+
         AccessWmiBuffer((PUCHAR)namesizerequired, FALSE, &RequiredSize, 0,
-                        WMI_STRING, 
+                        WMI_STRING,
                             GetCountedUnicodeStringSize(&session->instancename),
                             &inamebuf,
                         WMI_DONE);
@@ -2630,7 +2630,7 @@ GenerateSessionBlock(UCHAR *Buffer,
         entries++;
         session = (XenStoreSession *)session->listentry.Flink;
     }
-    
+
     //perform the access check
     if (!AccessWmiBuffer(Buffer, FALSE, &RequiredSize, BufferSize,
                             WMI_BUFFER, sizeof(WNODE_ALL_DATA), &node,
@@ -2665,21 +2665,21 @@ GenerateSessionBlock(UCHAR *Buffer,
 
             AccessWmiBuffer(datapos, FALSE, &RequiredSize, BufferSize+Buffer-datapos,
                             WMI_UINT32, &id,
-                            WMI_STRING, 
-                                GetCountedUnicodeStringSize(&session->stringid), 
+                            WMI_STRING,
+                                GetCountedUnicodeStringSize(&session->stringid),
                                 &sesbuf,
                             WMI_DONE);
 
-            node->OffsetInstanceDataAndLength[entrynum].OffsetInstanceData = 
+            node->OffsetInstanceDataAndLength[entrynum].OffsetInstanceData =
                 (ULONG)((UCHAR *)id - Buffer);
-            node->OffsetInstanceDataAndLength[entrynum].LengthInstanceData = 
+            node->OffsetInstanceDataAndLength[entrynum].LengthInstanceData =
                 RequiredSize;
             *id = session->id;
             WriteCountedUnicodeString(&session->stringid, sesbuf);
             datapos+=RequiredSize;
 
             AccessWmiBuffer(namepos, FALSE, &RequiredSize, BufferSize+Buffer-namepos,
-                            WMI_STRING, 
+                            WMI_STRING,
                                 GetCountedUnicodeStringSize(&session->instancename),
                                 &inamebuf,
                             WMI_DONE);
@@ -2773,8 +2773,8 @@ GenerateBaseInstance(
     else {
         *time = 0;
     }
-   
-    
+
+
     node->WnodeHeader.BufferSize = node->DataBlockOffset+RequiredSize;
     node->SizeDataBlock = RequiredSize;
 
@@ -2796,7 +2796,7 @@ GenerateSessionInstance(UCHAR *Buffer,
     ULONG* id;
     XenStoreSession *session;
     UCHAR *sesbuf;
-    
+
     if (!AccessWmiBuffer(Buffer, TRUE, &RequiredSize, BufferSize,
                             WMI_BUFFER, sizeof(WNODE_SINGLE_INSTANCE), &node,
                             WMI_DONE))
@@ -2805,7 +2805,7 @@ GenerateSessionInstance(UCHAR *Buffer,
     }
     if (!AccessWmiBuffer(Buffer, TRUE, &RequiredSize, BufferSize,
                             WMI_BUFFER, sizeof(WNODE_SINGLE_INSTANCE), &node,
-                            WMI_STRINGOFFSET, node->OffsetInstanceName, &InstStr, 
+                            WMI_STRINGOFFSET, node->OffsetInstanceName, &InstStr,
                             WMI_OFFSET, node->DataBlockOffset, 0, &dbo,
                             WMI_DONE))
     {
@@ -2818,10 +2818,10 @@ GenerateSessionInstance(UCHAR *Buffer,
         UnlockSessions(fdoData);
         return STATUS_WMI_INSTANCE_NOT_FOUND;
     }
-    
+
     if (!AccessWmiBuffer(dbo, FALSE, &RequiredSize, BufferSize-node->DataBlockOffset,
                             WMI_UINT32, &id,
-                            WMI_STRING, 
+                            WMI_STRING,
                                 GetCountedUnicodeStringSize(&session->stringid),
                                 &sesbuf,
                             WMI_DONE)) {
@@ -2837,7 +2837,7 @@ GenerateSessionInstance(UCHAR *Buffer,
     node->WnodeHeader.BufferSize = node->DataBlockOffset + RequiredSize;
     *byteswritten = node->DataBlockOffset + RequiredSize;
 
-    
+
 
 
     return STATUS_SUCCESS;
@@ -2851,17 +2851,17 @@ WmiQueryAllData(
     OUT ULONG_PTR *byteswritten
    )
 {
-  
-    if (IsEqualGUID(stack->Parameters.WMI.DataPath, 
+
+    if (IsEqualGUID(stack->Parameters.WMI.DataPath,
                     &OBJECT_GUID(XenStoreBase))) {
         return GenerateBaseBlock(   fdoData,
-                                    stack->Parameters.WMI.Buffer, 
+                                    stack->Parameters.WMI.Buffer,
                                     stack->Parameters.WMI.BufferSize,
                                     byteswritten);
     }
-    else if (IsEqualGUID(stack->Parameters.WMI.DataPath, 
+    else if (IsEqualGUID(stack->Parameters.WMI.DataPath,
                          &OBJECT_GUID(XenStoreSession))) {
-        return GenerateSessionBlock(stack->Parameters.WMI.Buffer, 
+        return GenerateSessionBlock(stack->Parameters.WMI.Buffer,
                                     stack->Parameters.WMI.BufferSize,
                                     fdoData,
                                     byteswritten);
@@ -2882,13 +2882,13 @@ WmiQuerySingleInstance(
     if (IsEqualGUID(stack->Parameters.WMI.DataPath,
                     &OBJECT_GUID(XenStoreBase))) {
         return GenerateBaseInstance(fdoData,
-                                    stack->Parameters.WMI.Buffer, 
+                                    stack->Parameters.WMI.Buffer,
                                     stack->Parameters.WMI.BufferSize,
                                     byteswritten);
     }
     else if (IsEqualGUID(stack->Parameters.WMI.DataPath,
                          &OBJECT_GUID(XenStoreSession))) {
-        return GenerateSessionInstance(stack->Parameters.WMI.Buffer, 
+        return GenerateSessionInstance(stack->Parameters.WMI.Buffer,
                                     stack->Parameters.WMI.BufferSize,
                                     fdoData,
                                     byteswritten);
@@ -2913,7 +2913,7 @@ WmiRegInfo(
     ULONG RequiredSize;
     int entries = 4;
     const static UNICODE_STRING mofname = RTL_CONSTANT_STRING(L"XENIFACEMOF");
-    
+
     size_t mofnamesz;
 
 
@@ -2927,12 +2927,12 @@ WmiRegInfo(
         mofnamesz = 0;
     }
     if(!AccessWmiBuffer(stack->Parameters.WMI.Buffer, FALSE,
-                        &RequiredSize, 
+                        &RequiredSize,
                         stack->Parameters.WMI.BufferSize,
                         WMI_BUFFER, sizeof(WMIREGINFO), (UCHAR **)&reginfo,
                         WMI_BUFFER, entries * sizeof(WMIREGGUID), (UCHAR **)&guiddata,
                         WMI_STRING, mofnamesz, &mofnameptr,
-                        WMI_STRING, DriverParameters.RegistryPath.Length+sizeof(USHORT), 
+                        WMI_STRING, DriverParameters.RegistryPath.Length+sizeof(USHORT),
                                     &regpath,
                         WMI_DONE)){
         reginfo->BufferSize = RequiredSize;
@@ -2940,7 +2940,7 @@ WmiRegInfo(
         return STATUS_BUFFER_TOO_SMALL;
 
     }
-    if (stack->Parameters.WMI.DataPath == WMIREGISTER) {    
+    if (stack->Parameters.WMI.DataPath == WMIREGISTER) {
         reginfo->MofResourceName = (ULONG)((ULONG_PTR)mofnameptr - (ULONG_PTR)reginfo);
         WriteCountedUnicodeString(&mofname, mofnameptr);
         reginfo->RegistryPath = (ULONG)((ULONG_PTR)regpath - (ULONG_PTR)reginfo);
@@ -2955,28 +2955,28 @@ WmiRegInfo(
     guid->InstanceCount = 1;
     guid->Guid = OBJECT_GUID(XenStoreBase);
     guid->Flags = WMIREG_FLAG_INSTANCE_PDO;
-    guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject; 
-	ObReferenceObject(fdoData->PhysicalDeviceObject);
-    
+    guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject;
+    ObReferenceObject(fdoData->PhysicalDeviceObject);
+
     guid = &reginfo->WmiRegGuid[1];
     guid->Guid = OBJECT_GUID(XenStoreSession);
     guid->Flags =0;
-    
+
     guid = &reginfo->WmiRegGuid[2];
     guid->InstanceCount = 1;
     guid->Guid = OBJECT_GUID(XenStoreWatchEvent);
     guid->Flags = WMIREG_FLAG_INSTANCE_PDO |
                 WMIREG_FLAG_EVENT_ONLY_GUID ;
-    guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject; 
-	ObReferenceObject(fdoData->PhysicalDeviceObject);
+    guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject;
+    ObReferenceObject(fdoData->PhysicalDeviceObject);
 
     guid = &reginfo->WmiRegGuid[3];
     guid->InstanceCount = 1;
     guid->Guid = OBJECT_GUID(XenStoreUnsuspendedEvent);
     guid->Flags = WMIREG_FLAG_INSTANCE_PDO |
                 WMIREG_FLAG_EVENT_ONLY_GUID ;
-	guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject; 
-	ObReferenceObject(fdoData->PhysicalDeviceObject);
+    guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject;
+    ObReferenceObject(fdoData->PhysicalDeviceObject);
 
 
     *byteswritten = RequiredSize;
@@ -2990,7 +2990,7 @@ WmiRegInfoEx(
     OUT ULONG_PTR *byteswritten
    )
 {
-   
+
     XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__);
     return WmiRegInfo(fdoData, stack, byteswritten);
 }
@@ -3006,17 +3006,17 @@ WmiProcessMinorFunction(
     PIO_STACK_LOCATION stack;
     UCHAR MinorFunction;
 
-	
+
 
     stack = IoGetCurrentIrpStackLocation(Irp);
 
-	if (stack->Parameters.WMI.ProviderId != (ULONG_PTR)fdoData->Dx->DeviceObject) {
-		XenIfaceDebugPrint(TRACE,"ProviderID %p %p", stack->Parameters.WMI.ProviderId, fdoData->PhysicalDeviceObject);
-		return STATUS_NOT_SUPPORTED;
-	}
-	else {
-		XenIfaceDebugPrint(TRACE,"ProviderID Match %p %p", stack->Parameters.WMI.ProviderId, fdoData->PhysicalDeviceObject);
-	}
+    if (stack->Parameters.WMI.ProviderId != (ULONG_PTR)fdoData->Dx->DeviceObject) {
+        XenIfaceDebugPrint(TRACE,"ProviderID %p %p", stack->Parameters.WMI.ProviderId, fdoData->PhysicalDeviceObject);
+        return STATUS_NOT_SUPPORTED;
+    }
+    else {
+        XenIfaceDebugPrint(TRACE,"ProviderID Match %p %p", stack->Parameters.WMI.ProviderId, fdoData->PhysicalDeviceObject);
+    }
     MinorFunction = stack->MinorFunction;
 
     switch (MinorFunction)
@@ -3060,9 +3060,9 @@ NTSTATUS XenIfaceSystemControl(
     status = WmiProcessMinorFunction(fdoData, Irp);
 
     if (status != STATUS_NOT_SUPPORTED) {
-		Irp->IoStatus.Status = status;
+        Irp->IoStatus.Status = status;
         IoCompleteRequest(Irp, IO_NO_INCREMENT);
-        
+
     }
     else {
         IoSkipCurrentIrpStackLocation(Irp);
diff --git a/src/xeniface/wmi.h b/src/xeniface/wmi.h
index ed77af7..a49f1b3 100644
--- a/src/xeniface/wmi.h
+++ b/src/xeniface/wmi.h
@@ -60,15 +60,15 @@ NTSTATUS XenIfaceSystemControl(
     );
 
 void FireSuspendEvent(
-	IN OUT PXENIFACE_FDO fdoData
-	);
+    IN OUT PXENIFACE_FDO fdoData
+    );
 
 void SessionsResumeAll(
-	XENIFACE_FDO *fdoData
+    XENIFACE_FDO *fdoData
 );
 
 void SessionsSuspendAll(
-	XENIFACE_FDO *fdoData
+    XENIFACE_FDO *fdoData
 );
 
 #endif
-- 
1.8.1.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 Wed Oct 21 05:26:23 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 21 Oct 2015 05:26:23 +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 1Zolup-0007kU-Ff; Wed, 21 Oct 2015 05:26:23 +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 1Zoluo-0007kN-4L
	for win-pv-devel@lists.xenproject.org; Wed, 21 Oct 2015 05:26:22 +0000
Received: from [85.158.137.68] by server-4.bemta-3.messagelabs.com id
	13/8F-09570-DF127265; Wed, 21 Oct 2015 05:26:21 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-8.tower-31.messagelabs.com!1445405179!55126745!1
X-Originating-IP: [66.111.4.27]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjcgPT4gODQ2Mw==\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1612 invoked from network); 21 Oct 2015 05:26:20 -0000
Received: from out3-smtp.messagingengine.com (HELO
	out3-smtp.messagingengine.com) (66.111.4.27)
	by server-8.tower-31.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2015 05:26:20 -0000
Received: from compute5.internal (compute5.nyi.internal [10.202.2.45])
	by mailout.nyi.internal (Postfix) with ESMTP id 5023E204CA
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:26:19 -0400 (EDT)
Received: from frontend1 ([10.202.2.160])
	by compute5.internal (MEProxy); Wed, 21 Oct 2015 01:26:19 -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=c04wZXZwZG77x3MIsbUD5BAUiOc=; b=pemrMW
	R1+XIx0/tKtd3cx4wYBAMCM5XNskalYgEyd7cAMaPiVJ4zy5K51dzg4ZKS1Pyi4U
	HUzvsavE5pBYTQ0+F7tub4uYCK83zXWqe9WfV4eomtTZ36f+J94EOEU09eY+ToZO
	Dg2epL14QoqTMJKy5N0MuXVk06EJY/IoXeiM8=
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=c04wZXZwZG77x3MIsbUD5BAUiOc=; b=JTG80
	jfqOTPfBXqc4RUKYTvsSoDGx5hDXLPTEOyexKtlA7BBR4lbRXkh9Z+lJbyhUUVQL
	dtbVZWCqKCKBreqBXgAg0J3BZkLaMzBZUzjyRsW18/y2E1yb9lwIzkZMwSNEsHcO
	L66+tJGCLqvNjgz9mxZR4C/LHvzM19hiWhWQ6Q=
X-Sasl-enc: sjjJGtXkI6YYBlKfxV591lwVSaLKGqiDXq8QBPZ6z69W 1445405178
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 45BE8C00014
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:26:18 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <562721FB.3020901@invisiblethingslab.com>
Date: Wed, 21 Oct 2015 07:26:19 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 4/6] Define new IOCTLs for user-mode clients
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

IOCTL input is defined as XENIFACE_*_IN structs.
IOCTL output is defined as XENIFACE_*_OUT structs.

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 include/xeniface_ioctls.h | 279 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 278 insertions(+), 1 deletion(-)

diff --git a/include/xeniface_ioctls.h b/include/xeniface_ioctls.h
index 1367f67..6ad98d6 100644
--- a/include/xeniface_ioctls.h
+++ b/include/xeniface_ioctls.h
@@ -29,20 +29,297 @@
  * SUCH DAMAGE.
  */
 
+/*! \file xeniface_ioctls.h
+    \brief User-mode IOCTL interfaces to the XENIFACE driver
+*/
+
 #ifndef _XENIFACE_IOCTLS_H_
 #define _XENIFACE_IOCTLS_H_
 
+/*! \brief XENIFACE device GUID */
 DEFINE_GUID(GUID_INTERFACE_XENIFACE, \
     0xb2cfb085, 0xaa5e, 0x47e1, 0x8b, 0xf7, 0x97, 0x93, 0xf3, 0x15, 0x45, 0x65);
 
+/*! \brief Bitmask of XenStore key permissions */
+typedef enum _XENIFACE_STORE_PERMISSION_MASK {
+    XENIFACE_STORE_PERM_NONE  = 0, /*!< No access */
+    XENIFACE_STORE_PERM_READ  = 1, /*!< Read access */
+    XENIFACE_STORE_PERM_WRITE = 2, /*!< Write access */
+} XENIFACE_STORE_PERMISSION_MASK;
+
+/*! \brief XenStore key permissions entry for a single domain */
+typedef struct _XENIFACE_STORE_PERMISSION {
+    USHORT                         Domain; /*!< Target domain */
+    XENIFACE_STORE_PERMISSION_MASK Mask;   /*!< Permissions for the domain */
+} XENIFACE_STORE_PERMISSION, *PXENIFACE_STORE_PERMISSION;
+
+/*! \brief Bitmask of all available XenStore permission values */
+#define XENIFACE_STORE_ALLOWED_PERMISSIONS \
+    (XENIFACE_STORE_PERM_NONE | XENIFACE_STORE_PERM_READ | XENIFACE_STORE_PERM_WRITE)
+
+/*! \brief Read a value from XenStore
+
+    Input: NUL-terminated CHAR array containing the requested key's path
+
+    Output: NUL-terminated CHAR array containing the requested key's value
+*/
 #define IOCTL_XENIFACE_STORE_READ \
     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Write a value to XenStore
+
+    Input: NUL-terminated CHAR array containing the requested key's path,
+           NUL-terminated CHAR array containing the key's value,
+           final NUL terminator
+
+    Output: None
+*/
 #define IOCTL_XENIFACE_STORE_WRITE \
     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Enumerate all immediate child keys of a XenStore key
+
+    Input: NUL-terminated CHAR array containing the requested key's path
+
+    Output: List of NUL-terminated CHAR arrays containing the child key names,
+            followed by a NUL CHAR
+*/
 #define IOCTL_XENIFACE_STORE_DIRECTORY \
     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Remove a key from XenStore
+
+    Input: NUL-terminated CHAR array containing the requested key's path
+
+    Output: None
+*/
 #define IOCTL_XENIFACE_STORE_REMOVE \
     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
+/*! \brief Set permissions for a XenStore key
+
+    Input: XENIFACE_STORE_SET_PERMISSIONS_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_STORE_SET_PERMISSIONS \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_STORE_SET_PERMISSIONS */
+typedef struct _XENIFACE_STORE_SET_PERMISSIONS_IN {
+    PCHAR                     Path;                       /*!< NUL-terminated path to a XenStore key */
+    ULONG                     PathLength;                 /*!< Size of Path in bytes, including the NUL terminator */
+    ULONG                     NumberPermissions;          /*!< Number of permission entries */
+    XENIFACE_STORE_PERMISSION Permissions[ANYSIZE_ARRAY]; /*!< Permission entries */
+} XENIFACE_STORE_SET_PERMISSIONS_IN, *PXENIFACE_STORE_SET_PERMISSIONS_IN;
+
+/*! \brief Add a XenStore watch
+
+    Input: XENIFACE_STORE_ADD_WATCH_IN
+
+    Output: XENIFACE_STORE_ADD_WATCH_OUT
+*/
+#define IOCTL_XENIFACE_STORE_ADD_WATCH \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x805, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_STORE_ADD_WATCH */
+typedef struct _XENIFACE_STORE_ADD_WATCH_IN {
+    PCHAR  Path;       /*!< NUL-terminated path to a XenStore key */
+    ULONG  PathLength; /*!< Size of Path in bytes, including the NUL terminator */
+    HANDLE Event;      /*!< Handle to an event object that will be signaled when the watch fires */
+} XENIFACE_STORE_ADD_WATCH_IN, *PXENIFACE_STORE_ADD_WATCH_IN;
+
+/*! \brief Output for IOCTL_XENIFACE_STORE_ADD_WATCH */
+typedef struct _XENIFACE_STORE_ADD_WATCH_OUT {
+    PVOID Context; /*!< Handle to the watch */
+} XENIFACE_STORE_ADD_WATCH_OUT, *PXENIFACE_STORE_ADD_WATCH_OUT;
+
+/*! \brief Remove a XenStore watch
+
+    Input: XENIFACE_STORE_REMOVE_WATCH_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_STORE_REMOVE_WATCH \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x806, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_STORE_REMOVE_WATCH */
+typedef struct _XENIFACE_STORE_REMOVE_WATCH_IN {
+    PVOID Context; /*!< Handle to the watch */
+} XENIFACE_STORE_REMOVE_WATCH_IN, *PXENIFACE_STORE_REMOVE_WATCH_IN;
+
+/*! \brief Open an event channel that was already bound by a remote domain
+
+    Input: XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN
+
+    Output: XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT
+*/
+#define IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x810, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN */
+typedef struct _XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN {
+    USHORT  RemoteDomain; /*!< Remote domain that has already bound the channel */
+    ULONG   RemotePort;   /*!< Port number that is assigned to the event channel in the RemoteDomain */
+    BOOLEAN Mask;         /*!< Set to TRUE if the event channel should be initially masked */
+    HANDLE  Event;        /*!< Handle to an event object that will receive event channel notifications */
+} XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN, *PXENIFACE_EVTCHN_BIND_INTERDOMAIN_IN;
+
+/*! \brief Output for IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN */
+typedef struct _XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT {
+    ULONG LocalPort; /*!< Local port number that is assigned to the event channel */
+} XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT, *PXENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT;
+
+/*! \brief Open an unbound event channel
+
+    Input: XENIFACE_EVTCHN_BIND_UNBOUND_IN
+
+    Output: XENIFACE_EVTCHN_BIND_UNBOUND_OUT
+*/
+#define IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x811, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND */
+typedef struct _XENIFACE_EVTCHN_BIND_UNBOUND_IN {
+    USHORT  RemoteDomain; /*!< Remote domain that will bind the channel */
+    BOOLEAN Mask;         /*!< Set to TRUE if the event channel should be initially masked */
+    HANDLE  Event;        /*!< Handle to an event object that will receive event channel notifications */
+} XENIFACE_EVTCHN_BIND_UNBOUND_IN, *PXENIFACE_EVTCHN_BIND_UNBOUND_IN;
+
+/*! \brief Output for IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND */
+typedef struct _XENIFACE_EVTCHN_BIND_UNBOUND_OUT {
+    ULONG LocalPort; /*!< Local port number that is assigned to the event channel */
+} XENIFACE_EVTCHN_BIND_UNBOUND_OUT, *PXENIFACE_EVTCHN_BIND_UNBOUND_OUT;
+
+/*! \brief Close an event channel
+
+    Input: XENIFACE_EVTCHN_CLOSE_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_EVTCHN_CLOSE \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x812, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_EVTCHN_CLOSE */
+typedef struct _XENIFACE_EVTCHN_CLOSE_IN {
+    ULONG LocalPort; /*!< Local port number that is assigned to the event channel */
+} XENIFACE_EVTCHN_CLOSE_IN, *PXENIFACE_EVTCHN_CLOSE_IN;
+
+/*! \brief Notify the remote end of an event channel
+
+    Input: XENIFACE_EVTCHN_CLOSE_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_EVTCHN_NOTIFY \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x813, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_EVTCHN_NOTIFY */
+typedef struct _XENIFACE_EVTCHN_NOTIFY_IN {
+    ULONG LocalPort; /*!< Local port number that is assigned to the event channel */
+} XENIFACE_EVTCHN_NOTIFY_IN, *PXENIFACE_EVTCHN_NOTIFY_IN;
+
+/*! \brief Unmask an event channel
+
+    Input: XENIFACE_EVTCHN_CLOSE_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_EVTCHN_UNMASK \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x814, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_EVTCHN_UNMASK */
+typedef struct _XENIFACE_EVTCHN_UNMASK_IN {
+    ULONG LocalPort; /*!< Local port number that is assigned to the event channel */
+} XENIFACE_EVTCHN_UNMASK_IN, *PXENIFACE_EVTCHN_UNMASK_IN;
+
+/*! \brief Bitmask of XenStore key permissions */
+typedef enum _XENIFACE_GNTTAB_PAGE_FLAGS {
+    XENIFACE_GNTTAB_READONLY          = 1 << 0, /*!< If set, the granted/mapped pages are read-only */
+    XENIFACE_GNTTAB_USE_NOTIFY_OFFSET = 1 << 1, /*!< If set, the NotifyOffset member of the grant/map IOCTL input is used */
+    XENIFACE_GNTTAB_USE_NOTIFY_PORT   = 1 << 2, /*!< If set, the NotifyPort member of the grant/map IOCTL input is used */
+} XENIFACE_GNTTAB_PAGE_FLAGS;
+
+/*! \brief Grant permission to access local memory pages to a foreign domain
+    \note This IOCTL must be asynchronous. The driver doesn't complete the request
+          until the grant is explicitly revoked or the calling thread terminates.
+
+    Input: XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN
+
+    Output: XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT
+*/
+#define IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x820, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS */
+typedef struct _XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN {
+    ULONG                      RequestId;    /*!< A unique (for the calling process) number identifying the request */
+    USHORT                     RemoteDomain; /*!< Remote domain that is being granted access */
+    ULONG                      NumberPages;  /*!< Number of 4k pages to grant access to */
+    XENIFACE_GNTTAB_PAGE_FLAGS Flags;        /*!< Additional flags */
+    ULONG                      NotifyOffset; /*!< Offset of a byte in the granted region that will be set to 0 when the grant is revoked */
+    ULONG                      NotifyPort;   /*!< Local port number of an open event channel that will be notified when the grant is revoked */
+} XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN, *PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN;
+
+/*! \brief Output for IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS */
+typedef struct _XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT {
+    PVOID Address;                   /*!< User-mode address of the granted memory region */
+    ULONG References[ANYSIZE_ARRAY]; /*!< An array of Xen-assigned references for each granted page */
+} XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT, *PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT;
+
+/*! \brief Revoke a foreign domain access to previously granted memory region
+
+    Input: XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x821, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS */
+typedef struct _XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN {
+    ULONG RequestId; /*! Request ID used in the corresponding IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS call */
+} XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN, *PXENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN;
+
+/*! \brief Map a foreign memory region into the current address space
+    \note This IOCTL must be asynchronous. The driver doesn't complete the request
+          until the memory is explicitly unmapped or the calling thread terminates.
+
+    Input: XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN
+
+    Output: XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT
+*/
+#define IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x822, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES */
+typedef struct _XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN {
+    ULONG                      RequestId;                 /*!< A unique (for the calling process) number identifying the request */
+    USHORT                     RemoteDomain;              /*!< Remote domain that has granted access to the pages */
+    ULONG                      NumberPages;               /*!< Number of 4k pages to map */
+    XENIFACE_GNTTAB_PAGE_FLAGS Flags;                     /*!< Additional flags */
+    ULONG                      NotifyOffset;              /*!< Offset of a byte in the mapped region that will be set to 0 when the region is unmapped */
+    ULONG                      NotifyPort;                /*!< Local port number of an open event channel that will be notified when the region is unmapped */
+    ULONG                      References[ANYSIZE_ARRAY]; /*!< An array of Xen-assigned references for each granted page */
+} XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN, *PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN;
+
+/*! \brief Output for IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES */
+typedef struct _XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT {
+    PVOID Address; /*!< User-mode address of the mapped memory region */
+} XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT, *PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT;
+
+/*! \brief Unmap a foreign memory region from the current address space
+
+    Input: XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x823, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES */
+typedef struct _XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN {
+    ULONG RequestId; /*! Request ID used in the corresponding IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES call */
+} XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN, *PXENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN;
+
 #endif // _XENIFACE_IOCTLS_H_
-
-- 
1.8.1.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 Wed Oct 21 05:26:23 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 21 Oct 2015 05:26:23 +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 1Zolup-0007kU-Ff; Wed, 21 Oct 2015 05:26:23 +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 1Zoluo-0007kN-4L
	for win-pv-devel@lists.xenproject.org; Wed, 21 Oct 2015 05:26:22 +0000
Received: from [85.158.137.68] by server-4.bemta-3.messagelabs.com id
	13/8F-09570-DF127265; Wed, 21 Oct 2015 05:26:21 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-8.tower-31.messagelabs.com!1445405179!55126745!1
X-Originating-IP: [66.111.4.27]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjcgPT4gODQ2Mw==\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1612 invoked from network); 21 Oct 2015 05:26:20 -0000
Received: from out3-smtp.messagingengine.com (HELO
	out3-smtp.messagingengine.com) (66.111.4.27)
	by server-8.tower-31.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2015 05:26:20 -0000
Received: from compute5.internal (compute5.nyi.internal [10.202.2.45])
	by mailout.nyi.internal (Postfix) with ESMTP id 5023E204CA
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:26:19 -0400 (EDT)
Received: from frontend1 ([10.202.2.160])
	by compute5.internal (MEProxy); Wed, 21 Oct 2015 01:26:19 -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=c04wZXZwZG77x3MIsbUD5BAUiOc=; b=pemrMW
	R1+XIx0/tKtd3cx4wYBAMCM5XNskalYgEyd7cAMaPiVJ4zy5K51dzg4ZKS1Pyi4U
	HUzvsavE5pBYTQ0+F7tub4uYCK83zXWqe9WfV4eomtTZ36f+J94EOEU09eY+ToZO
	Dg2epL14QoqTMJKy5N0MuXVk06EJY/IoXeiM8=
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=c04wZXZwZG77x3MIsbUD5BAUiOc=; b=JTG80
	jfqOTPfBXqc4RUKYTvsSoDGx5hDXLPTEOyexKtlA7BBR4lbRXkh9Z+lJbyhUUVQL
	dtbVZWCqKCKBreqBXgAg0J3BZkLaMzBZUzjyRsW18/y2E1yb9lwIzkZMwSNEsHcO
	L66+tJGCLqvNjgz9mxZR4C/LHvzM19hiWhWQ6Q=
X-Sasl-enc: sjjJGtXkI6YYBlKfxV591lwVSaLKGqiDXq8QBPZ6z69W 1445405178
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 45BE8C00014
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:26:18 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <562721FB.3020901@invisiblethingslab.com>
Date: Wed, 21 Oct 2015 07:26:19 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 4/6] Define new IOCTLs for user-mode clients
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

IOCTL input is defined as XENIFACE_*_IN structs.
IOCTL output is defined as XENIFACE_*_OUT structs.

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 include/xeniface_ioctls.h | 279 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 278 insertions(+), 1 deletion(-)

diff --git a/include/xeniface_ioctls.h b/include/xeniface_ioctls.h
index 1367f67..6ad98d6 100644
--- a/include/xeniface_ioctls.h
+++ b/include/xeniface_ioctls.h
@@ -29,20 +29,297 @@
  * SUCH DAMAGE.
  */
 
+/*! \file xeniface_ioctls.h
+    \brief User-mode IOCTL interfaces to the XENIFACE driver
+*/
+
 #ifndef _XENIFACE_IOCTLS_H_
 #define _XENIFACE_IOCTLS_H_
 
+/*! \brief XENIFACE device GUID */
 DEFINE_GUID(GUID_INTERFACE_XENIFACE, \
     0xb2cfb085, 0xaa5e, 0x47e1, 0x8b, 0xf7, 0x97, 0x93, 0xf3, 0x15, 0x45, 0x65);
 
+/*! \brief Bitmask of XenStore key permissions */
+typedef enum _XENIFACE_STORE_PERMISSION_MASK {
+    XENIFACE_STORE_PERM_NONE  = 0, /*!< No access */
+    XENIFACE_STORE_PERM_READ  = 1, /*!< Read access */
+    XENIFACE_STORE_PERM_WRITE = 2, /*!< Write access */
+} XENIFACE_STORE_PERMISSION_MASK;
+
+/*! \brief XenStore key permissions entry for a single domain */
+typedef struct _XENIFACE_STORE_PERMISSION {
+    USHORT                         Domain; /*!< Target domain */
+    XENIFACE_STORE_PERMISSION_MASK Mask;   /*!< Permissions for the domain */
+} XENIFACE_STORE_PERMISSION, *PXENIFACE_STORE_PERMISSION;
+
+/*! \brief Bitmask of all available XenStore permission values */
+#define XENIFACE_STORE_ALLOWED_PERMISSIONS \
+    (XENIFACE_STORE_PERM_NONE | XENIFACE_STORE_PERM_READ | XENIFACE_STORE_PERM_WRITE)
+
+/*! \brief Read a value from XenStore
+
+    Input: NUL-terminated CHAR array containing the requested key's path
+
+    Output: NUL-terminated CHAR array containing the requested key's value
+*/
 #define IOCTL_XENIFACE_STORE_READ \
     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Write a value to XenStore
+
+    Input: NUL-terminated CHAR array containing the requested key's path,
+           NUL-terminated CHAR array containing the key's value,
+           final NUL terminator
+
+    Output: None
+*/
 #define IOCTL_XENIFACE_STORE_WRITE \
     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Enumerate all immediate child keys of a XenStore key
+
+    Input: NUL-terminated CHAR array containing the requested key's path
+
+    Output: List of NUL-terminated CHAR arrays containing the child key names,
+            followed by a NUL CHAR
+*/
 #define IOCTL_XENIFACE_STORE_DIRECTORY \
     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Remove a key from XenStore
+
+    Input: NUL-terminated CHAR array containing the requested key's path
+
+    Output: None
+*/
 #define IOCTL_XENIFACE_STORE_REMOVE \
     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
+/*! \brief Set permissions for a XenStore key
+
+    Input: XENIFACE_STORE_SET_PERMISSIONS_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_STORE_SET_PERMISSIONS \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_STORE_SET_PERMISSIONS */
+typedef struct _XENIFACE_STORE_SET_PERMISSIONS_IN {
+    PCHAR                     Path;                       /*!< NUL-terminated path to a XenStore key */
+    ULONG                     PathLength;                 /*!< Size of Path in bytes, including the NUL terminator */
+    ULONG                     NumberPermissions;          /*!< Number of permission entries */
+    XENIFACE_STORE_PERMISSION Permissions[ANYSIZE_ARRAY]; /*!< Permission entries */
+} XENIFACE_STORE_SET_PERMISSIONS_IN, *PXENIFACE_STORE_SET_PERMISSIONS_IN;
+
+/*! \brief Add a XenStore watch
+
+    Input: XENIFACE_STORE_ADD_WATCH_IN
+
+    Output: XENIFACE_STORE_ADD_WATCH_OUT
+*/
+#define IOCTL_XENIFACE_STORE_ADD_WATCH \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x805, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_STORE_ADD_WATCH */
+typedef struct _XENIFACE_STORE_ADD_WATCH_IN {
+    PCHAR  Path;       /*!< NUL-terminated path to a XenStore key */
+    ULONG  PathLength; /*!< Size of Path in bytes, including the NUL terminator */
+    HANDLE Event;      /*!< Handle to an event object that will be signaled when the watch fires */
+} XENIFACE_STORE_ADD_WATCH_IN, *PXENIFACE_STORE_ADD_WATCH_IN;
+
+/*! \brief Output for IOCTL_XENIFACE_STORE_ADD_WATCH */
+typedef struct _XENIFACE_STORE_ADD_WATCH_OUT {
+    PVOID Context; /*!< Handle to the watch */
+} XENIFACE_STORE_ADD_WATCH_OUT, *PXENIFACE_STORE_ADD_WATCH_OUT;
+
+/*! \brief Remove a XenStore watch
+
+    Input: XENIFACE_STORE_REMOVE_WATCH_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_STORE_REMOVE_WATCH \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x806, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_STORE_REMOVE_WATCH */
+typedef struct _XENIFACE_STORE_REMOVE_WATCH_IN {
+    PVOID Context; /*!< Handle to the watch */
+} XENIFACE_STORE_REMOVE_WATCH_IN, *PXENIFACE_STORE_REMOVE_WATCH_IN;
+
+/*! \brief Open an event channel that was already bound by a remote domain
+
+    Input: XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN
+
+    Output: XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT
+*/
+#define IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x810, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN */
+typedef struct _XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN {
+    USHORT  RemoteDomain; /*!< Remote domain that has already bound the channel */
+    ULONG   RemotePort;   /*!< Port number that is assigned to the event channel in the RemoteDomain */
+    BOOLEAN Mask;         /*!< Set to TRUE if the event channel should be initially masked */
+    HANDLE  Event;        /*!< Handle to an event object that will receive event channel notifications */
+} XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN, *PXENIFACE_EVTCHN_BIND_INTERDOMAIN_IN;
+
+/*! \brief Output for IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN */
+typedef struct _XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT {
+    ULONG LocalPort; /*!< Local port number that is assigned to the event channel */
+} XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT, *PXENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT;
+
+/*! \brief Open an unbound event channel
+
+    Input: XENIFACE_EVTCHN_BIND_UNBOUND_IN
+
+    Output: XENIFACE_EVTCHN_BIND_UNBOUND_OUT
+*/
+#define IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x811, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND */
+typedef struct _XENIFACE_EVTCHN_BIND_UNBOUND_IN {
+    USHORT  RemoteDomain; /*!< Remote domain that will bind the channel */
+    BOOLEAN Mask;         /*!< Set to TRUE if the event channel should be initially masked */
+    HANDLE  Event;        /*!< Handle to an event object that will receive event channel notifications */
+} XENIFACE_EVTCHN_BIND_UNBOUND_IN, *PXENIFACE_EVTCHN_BIND_UNBOUND_IN;
+
+/*! \brief Output for IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND */
+typedef struct _XENIFACE_EVTCHN_BIND_UNBOUND_OUT {
+    ULONG LocalPort; /*!< Local port number that is assigned to the event channel */
+} XENIFACE_EVTCHN_BIND_UNBOUND_OUT, *PXENIFACE_EVTCHN_BIND_UNBOUND_OUT;
+
+/*! \brief Close an event channel
+
+    Input: XENIFACE_EVTCHN_CLOSE_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_EVTCHN_CLOSE \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x812, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_EVTCHN_CLOSE */
+typedef struct _XENIFACE_EVTCHN_CLOSE_IN {
+    ULONG LocalPort; /*!< Local port number that is assigned to the event channel */
+} XENIFACE_EVTCHN_CLOSE_IN, *PXENIFACE_EVTCHN_CLOSE_IN;
+
+/*! \brief Notify the remote end of an event channel
+
+    Input: XENIFACE_EVTCHN_CLOSE_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_EVTCHN_NOTIFY \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x813, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_EVTCHN_NOTIFY */
+typedef struct _XENIFACE_EVTCHN_NOTIFY_IN {
+    ULONG LocalPort; /*!< Local port number that is assigned to the event channel */
+} XENIFACE_EVTCHN_NOTIFY_IN, *PXENIFACE_EVTCHN_NOTIFY_IN;
+
+/*! \brief Unmask an event channel
+
+    Input: XENIFACE_EVTCHN_CLOSE_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_EVTCHN_UNMASK \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x814, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_EVTCHN_UNMASK */
+typedef struct _XENIFACE_EVTCHN_UNMASK_IN {
+    ULONG LocalPort; /*!< Local port number that is assigned to the event channel */
+} XENIFACE_EVTCHN_UNMASK_IN, *PXENIFACE_EVTCHN_UNMASK_IN;
+
+/*! \brief Bitmask of XenStore key permissions */
+typedef enum _XENIFACE_GNTTAB_PAGE_FLAGS {
+    XENIFACE_GNTTAB_READONLY          = 1 << 0, /*!< If set, the granted/mapped pages are read-only */
+    XENIFACE_GNTTAB_USE_NOTIFY_OFFSET = 1 << 1, /*!< If set, the NotifyOffset member of the grant/map IOCTL input is used */
+    XENIFACE_GNTTAB_USE_NOTIFY_PORT   = 1 << 2, /*!< If set, the NotifyPort member of the grant/map IOCTL input is used */
+} XENIFACE_GNTTAB_PAGE_FLAGS;
+
+/*! \brief Grant permission to access local memory pages to a foreign domain
+    \note This IOCTL must be asynchronous. The driver doesn't complete the request
+          until the grant is explicitly revoked or the calling thread terminates.
+
+    Input: XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN
+
+    Output: XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT
+*/
+#define IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x820, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS */
+typedef struct _XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN {
+    ULONG                      RequestId;    /*!< A unique (for the calling process) number identifying the request */
+    USHORT                     RemoteDomain; /*!< Remote domain that is being granted access */
+    ULONG                      NumberPages;  /*!< Number of 4k pages to grant access to */
+    XENIFACE_GNTTAB_PAGE_FLAGS Flags;        /*!< Additional flags */
+    ULONG                      NotifyOffset; /*!< Offset of a byte in the granted region that will be set to 0 when the grant is revoked */
+    ULONG                      NotifyPort;   /*!< Local port number of an open event channel that will be notified when the grant is revoked */
+} XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN, *PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN;
+
+/*! \brief Output for IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS */
+typedef struct _XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT {
+    PVOID Address;                   /*!< User-mode address of the granted memory region */
+    ULONG References[ANYSIZE_ARRAY]; /*!< An array of Xen-assigned references for each granted page */
+} XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT, *PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT;
+
+/*! \brief Revoke a foreign domain access to previously granted memory region
+
+    Input: XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x821, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS */
+typedef struct _XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN {
+    ULONG RequestId; /*! Request ID used in the corresponding IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS call */
+} XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN, *PXENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN;
+
+/*! \brief Map a foreign memory region into the current address space
+    \note This IOCTL must be asynchronous. The driver doesn't complete the request
+          until the memory is explicitly unmapped or the calling thread terminates.
+
+    Input: XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN
+
+    Output: XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT
+*/
+#define IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x822, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES */
+typedef struct _XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN {
+    ULONG                      RequestId;                 /*!< A unique (for the calling process) number identifying the request */
+    USHORT                     RemoteDomain;              /*!< Remote domain that has granted access to the pages */
+    ULONG                      NumberPages;               /*!< Number of 4k pages to map */
+    XENIFACE_GNTTAB_PAGE_FLAGS Flags;                     /*!< Additional flags */
+    ULONG                      NotifyOffset;              /*!< Offset of a byte in the mapped region that will be set to 0 when the region is unmapped */
+    ULONG                      NotifyPort;                /*!< Local port number of an open event channel that will be notified when the region is unmapped */
+    ULONG                      References[ANYSIZE_ARRAY]; /*!< An array of Xen-assigned references for each granted page */
+} XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN, *PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN;
+
+/*! \brief Output for IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES */
+typedef struct _XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT {
+    PVOID Address; /*!< User-mode address of the mapped memory region */
+} XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT, *PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT;
+
+/*! \brief Unmap a foreign memory region from the current address space
+
+    Input: XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x823, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES */
+typedef struct _XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN {
+    ULONG RequestId; /*! Request ID used in the corresponding IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES call */
+} XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN, *PXENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN;
+
 #endif // _XENIFACE_IOCTLS_H_
-
-- 
1.8.1.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 Wed Oct 21 05:26:38 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 21 Oct 2015 05:26: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 1Zolv4-0007uI-Hb; Wed, 21 Oct 2015 05:26:38 +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 1Zolv3-0007pQ-7H
	for win-pv-devel@lists.xenproject.org; Wed, 21 Oct 2015 05:26:37 +0000
Received: from [85.158.137.68] by server-16.bemta-3.messagelabs.com id
	54/BE-03763-B0227265; Wed, 21 Oct 2015 05:26:35 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-7.tower-31.messagelabs.com!1445405192!20515224!1
X-Originating-IP: [66.111.4.27]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjcgPT4gODQ2Mw==\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25939 invoked from network); 21 Oct 2015 05:26:33 -0000
Received: from out3-smtp.messagingengine.com (HELO
	out3-smtp.messagingengine.com) (66.111.4.27)
	by server-7.tower-31.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2015 05:26:33 -0000
Received: from compute2.internal (compute2.nyi.internal [10.202.2.42])
	by mailout.nyi.internal (Postfix) with ESMTP id B1A3F20641
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:26:32 -0400 (EDT)
Received: from frontend1 ([10.202.2.160])
	by compute2.internal (MEProxy); Wed, 21 Oct 2015 01:26:32 -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=liPTD3fPHcqu8XroTGnsOuhUED4=; b=n8JcRZ
	RtYbN+SRxRvAZ1I0tEAPG1NotoynchqR0OXo/Obh2piXkNHtEzJIr6dMrNaiPewp
	fQeSauTNCdn/DTL/0jJWXHWW7rngCOMBGDucHnAdPYBegc8ivwubpMpDmJtpVXgV
	VxgP6z2Bm1lr7vIFeCjNzFF+FOv640HGE3Ud0=
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=liPTD3fPHcqu8XroTGnsOuhUED4=; b=n7bhk
	DXNtIIx4WtEW7h+fsCJatoxzzT6GlXPkoIT0XVtiT/sWr0n9mOCe7/FNQKD7XLPT
	2X+ZE1qxV1yJU2ItY5DW0kJnBuWS4q/YHagbzzKMmz3Fcg4jErekMHmWKOS/qYkx
	MDGrJAhYT9srg2pV2NQ23dzMiTWZTzDwHJZsmI=
X-Sasl-enc: 6upeXLvkz/Lli65Fk0mk4eyffSRzGpokHVYX9//TKx8v 1445405191
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 35F02C00014
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:26:31 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <56272208.8060208@invisiblethingslab.com>
Date: Wed, 21 Oct 2015 07:26:32 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 5/6] Implement new IOCTL handlers
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

This patch implements new store, evtchn and gnttab IOCTLs.
Handlers are split into separate files for readability.

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 include/xeniface_ioctls.h        |   1 +
 src/xeniface/fdo.c               | 179 +++++++++-
 src/xeniface/fdo.h               |  44 ++-
 src/xeniface/ioctl_evtchn.c      | 492 ++++++++++++++++++++++++++
 src/xeniface/ioctl_gnttab.c      | 747 +++++++++++++++++++++++++++++++++++++++
 src/xeniface/ioctl_store.c       | 608 +++++++++++++++++++++++++++++++
 src/xeniface/ioctls.c            | 396 ++++++++-------------
 src/xeniface/ioctls.h            | 330 ++++++++++++++++-
 src/xeniface/irp_queue.c         | 162 +++++++++
 src/xeniface/irp_queue.h         |  81 +++++
 vs2012/xeniface/xeniface.vcxproj |  30 +-
 vs2013/xeniface/xeniface.vcxproj |  30 +-
 12 files changed, 2807 insertions(+), 293 deletions(-)
 create mode 100644 src/xeniface/ioctl_evtchn.c
 create mode 100644 src/xeniface/ioctl_gnttab.c
 create mode 100644 src/xeniface/ioctl_store.c
 create mode 100644 src/xeniface/irp_queue.c
 create mode 100644 src/xeniface/irp_queue.h

diff --git a/include/xeniface_ioctls.h b/include/xeniface_ioctls.h
index 6ad98d6..a842d4f 100644
--- a/include/xeniface_ioctls.h
+++ b/include/xeniface_ioctls.h
@@ -1,4 +1,5 @@
 /* Copyright (c) Citrix Systems Inc.
+ * Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, 
diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index b73dee1..71ffbe2 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -36,7 +36,8 @@
 #include <stdlib.h>
 
 #include <store_interface.h>
-
+#include <evtchn_interface.h>
+#include <gnttab_interface.h>
 #include <suspend_interface.h>
 
 
@@ -52,6 +53,7 @@
 #include "ioctls.h"
 #include "wmi.h"
 #include "xeniface_ioctls.h"
+#include "irp_queue.h"
 
 #define FDO_POOL 'ODF'
 
@@ -664,6 +666,25 @@ __FdoD3ToD0(
     if (!NT_SUCCESS(status))
         goto fail1;
 
+    status = XENBUS_EVTCHN(Acquire, &Fdo->EvtchnInterface);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = XENBUS_GNTTAB(Acquire, &Fdo->GnttabInterface);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    status = XENBUS_GNTTAB(CreateCache,
+                           &Fdo->GnttabInterface,
+                           "xeniface-gnttab",
+                           0,
+                           GnttabAcquireLock,
+                           GnttabReleaseLock,
+                           Fdo,
+                           &Fdo->GnttabCache);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
     __FdoSetDevicePowerState(Fdo, PowerDeviceD0);
 
     PowerState.DeviceState = PowerDeviceD0;
@@ -675,6 +696,18 @@ __FdoD3ToD0(
 
     return STATUS_SUCCESS;
 
+fail4:
+    Error("fail4\n");
+    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
+
+fail3:
+    Error("fail3\n");
+    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
+
+fail2:
+    Error("fail2\n");
+    XENBUS_STORE(Release, &Fdo->StoreInterface);
+
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -700,6 +733,9 @@ __FdoD0ToD3(
 
     __FdoSetDevicePowerState(Fdo, PowerDeviceD3);
 
+    XENBUS_GNTTAB(DestroyCache, &Fdo->GnttabInterface, Fdo->GnttabCache);
+    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
+    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
     XENBUS_STORE(Release, &Fdo->StoreInterface);
 
     Trace("<====\n");
@@ -1991,27 +2027,25 @@ FdoDispatchDefault(
 
 NTSTATUS
 FdoCreateFile (
-    __in PXENIFACE_FDO fdoData,
-    __inout PIRP Irp
+    __in PXENIFACE_FDO  Fdo,
+    __inout PIRP        Irp
     )
 {
-    NTSTATUS     status;
+    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
+    NTSTATUS            status;
 
+    XenIfaceDebugPrint(TRACE, "FO %p, Process %p\n", Stack->FileObject, PsGetCurrentProcess());
 
-    XenIfaceDebugPrint(TRACE, "Create \n");
-
-    if (Deleted == fdoData->Dx->DevicePnpState)
-    {
+    if (Deleted == Fdo->Dx->DevicePnpState) {
         Irp->IoStatus.Status = STATUS_NO_SUCH_DEVICE;
-        IoCompleteRequest (Irp, IO_NO_INCREMENT);
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
         return STATUS_NO_SUCH_DEVICE;
     }
 
-
     status = STATUS_SUCCESS;
     Irp->IoStatus.Information = 0;
     Irp->IoStatus.Status = status;
-    IoCompleteRequest (Irp, IO_NO_INCREMENT);
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
     return status;
 }
@@ -2019,20 +2053,22 @@ FdoCreateFile (
 
 NTSTATUS
 FdoClose (
-    __in PXENIFACE_FDO fdoData,
-    __inout PIRP Irp
+    __in PXENIFACE_FDO  Fdo,
+    __inout PIRP        Irp
     )
 
 {
+    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
+    NTSTATUS            status;
 
-    NTSTATUS     status;
+    XenIfaceDebugPrint(TRACE, "FO %p, Process %p\n", Stack->FileObject, PsGetCurrentProcess());
 
-    XenIfaceDebugPrint(TRACE, "Close \n");
+    XenIfaceCleanup(Fdo, Stack->FileObject);
 
     status = STATUS_SUCCESS;
     Irp->IoStatus.Information = 0;
     Irp->IoStatus.Status = status;
-    IoCompleteRequest (Irp, IO_NO_INCREMENT);
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
     return status;
 }
@@ -2081,7 +2117,7 @@ FdoDispatch(
         break;
 
     case IRP_MJ_DEVICE_CONTROL:
-        status = XenIFaceIoctl(Fdo, Irp);
+        status = XenIfaceIoctl(Fdo, Irp);
         break;
 
     case IRP_MJ_SYSTEM_CONTROL:
@@ -2206,6 +2242,8 @@ FdoCreate(
     WCHAR               Name[MAXNAMELEN * sizeof (WCHAR)];
     ULONG               Size;
     NTSTATUS            status;
+    ULONG               ProcessorCount;
+    ULONG               Index;
 
 #pragma prefast(suppress:28197) // Possibly leaking memory 'FunctionDeviceObject'
     status = IoCreateDevice(DriverObject,
@@ -2296,6 +2334,24 @@ FdoCreate(
     if (!NT_SUCCESS(status))
         goto fail10;
 
+    status = FDO_QUERY_INTERFACE(Fdo,
+                                 XENBUS,
+                                 EVTCHN,
+                                 (PINTERFACE)&Fdo->EvtchnInterface,
+                                 sizeof (Fdo->EvtchnInterface),
+                                 FALSE);
+    if (!NT_SUCCESS(status))
+        goto fail11;
+
+    status = FDO_QUERY_INTERFACE(Fdo,
+                                 XENBUS,
+                                 GNTTAB,
+                                 (PINTERFACE)&Fdo->GnttabInterface,
+                                 sizeof (Fdo->GnttabInterface),
+                                 FALSE);
+    if (!NT_SUCCESS(status))
+        goto fail12;
+
     InitializeMutex(&Fdo->Mutex);
     InitializeListHead(&Dx->ListEntry);
     Fdo->References = 1;
@@ -2306,7 +2362,46 @@ FdoCreate(
 
     status = ThreadCreate(FdoRegistryThreadHandler, Fdo, &Fdo->registryThread);
     if (!NT_SUCCESS(status))
-        goto fail11;
+        goto fail13;
+
+    KeInitializeSpinLock(&Fdo->StoreWatchLock);
+    InitializeListHead(&Fdo->StoreWatchList);
+
+    KeInitializeSpinLock(&Fdo->EvtchnLock);
+    InitializeListHead(&Fdo->EvtchnList);
+
+    KeInitializeSpinLock(&Fdo->IrpQueueLock);
+    InitializeListHead(&Fdo->IrpList);
+
+    KeInitializeSpinLock(&Fdo->GnttabCacheLock);
+
+    status = IoCsqInitializeEx(&Fdo->IrpQueue,
+                               CsqInsertIrpEx,
+                               CsqRemoveIrp,
+                               CsqPeekNextIrp,
+                               CsqAcquireLock,
+                               CsqReleaseLock,
+                               CsqCompleteCanceledIrp);
+    if (!NT_SUCCESS(status))
+        goto fail14;
+
+    ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
+
+    status = STATUS_NO_MEMORY;
+    Fdo->EvtchnDpc = __FdoAllocate(sizeof (KDPC) * ProcessorCount);
+    if (Fdo->EvtchnDpc == NULL)
+        goto fail15;
+
+    for (Index = 0; Index < ProcessorCount; Index++) {
+        PROCESSOR_NUMBER ProcNumber;
+
+        status = KeGetProcessorNumberFromIndex(Index, &ProcNumber);
+        ASSERT(NT_SUCCESS(status));
+
+        KeInitializeDpc(&Fdo->EvtchnDpc[Index], EvtchnNotificationDpc, NULL);
+        status = KeSetTargetProcessorDpcEx(&Fdo->EvtchnDpc[Index], &ProcNumber);
+        ASSERT(NT_SUCCESS(status));
+    }
 
     Info("%p (%s)\n",
          FunctionDeviceObject,
@@ -2317,6 +2412,27 @@ FdoCreate(
 
     return STATUS_SUCCESS;
 
+fail15:
+    Error("fail15\n");
+
+fail14:
+    Error("fail14\n");
+
+    ThreadAlert(Fdo->registryThread);
+    ThreadJoin(Fdo->registryThread);
+    Fdo->registryThread = NULL;
+
+fail13:
+    Error("fail13\n");
+
+    RtlZeroMemory(&Fdo->GnttabInterface,
+                  sizeof (XENBUS_GNTTAB_INTERFACE));
+
+fail12:
+    Error("fail12\n");
+
+    RtlZeroMemory(&Fdo->EvtchnInterface,
+                  sizeof (XENBUS_EVTCHN_INTERFACE));
 
 fail11:
     Error("fail11\n");
@@ -2394,7 +2510,8 @@ FdoDestroy(
     )
 {
     PXENIFACE_DX          Dx = Fdo->Dx;
-    PDEVICE_OBJECT      FunctionDeviceObject = Dx->DeviceObject;
+    PDEVICE_OBJECT        FunctionDeviceObject = Dx->DeviceObject;
+    ULONG                 ProcessorCount;
 
     ASSERT(IsListEmpty(&Dx->ListEntry));
     ASSERT3U(Fdo->References, ==, 0);
@@ -2408,10 +2525,34 @@ FdoDestroy(
 
     Dx->Fdo = NULL;
 
+    ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
+    RtlZeroMemory(Fdo->EvtchnDpc, sizeof (KDPC) * ProcessorCount);
+    __FdoFree(Fdo->EvtchnDpc);
+
+    RtlZeroMemory(&Fdo->GnttabCacheLock, sizeof (KSPIN_LOCK));
+    ASSERT(IsListEmpty(&Fdo->IrpList));
+    RtlZeroMemory(&Fdo->IrpList, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&Fdo->IrpQueueLock, sizeof (KSPIN_LOCK));
+    RtlZeroMemory(&Fdo->IrpQueue, sizeof (IO_CSQ));
+
+    ASSERT(IsListEmpty(&Fdo->EvtchnList));
+    RtlZeroMemory(&Fdo->EvtchnList, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&Fdo->EvtchnLock, sizeof (KSPIN_LOCK));
+
+    ASSERT(IsListEmpty(&Fdo->StoreWatchList));
+    RtlZeroMemory(&Fdo->StoreWatchList, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&Fdo->StoreWatchLock, sizeof (KSPIN_LOCK));
+
     RtlZeroMemory(&Fdo->Mutex, sizeof (XENIFACE_MUTEX));
 
     Fdo->InterfacesAcquired = FALSE;
 
+    RtlZeroMemory(&Fdo->GnttabInterface,
+                  sizeof (XENBUS_GNTTAB_INTERFACE));
+
+    RtlZeroMemory(&Fdo->EvtchnInterface,
+                  sizeof (XENBUS_EVTCHN_INTERFACE));
+
     RtlZeroMemory(&Fdo->StoreInterface,
                   sizeof (XENBUS_STORE_INTERFACE));
 
diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
index c859338..781b1cc 100644
--- a/src/xeniface/fdo.h
+++ b/src/xeniface/fdo.h
@@ -34,6 +34,8 @@
 
 #include <ntifs.h>
 #include <store_interface.h>
+#include <evtchn_interface.h>
+#include <gnttab_interface.h>
 #include <suspend_interface.h>
 #include <shared_info_interface.h>
 
@@ -73,32 +75,44 @@ typedef struct _XENIFACE_FDO {
 
     FDO_RESOURCE                    Resource[RESOURCE_COUNT];
 
-
     XENBUS_STORE_INTERFACE          StoreInterface;
-
     XENBUS_SUSPEND_INTERFACE        SuspendInterface;
-
     XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
-
+    XENBUS_EVTCHN_INTERFACE         EvtchnInterface;
+    XENBUS_GNTTAB_INTERFACE         GnttabInterface;
     PXENBUS_SUSPEND_CALLBACK        SuspendCallbackLate;
 
-    BOOLEAN						    InterfacesAcquired;
+    BOOLEAN                         InterfacesAcquired;
+
+    KSPIN_LOCK                      StoreWatchLock;
+    LIST_ENTRY                      StoreWatchList;
+
+    KSPIN_LOCK                      EvtchnLock;
+    LIST_ENTRY                      EvtchnList;
+    PKDPC                           EvtchnDpc;
+
+    KSPIN_LOCK                      GnttabCacheLock;
+
+    IO_CSQ                          IrpQueue;
+    KSPIN_LOCK                      IrpQueueLock;
+    LIST_ENTRY                      IrpList;
+
+    PXENBUS_GNTTAB_CACHE            GnttabCache;
 
     #define MAX_SESSIONS    (65536)
 
-    int							    WmiReady;
+    int                             WmiReady;
 
-    USHORT						    Sessions;
-    FAST_MUTEX					    SessionLock;
-    LIST_ENTRY					    SessionHead;
+    USHORT                          Sessions;
+    FAST_MUTEX                      SessionLock;
+    LIST_ENTRY                      SessionHead;
 
-    PXENIFACE_THREAD			    registryThread;
-    KEVENT						    registryWriteEvent;
+    PXENIFACE_THREAD                registryThread;
+    KEVENT                          registryWriteEvent;
 
+    UNICODE_STRING                  SuggestedInstanceName;
 
-    UNICODE_STRING				    SuggestedInstanceName;
-
-    UNICODE_STRING				    InterfaceName;
+    UNICODE_STRING                  InterfaceName;
 
 } XENIFACE_FDO, *PXENIFACE_FDO;
 
@@ -163,6 +177,4 @@ FdoDispatch(
     IN  PIRP            Irp
     );
 
-
-
 #endif  // _XENIFACE_FDO_H
diff --git a/src/xeniface/ioctl_evtchn.c b/src/xeniface/ioctl_evtchn.c
new file mode 100644
index 0000000..93f1931
--- /dev/null
+++ b/src/xeniface/ioctl_evtchn.c
@@ -0,0 +1,492 @@
+/* Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
+ * 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 "driver.h"
+#include "ioctls.h"
+#include "xeniface_ioctls.h"
+#include "log.h"
+
+_Function_class_(KDEFERRED_ROUTINE)
+_IRQL_requires_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+VOID
+EvtchnNotificationDpc(
+    __in      PKDPC Dpc,
+    __in_opt  PVOID _Context,
+    __in_opt  PVOID Argument1,
+    __in_opt  PVOID Argument2
+    )
+{
+    PXENIFACE_EVTCHN_CONTEXT Context = Argument1;
+
+    UNREFERENCED_PARAMETER(Dpc);
+    UNREFERENCED_PARAMETER(_Context);
+    UNREFERENCED_PARAMETER(Argument2);
+
+    ASSERT(Context);
+
+#if DBG
+    XenIfaceDebugPrint(INFO, "Channel %p, LocalPort %d, Cpu %lu\n",
+                       Context->Channel, Context->LocalPort, KeGetCurrentProcessorNumber());
+#endif
+    KeSetEvent(Context->Event, 0, FALSE);
+
+    XENBUS_EVTCHN(Unmask,
+                  &Context->Fdo->EvtchnInterface,
+                  Context->Channel,
+                  FALSE);
+}
+
+_Function_class_(KSERVICE_ROUTINE)
+_IRQL_requires_(HIGH_LEVEL)
+_IRQL_requires_same_
+static DECLSPEC_NOINLINE
+BOOLEAN
+EvtchnInterruptHandler(
+    __in      PKINTERRUPT Interrupt,
+    __in_opt  PVOID Argument
+    )
+{
+    PXENIFACE_EVTCHN_CONTEXT Context = Argument;
+    PROCESSOR_NUMBER ProcNumber;
+    ULONG ProcIndex;
+
+    UNREFERENCED_PARAMETER(Interrupt);
+    ASSERT(Context);
+
+    KeGetCurrentProcessorNumberEx(&ProcNumber);
+    ProcIndex = KeGetProcessorIndexFromNumber(&ProcNumber);
+    if (!KeInsertQueueDpc(&Context->Fdo->EvtchnDpc[ProcIndex], Context, NULL)) {
+        XenIfaceDebugPrint(TRACE, "NOT INSERTED: Context %p, Port %lu, FO %p, Cpu %lu\n",
+                           Context, Context->LocalPort, Context->FileObject, ProcIndex);
+    }
+
+    return TRUE;
+}
+
+_IRQL_requires_(PASSIVE_LEVEL) // needed for KeFlushQueuedDpcs
+VOID
+EvtchnFree(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_EVTCHN_CONTEXT Context
+    )
+{
+    ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
+
+    XenIfaceDebugPrint(TRACE, "Context %p, LocalPort %d, FO %p\n",
+                       Context, Context->LocalPort, Context->FileObject);
+
+    XENBUS_EVTCHN(Close,
+                  &Fdo->EvtchnInterface,
+                  Context->Channel);
+
+    // There may still be a pending event at this time.
+    // Wait for our DPCs to complete.
+    KeFlushQueuedDpcs();
+
+    ObDereferenceObject(Context->Event);
+    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+}
+
+_Requires_exclusive_lock_held_(Fdo->EvtchnLock)
+static
+PXENIFACE_EVTCHN_CONTEXT
+EvtchnFindChannel(
+    __in      PXENIFACE_FDO Fdo,
+    __in      ULONG         LocalPort,
+    __in_opt  PFILE_OBJECT  FileObject
+    )
+{
+    PXENIFACE_EVTCHN_CONTEXT Context, Found = NULL;
+    PLIST_ENTRY Node;
+
+    Node = Fdo->EvtchnList.Flink;
+    while (Node->Flink != Fdo->EvtchnList.Flink) {
+        Context = CONTAINING_RECORD(Node, XENIFACE_EVTCHN_CONTEXT, Entry);
+
+        Node = Node->Flink;
+        if (Context->LocalPort != LocalPort)
+            continue;
+
+        if (FileObject != NULL &&
+            FileObject != Context->FileObject) {
+            continue;
+        }
+
+        Found = Context;
+        break;
+    }
+
+    return Found;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnBindUnbound(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_BIND_UNBOUND_IN In = Buffer;
+    PXENIFACE_EVTCHN_BIND_UNBOUND_OUT Out = Buffer;
+    PXENIFACE_EVTCHN_CONTEXT Context;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_IN) ||
+        OutLen != sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_OUT)) {
+        goto fail1;
+    }
+
+    status = STATUS_NO_MEMORY;
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_EVTCHN_CONTEXT), XENIFACE_POOL_TAG);
+    if (Context == NULL)
+        goto fail2;
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
+    Context->FileObject = FileObject;
+
+    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, Mask %d, FO %p\n",
+                       In->RemoteDomain, In->Mask, FileObject);
+
+    status = ObReferenceObjectByHandle(In->Event,
+                                       EVENT_MODIFY_STATE,
+                                       *ExEventObjectType,
+                                       UserMode,
+                                       &Context->Event,
+                                       NULL);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    status = STATUS_UNSUCCESSFUL;
+    Context->Channel = XENBUS_EVTCHN(Open,
+                                     &Fdo->EvtchnInterface,
+                                     XENBUS_EVTCHN_TYPE_UNBOUND,
+                                     EvtchnInterruptHandler,
+                                     Context,
+                                     In->RemoteDomain,
+                                     TRUE);
+    if (Context->Channel == NULL)
+        goto fail4;
+
+    Context->LocalPort = XENBUS_EVTCHN(GetPort,
+                                       &Fdo->EvtchnInterface,
+                                       Context->Channel);
+
+    Context->Fdo = Fdo;
+
+    ExInterlockedInsertTailList(&Fdo->EvtchnList, &Context->Entry, &Fdo->EvtchnLock);
+
+    Out->LocalPort = Context->LocalPort;
+    *Info = sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_OUT);
+
+    if (!In->Mask) {
+        XENBUS_EVTCHN(Unmask,
+                      &Fdo->EvtchnInterface,
+                      Context->Channel,
+                      FALSE);
+    }
+
+    XenIfaceDebugPrint(TRACE, "< LocalPort %lu, Context %p\n", Context->LocalPort, Context);
+    return STATUS_SUCCESS;
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+    ObDereferenceObject(Context->Event);
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnBindInterdomain(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_BIND_INTERDOMAIN_IN In = Buffer;
+    PXENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT Out = Buffer;
+    PXENIFACE_EVTCHN_CONTEXT Context;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN) ||
+        OutLen != sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT)) {
+        goto fail1;
+    }
+
+    status = STATUS_NO_MEMORY;
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_EVTCHN_CONTEXT), XENIFACE_POOL_TAG);
+    if (Context == NULL)
+        goto fail2;
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
+    Context->FileObject = FileObject;
+
+    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, RemotePort %lu, Mask %d, FO %p\n",
+                       In->RemoteDomain, In->RemotePort, In->Mask, FileObject);
+
+    status = ObReferenceObjectByHandle(In->Event,
+                                       EVENT_MODIFY_STATE,
+                                       *ExEventObjectType,
+                                       UserMode,
+                                       &Context->Event,
+                                       NULL);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    status = STATUS_UNSUCCESSFUL;
+    Context->Channel = XENBUS_EVTCHN(Open,
+                                     &Fdo->EvtchnInterface,
+                                     XENBUS_EVTCHN_TYPE_INTER_DOMAIN,
+                                     EvtchnInterruptHandler,
+                                     Context,
+                                     In->RemoteDomain,
+                                     In->RemotePort,
+                                     TRUE);
+    if (Context->Channel == NULL)
+        goto fail4;
+
+    Context->LocalPort = XENBUS_EVTCHN(GetPort,
+                                       &Fdo->EvtchnInterface,
+                                       Context->Channel);
+
+    Context->Fdo = Fdo;
+
+    ExInterlockedInsertTailList(&Fdo->EvtchnList, &Context->Entry, &Fdo->EvtchnLock);
+
+    Out->LocalPort = Context->LocalPort;
+    *Info = sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT);
+
+    if (!In->Mask) {
+        XENBUS_EVTCHN(Unmask,
+                      &Fdo->EvtchnInterface,
+                      Context->Channel,
+                      FALSE);
+    }
+
+    XenIfaceDebugPrint(TRACE, "< LocalPort %lu, Context %p\n", Context->LocalPort, Context);
+
+    return STATUS_SUCCESS;
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+    ObDereferenceObject(Context->Event);
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnClose(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_CLOSE_IN In = Buffer;
+    PXENIFACE_EVTCHN_CONTEXT Context;
+    KIRQL Irql;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_EVTCHN_CLOSE_IN) ||
+        OutLen != 0) {
+        goto fail1;
+    }
+
+    XenIfaceDebugPrint(TRACE, "> LocalPort %lu, FO %p\n", In->LocalPort, FileObject);
+
+    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
+    status = STATUS_NOT_FOUND;
+    Context = EvtchnFindChannel(Fdo, In->LocalPort, FileObject);
+    if (Context == NULL)
+        goto fail2;
+
+    RemoveEntryList(&Context->Entry);
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+    EvtchnFree(Fdo, Context);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+_Requires_lock_not_held_(Fdo->EvtchnLock)
+DECLSPEC_NOINLINE
+NTSTATUS
+EvtchnNotify(
+    __in      PXENIFACE_FDO Fdo,
+    __in      ULONG         LocalPort,
+    __in_opt  PFILE_OBJECT  FileObject
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_CONTEXT Context;
+    KIRQL Irql;
+
+    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
+
+    Context = EvtchnFindChannel(Fdo, LocalPort, FileObject);
+
+    status = STATUS_NOT_FOUND;
+    if (Context == NULL)
+        goto fail1;
+
+    XENBUS_EVTCHN(Send,
+                  &Fdo->EvtchnInterface,
+                  Context->Channel);
+
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+
+    return STATUS_SUCCESS;
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnNotify(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_NOTIFY_IN In = Buffer;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_EVTCHN_NOTIFY_IN) ||
+        OutLen != 0) {
+        goto fail1;
+    }
+
+#if DBG
+    XenIfaceDebugPrint(INFO, "> LocalPort %d, FO %p\n", In->LocalPort, FileObject);
+#endif
+
+    return EvtchnNotify(Fdo, In->LocalPort, FileObject);
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnUnmask(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_UNMASK_IN In = Buffer;
+    PXENIFACE_EVTCHN_CONTEXT Context;
+    KIRQL Irql;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_EVTCHN_UNMASK_IN) ||
+        OutLen != 0) {
+        goto fail1;
+    }
+
+    XenIfaceDebugPrint(TRACE, "> LocalPort %d, FO %p\n", In->LocalPort, FileObject);
+
+    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
+
+    Context = EvtchnFindChannel(Fdo, In->LocalPort, FileObject);
+
+    status = STATUS_INVALID_PARAMETER;
+    if (Context == NULL)
+        goto fail2;
+
+    XENBUS_EVTCHN(Unmask,
+                  &Fdo->EvtchnInterface,
+                  Context->Channel,
+                  FALSE);
+
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
diff --git a/src/xeniface/ioctl_gnttab.c b/src/xeniface/ioctl_gnttab.c
new file mode 100644
index 0000000..a24a5ee
--- /dev/null
+++ b/src/xeniface/ioctl_gnttab.c
@@ -0,0 +1,747 @@
+/* Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
+ * 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 "driver.h"
+#include "ioctls.h"
+#include "xeniface_ioctls.h"
+#include "log.h"
+#include "irp_queue.h"
+
+// Complete a canceled gnttab IRP, cleanup associated grant/map.
+_Function_class_(IO_WORKITEM_ROUTINE)
+VOID
+CompleteGnttabIrp(
+    __in      PDEVICE_OBJECT DeviceObject,
+    __in_opt  PVOID          Context
+    )
+{
+    PXENIFACE_DX Dx = (PXENIFACE_DX)DeviceObject->DeviceExtension;
+    PXENIFACE_FDO Fdo = Dx->Fdo;
+    PIRP Irp = Context;
+    PXENIFACE_CONTEXT_ID Id;
+    PIO_WORKITEM WorkItem;
+    KAPC_STATE ApcState;
+    BOOLEAN ChangeProcess;
+
+    ASSERT(Context != NULL);
+
+    Id = Irp->Tail.Overlay.DriverContext[0];
+    WorkItem = Irp->Tail.Overlay.DriverContext[1];
+    
+    // We are not guaranteed to be in the context of the process that initiated the IRP,
+    // but we need to be there to unmap memory.
+    ChangeProcess = PsGetCurrentProcess() != Id->Process;
+    if (ChangeProcess) {
+        XenIfaceDebugPrint(TRACE, "Changing process from %p to %p\n", PsGetCurrentProcess(), Id->Process);
+        KeStackAttachProcess(Id->Process, &ApcState);
+    }
+
+    XenIfaceDebugPrint(TRACE, "Irp %p, Process %p, Id %lu, Type %d, IRQL %d\n",
+                       Irp, Id->Process, Id->RequestId, Id->Type, KeGetCurrentIrql());
+
+    switch (Id->Type) {
+
+    case XENIFACE_CONTEXT_GRANT:
+        GnttabFreeGrant(Fdo, CONTAINING_RECORD(Id, XENIFACE_GRANT_CONTEXT, Id));
+        break;
+
+    case XENIFACE_CONTEXT_MAP:
+        GnttabFreeMap(Fdo, CONTAINING_RECORD(Id, XENIFACE_MAP_CONTEXT, Id));
+        break;
+
+    default:
+        ASSERT(FALSE);
+    }
+
+    if (ChangeProcess)
+        KeUnstackDetachProcess(&ApcState);
+
+    IoFreeWorkItem(WorkItem);
+
+    Irp->IoStatus.Status = STATUS_CANCELLED;
+    Irp->IoStatus.Information = 0;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+}
+
+_Acquires_exclusive_lock_(((PXENIFACE_FDO)Argument)->GnttabCacheLock)
+_IRQL_requires_(DISPATCH_LEVEL)
+VOID
+GnttabAcquireLock(
+    __in  PVOID Argument
+    )
+{
+    PXENIFACE_FDO Fdo = Argument;
+
+    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+
+    KeAcquireSpinLockAtDpcLevel(&Fdo->GnttabCacheLock);
+}
+
+_Releases_exclusive_lock_(((PXENIFACE_FDO)Argument)->GnttabCacheLock)
+_IRQL_requires_(DISPATCH_LEVEL)
+VOID
+GnttabReleaseLock(
+    __in  PVOID Argument
+    )
+{
+    PXENIFACE_FDO Fdo = Argument;
+
+    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+
+    KeReleaseSpinLockFromDpcLevel(&Fdo->GnttabCacheLock);
+}
+
+_Requires_lock_not_held_(Fdo->IrpQueueLock)
+static
+PIRP
+FindGnttabIrp(
+    __in  PXENIFACE_FDO Fdo,
+    __in  PXENIFACE_CONTEXT_ID Id
+    )
+{
+    KIRQL Irql;
+    PIRP Irp;
+
+    CsqAcquireLock(&Fdo->IrpQueue, &Irql);
+    Irp = CsqPeekNextIrp(&Fdo->IrpQueue, NULL, Id);
+    CsqReleaseLock(&Fdo->IrpQueue, Irql);
+    return Irp;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabPermitForeignAccess(
+    __in     PXENIFACE_FDO  Fdo,
+    __in     PVOID          Buffer,
+    __in     ULONG          InLen,
+    __in     ULONG          OutLen,
+    __inout  PIRP           Irp
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN In;
+    PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT Out = Irp->UserBuffer;
+    PXENIFACE_GRANT_CONTEXT Context;
+    ULONG Page;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN))
+        goto fail1;
+
+    // This IOCTL uses METHOD_NEITHER so we directly access user memory.
+    status = __CaptureUserBuffer(Buffer, InLen, &In);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (In->NumberPages == 0 ||
+        In->NumberPages > 1024 * 1024) {
+        goto fail3;
+    }
+
+    if ((In->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) &&
+        (In->NotifyOffset >= In->NumberPages * PAGE_SIZE)) {
+        goto fail4;
+    }
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (OutLen != (ULONG)FIELD_OFFSET(XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT, References[In->NumberPages]))
+        goto fail5;
+
+    status = STATUS_NO_MEMORY;
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_GRANT_CONTEXT), XENIFACE_POOL_TAG);
+    if (Context == NULL)
+        goto fail6;
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
+    Context->Id.Type = XENIFACE_CONTEXT_GRANT;
+    Context->Id.Process = PsGetCurrentProcess();
+    Context->Id.RequestId = In->RequestId;
+    Context->RemoteDomain = In->RemoteDomain;
+    Context->NumberPages = In->NumberPages;
+    Context->Flags = In->Flags;
+    Context->NotifyOffset = In->NotifyOffset;
+    Context->NotifyPort = In->NotifyPort;
+
+    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, NumberPages %lu, Flags 0x%x, Offset 0x%x, Port %d, Process %p, Id %lu\n",
+                       Context->RemoteDomain, Context->NumberPages, Context->Flags, Context->NotifyOffset, Context->NotifyPort,
+                       Context->Id.Process, Context->Id.RequestId);
+
+    // Check if the request ID is unique for this process.
+    // This doesn't protect us from simultaneous requests with the same ID arriving here
+    // but another check for duplicate ID is performed when the context/IRP is queued at the end.
+    // Ideally we would lock the whole section but that's not really an option since we touch user memory.
+    status = STATUS_INVALID_PARAMETER;
+    if (FindGnttabIrp(Fdo, &Context->Id) != NULL)
+        goto fail7;
+
+    status = STATUS_NO_MEMORY;
+    Context->Grants = ExAllocatePoolWithTag(NonPagedPool, Context->NumberPages * sizeof(PXENBUS_GNTTAB_ENTRY), XENIFACE_POOL_TAG);
+    if (Context->Grants == NULL)
+        goto fail8;
+
+    RtlZeroMemory(Context->Grants, Context->NumberPages * sizeof(PXENBUS_GNTTAB_ENTRY));
+
+    // allocate memory to share
+    status = STATUS_NO_MEMORY;
+    Context->KernelVa = ExAllocatePoolWithTag(NonPagedPool, Context->NumberPages * PAGE_SIZE, XENIFACE_POOL_TAG);
+    if (Context->KernelVa == NULL)
+        goto fail9;
+
+    RtlZeroMemory(Context->KernelVa, Context->NumberPages * PAGE_SIZE);
+    Context->Mdl = IoAllocateMdl(Context->KernelVa, Context->NumberPages * PAGE_SIZE, FALSE, FALSE, NULL);
+    if (Context->Mdl == NULL)
+        goto fail10;
+
+    MmBuildMdlForNonPagedPool(Context->Mdl);
+    ASSERT(MmGetMdlByteCount(Context->Mdl) == Context->NumberPages * PAGE_SIZE);
+
+    // perform sharing
+    for (Page = 0; Page < Context->NumberPages; Page++) {
+        status = XENBUS_GNTTAB(PermitForeignAccess,
+                               &Fdo->GnttabInterface,
+                               Fdo->GnttabCache,
+                               FALSE,
+                               Context->RemoteDomain,
+                               MmGetMdlPfnArray(Context->Mdl)[Page],
+                               (Context->Flags & XENIFACE_GNTTAB_READONLY) != 0,
+                               &(Context->Grants[Page]));
+
+// prefast somehow thinks that this call can modify Page...
+#pragma prefast(suppress:6385)
+        XenIfaceDebugPrint(INFO, "Grants[%lu] = %p\n", Page, Context->Grants[Page]);
+        if (!NT_SUCCESS(status))
+            goto fail11;
+    }
+
+    // map into user mode
+#pragma prefast(suppress:6320) // we want to catch all exceptions
+    __try {
+        Context->UserVa = MmMapLockedPagesSpecifyCache(Context->Mdl,
+                                                       UserMode,
+                                                       MmCached,
+                                                       NULL,
+                                                       FALSE,
+                                                       NormalPagePriority);
+    }
+    __except (EXCEPTION_EXECUTE_HANDLER) {
+        status = GetExceptionCode();
+        goto fail12;
+    }
+
+    status = STATUS_UNSUCCESSFUL;
+    if (Context->UserVa == NULL)
+        goto fail13;
+
+    XenIfaceDebugPrint(TRACE, "< Context %p, Irp %p, KernelVa %p, UserVa %p\n",
+                       Context, Irp, Context->KernelVa, Context->UserVa);
+    
+    // Pass the result to user mode.
+#pragma prefast(suppress: 6320) // we want to catch all exceptions
+    try {
+        ProbeForWrite(Out, OutLen, 1);
+        Out->Address = Context->UserVa;
+
+        for (Page = 0; Page < Context->NumberPages; Page++) {
+            Out->References[Page] = XENBUS_GNTTAB(GetReference,
+                                                  &Fdo->GnttabInterface,
+                                                  Context->Grants[Page]);
+        }
+    } except(EXCEPTION_EXECUTE_HANDLER) {
+        status = GetExceptionCode();
+        XenIfaceDebugPrint(ERROR, "Exception 0x%lx while probing/writing output buffer at %p, size 0x%lx\n", status, Out, OutLen);
+        goto fail14;
+    }
+
+    // Insert the IRP/context into the pending queue.
+    // This also checks (again) if the request ID is unique for the calling process.
+    Irp->Tail.Overlay.DriverContext[0] = &Context->Id;
+    status = IoCsqInsertIrpEx(&Fdo->IrpQueue, Irp, NULL, &Context->Id);
+    if (!NT_SUCCESS(status))
+        goto fail15;
+
+    __FreeCapturedBuffer(In);
+
+    return STATUS_PENDING;
+
+fail15:
+    XenIfaceDebugPrint(ERROR, "Fail15\n");
+
+fail14:
+    XenIfaceDebugPrint(ERROR, "Fail14\n");
+    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
+
+fail13:
+    XenIfaceDebugPrint(ERROR, "Fail13\n");
+
+fail12:
+    XenIfaceDebugPrint(ERROR, "Fail12\n");
+
+fail11:
+    XenIfaceDebugPrint(ERROR, "Fail11: Page = %lu\n", Page);
+
+    while (Page > 0) {
+        ASSERT(NT_SUCCESS(XENBUS_GNTTAB(RevokeForeignAccess,
+                                        &Fdo->GnttabInterface,
+                                        Fdo->GnttabCache,
+                                        FALSE,
+                                        Context->Grants[Page - 1])));
+
+        --Page;
+    }
+    IoFreeMdl(Context->Mdl);
+
+fail10:
+    XenIfaceDebugPrint(ERROR, "Fail10\n");
+    ExFreePoolWithTag(Context->KernelVa, XENIFACE_POOL_TAG);
+
+fail9:
+    XenIfaceDebugPrint(ERROR, "Fail9\n");
+    ExFreePoolWithTag(Context->Grants, XENIFACE_POOL_TAG);
+
+fail8:
+    XenIfaceDebugPrint(ERROR, "Fail8\n");
+
+fail7:
+    XenIfaceDebugPrint(ERROR, "Fail7\n");
+    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+
+fail6:
+    XenIfaceDebugPrint(ERROR, "Fail6\n");
+
+fail5:
+    XenIfaceDebugPrint(ERROR, "Fail5\n");
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+    __FreeCapturedBuffer(In);
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+_IRQL_requires_max_(APC_LEVEL)
+VOID
+GnttabFreeGrant(
+    __in     PXENIFACE_FDO            Fdo,
+    __inout  PXENIFACE_GRANT_CONTEXT  Context
+)
+{
+    NTSTATUS status;
+    ULONG Page;
+
+    ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
+
+    XenIfaceDebugPrint(TRACE, "Context %p\n", Context);
+
+    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) {
+        ((PCHAR)Context->KernelVa)[Context->NotifyOffset] = 0;
+    }
+
+    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_PORT) {
+        status = EvtchnNotify(Fdo, Context->NotifyPort, NULL);
+
+        if (!NT_SUCCESS(status)) // non-fatal, we must free memory
+            XenIfaceDebugPrint(ERROR, "failed to notify port %lu: 0x%x\n", Context->NotifyPort, status);
+    }
+
+    // unmap from user address space
+    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
+
+    // stop sharing
+    for (Page = 0; Page < Context->NumberPages; Page++) {
+        status = XENBUS_GNTTAB(RevokeForeignAccess,
+                               &Fdo->GnttabInterface,
+                               Fdo->GnttabCache,
+                               FALSE,
+                               Context->Grants[Page]);
+
+        ASSERT(NT_SUCCESS(status)); // failure here is fatal, something must've gone catastrophically wrong
+    }
+
+    IoFreeMdl(Context->Mdl);
+
+    RtlZeroMemory(Context->KernelVa, Context->NumberPages * PAGE_SIZE);
+    ExFreePoolWithTag(Context->KernelVa, XENIFACE_POOL_TAG);
+
+    RtlZeroMemory(Context->Grants, Context->NumberPages * sizeof(PXENBUS_GNTTAB_ENTRY));
+    ExFreePoolWithTag(Context->Grants, XENIFACE_POOL_TAG);
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabRevokeForeignAccess(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN In = Buffer;
+    PXENIFACE_GRANT_CONTEXT Context = NULL;
+    XENIFACE_CONTEXT_ID Id;
+    PIRP PendingIrp;
+    PXENIFACE_CONTEXT_ID ContextId;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN))
+        goto fail1;
+
+    Id.Type = XENIFACE_CONTEXT_GRANT;
+    Id.Process = PsGetCurrentProcess();
+    Id.RequestId = In->RequestId;
+
+    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process, Id.RequestId);
+
+    status = STATUS_NOT_FOUND;
+    PendingIrp = IoCsqRemoveNextIrp(&Fdo->IrpQueue, &Id);
+    if (PendingIrp == NULL)
+        goto fail2;
+
+    ContextId = PendingIrp->Tail.Overlay.DriverContext[0];
+    Context = CONTAINING_RECORD(ContextId, XENIFACE_GRANT_CONTEXT, Id);
+    GnttabFreeGrant(Fdo, Context);
+
+    PendingIrp->IoStatus.Status = STATUS_SUCCESS;
+    PendingIrp->IoStatus.Information = 0;
+    IoCompleteRequest(PendingIrp, IO_NO_INCREMENT);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabMapForeignPages(
+    __in     PXENIFACE_FDO     Fdo,
+    __in     PVOID             Buffer,
+    __in     ULONG             InLen,
+    __in     ULONG             OutLen,
+    __inout  PIRP              Irp
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN In = Buffer;
+    PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT Out = Irp->UserBuffer;
+    ULONG NumberPages;
+    ULONG PageIndex;
+    PXENIFACE_MAP_CONTEXT Context;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen < sizeof(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN) ||
+        OutLen != sizeof(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT)) {
+        goto fail1;
+    }
+
+    // This IOCTL uses METHOD_NEITHER so we directly access user memory.
+
+    // Calculate the expected number of pages based on input buffer size.
+    NumberPages = (InLen - (ULONG)FIELD_OFFSET(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN, References)) / sizeof(In->References[0]);
+
+    status = __CaptureUserBuffer(Buffer, InLen, &In);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (In->NumberPages == 0 ||
+        In->NumberPages > 1024 * 1024 ||
+        In->NumberPages != NumberPages) {
+        goto fail3;
+    }
+
+    if ((In->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) &&
+        (In->NotifyOffset >= In->NumberPages * PAGE_SIZE)) {
+        goto fail4;
+    }
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != (ULONG)FIELD_OFFSET(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN, References[In->NumberPages]))
+        goto fail5;
+
+    status = STATUS_NO_MEMORY;
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_MAP_CONTEXT), XENIFACE_POOL_TAG);
+    if (Context == NULL)
+        goto fail6;
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
+    Context->Id.Type = XENIFACE_CONTEXT_MAP;
+    Context->Id.Process = PsGetCurrentProcess();
+    Context->Id.RequestId = In->RequestId;
+    Context->RemoteDomain = In->RemoteDomain;
+    Context->NumberPages = In->NumberPages;
+    Context->Flags = In->Flags;
+    Context->NotifyOffset = In->NotifyOffset;
+    Context->NotifyPort = In->NotifyPort;
+
+    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, NumberPages %lu, Flags 0x%x, Offset 0x%x, Port %d, Process %p, Id %lu\n",
+                       Context->RemoteDomain, Context->NumberPages, Context->Flags, Context->NotifyOffset, Context->NotifyPort,
+                       Context->Id.Process, Context->Id.RequestId);
+
+    for (PageIndex = 0; PageIndex < In->NumberPages; PageIndex++)
+        XenIfaceDebugPrint(INFO, "> Ref %d\n", In->References[PageIndex]);
+
+    status = STATUS_INVALID_PARAMETER;
+    if (FindGnttabIrp(Fdo, &Context->Id) != NULL)
+        goto fail7;
+
+    status = XENBUS_GNTTAB(MapForeignPages,
+                           &Fdo->GnttabInterface,
+                           Context->RemoteDomain,
+                           Context->NumberPages,
+                           In->References,
+                           Context->Flags & XENIFACE_GNTTAB_READONLY,
+                           &Context->Address);
+
+    if (!NT_SUCCESS(status))
+        goto fail8;
+
+    status = STATUS_NO_MEMORY;
+    Context->KernelVa = MmMapIoSpace(Context->Address, Context->NumberPages * PAGE_SIZE, MmCached);
+    if (Context->KernelVa == NULL)
+        goto fail9;
+
+    status = STATUS_NO_MEMORY;
+    Context->Mdl = IoAllocateMdl(Context->KernelVa, Context->NumberPages * PAGE_SIZE, FALSE, FALSE, NULL);
+    if (Context->Mdl == NULL)
+        goto fail10;
+
+    MmBuildMdlForNonPagedPool(Context->Mdl);
+
+    // map into user mode
+#pragma prefast(suppress: 6320) // we want to catch all exceptions
+    __try {
+        Context->UserVa = MmMapLockedPagesSpecifyCache(Context->Mdl,
+                                                       UserMode,
+                                                       MmCached,
+                                                       NULL,
+                                                       FALSE,
+                                                       NormalPagePriority);
+    }
+    __except (EXCEPTION_EXECUTE_HANDLER) {
+        status = GetExceptionCode();
+        goto fail11;
+    }
+
+    status = STATUS_UNSUCCESSFUL;
+    if (Context->UserVa == NULL)
+        goto fail12;
+
+    XenIfaceDebugPrint(TRACE, "< Context %p, Irp %p, Address %p, KernelVa %p, UserVa %p\n",
+                       Context, Irp, Context->Address, Context->KernelVa, Context->UserVa);
+
+    // Pass the result to user mode.
+#pragma prefast(suppress: 6320) // we want to catch all exceptions
+    try {
+        ProbeForWrite(Out, OutLen, 1);
+        Out->Address = Context->UserVa;
+    } except(EXCEPTION_EXECUTE_HANDLER) {
+        status = GetExceptionCode();
+        XenIfaceDebugPrint(ERROR, "Exception 0x%lx while probing/writing output buffer at %p, size 0x%lx\n", status, Out, OutLen);
+        goto fail13;
+    }
+
+    // Insert the IRP/context into the pending queue.
+    // This also checks (again) if the request ID is unique for the calling process.
+    Irp->Tail.Overlay.DriverContext[0] = &Context->Id;
+    status = IoCsqInsertIrpEx(&Fdo->IrpQueue, Irp, NULL, &Context->Id);
+    if (!NT_SUCCESS(status))
+        goto fail14;
+
+    __FreeCapturedBuffer(In);
+
+    return STATUS_PENDING;
+
+fail14:
+    XenIfaceDebugPrint(ERROR, "Fail14\n");
+
+fail13:
+    XenIfaceDebugPrint(ERROR, "Fail13\n");
+    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
+
+fail12:
+    XenIfaceDebugPrint(ERROR, "Fail12\n");
+
+fail11:
+    XenIfaceDebugPrint(ERROR, "Fail11\n");
+    IoFreeMdl(Context->Mdl);
+
+fail10:
+    XenIfaceDebugPrint(ERROR, "Fail10\n");
+    MmUnmapIoSpace(Context->KernelVa, Context->NumberPages * PAGE_SIZE);
+
+fail9:
+    XenIfaceDebugPrint(ERROR, "Fail9\n");
+    ASSERT(NT_SUCCESS(XENBUS_GNTTAB(UnmapForeignPages,
+                                    &Fdo->GnttabInterface,
+                                    Context->Address
+                                    )));
+
+fail8:
+    XenIfaceDebugPrint(ERROR, "Fail8\n");
+
+fail7:
+    XenIfaceDebugPrint(ERROR, "Fail7\n");
+    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+
+fail6:
+    XenIfaceDebugPrint(ERROR, "Fail6\n");
+
+fail5:
+    XenIfaceDebugPrint(ERROR, "Fail5\n");
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+    __FreeCapturedBuffer(In);
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+_IRQL_requires_max_(APC_LEVEL)
+DECLSPEC_NOINLINE
+VOID
+GnttabFreeMap(
+    __in     PXENIFACE_FDO            Fdo,
+    __inout  PXENIFACE_MAP_CONTEXT    Context
+    )
+{
+    NTSTATUS status;
+
+    ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
+
+    XenIfaceDebugPrint(TRACE, "Context %p\n", Context);
+
+    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) {
+        ((PCHAR)Context->KernelVa)[Context->NotifyOffset] = 0;
+    }
+
+    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_PORT) {
+        status = EvtchnNotify(Fdo, Context->NotifyPort, NULL);
+
+        if (!NT_SUCCESS(status)) // non-fatal, we must free memory
+            XenIfaceDebugPrint(ERROR, "failed to notify port %lu: 0x%x\n", Context->NotifyPort, status);
+    }
+
+    // unmap from user address space
+    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
+
+    IoFreeMdl(Context->Mdl);
+
+    // unmap from system space
+    MmUnmapIoSpace(Context->KernelVa, Context->NumberPages * PAGE_SIZE);
+
+    // undo mapping
+    status = XENBUS_GNTTAB(UnmapForeignPages,
+                           &Fdo->GnttabInterface,
+                           Context->Address);
+
+    ASSERT(NT_SUCCESS(status));
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabUnmapForeignPages(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN In = Buffer;
+    PXENIFACE_MAP_CONTEXT Context = NULL;
+    XENIFACE_CONTEXT_ID Id;
+    PIRP PendingIrp;
+    PXENIFACE_CONTEXT_ID ContextId;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN) &&
+        OutLen != 0) {
+        goto fail1;
+    }
+
+    Id.Type = XENIFACE_CONTEXT_MAP;
+    Id.Process = PsGetCurrentProcess();
+    Id.RequestId = In->RequestId;
+
+    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process, Id.RequestId);
+
+    status = STATUS_NOT_FOUND;
+    PendingIrp = IoCsqRemoveNextIrp(&Fdo->IrpQueue, &Id);
+    if (PendingIrp == NULL)
+        goto fail2;
+
+    ContextId = PendingIrp->Tail.Overlay.DriverContext[0];
+    Context = CONTAINING_RECORD(ContextId, XENIFACE_MAP_CONTEXT, Id);
+    GnttabFreeMap(Fdo, Context);
+
+    PendingIrp->IoStatus.Status = STATUS_SUCCESS;
+    PendingIrp->IoStatus.Information = 0;
+    IoCompleteRequest(PendingIrp, IO_NO_INCREMENT);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
diff --git a/src/xeniface/ioctl_store.c b/src/xeniface/ioctl_store.c
new file mode 100644
index 0000000..5bd4649
--- /dev/null
+++ b/src/xeniface/ioctl_store.c
@@ -0,0 +1,608 @@
+/* Copyright (c) Citrix Systems Inc.
+ * Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
+ * 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 "driver.h"
+#include "ioctls.h"
+#include "xeniface_ioctls.h"
+#include "log.h"
+
+#define XENSTORE_ABS_PATH_MAX 3072
+#define XENSTORE_REL_PATH_MAX 2048
+
+static FORCEINLINE
+BOOLEAN
+__IsValidStr(
+    __in  PCHAR             Str,
+    __in  ULONG             Len
+    )
+{
+    for ( ; Len--; ++Str) {
+        if (*Str == '\0')
+            return TRUE;
+        if (!isprint((unsigned char)*Str))
+            break;
+    }
+    return FALSE;
+}
+
+static FORCEINLINE
+ULONG
+__MultiSzLen(
+    __in  PCHAR             Str,
+    __out PULONG            Count
+    )
+{
+    ULONG Length = 0;
+    if (Count)  *Count = 0;
+    do {
+        for ( ; *Str; ++Str, ++Length) ;
+        ++Str; ++Length;
+        if (*Count) ++(*Count);
+    } while (*Str);
+    return Length;
+}
+
+static FORCEINLINE
+VOID
+__DisplayMultiSz(
+    __in PCHAR              Caller,
+    __in PCHAR              Str
+    )
+{
+    PCHAR   Ptr;
+    ULONG   Idx;
+    ULONG   Len;
+
+    for (Ptr = Str, Idx = 0; *Ptr; ++Idx) {
+        Len = (ULONG)strlen(Ptr);
+        XenIfaceDebugPrint(TRACE, "|%s: [%d]=(%d)->\"%s\"\n", Caller, Idx, Len, Ptr);
+        Ptr += (Len + 1);
+    }
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRead(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS    status;
+    PCHAR       Value;
+    ULONG       Length;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen == 0)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (!__IsValidStr(Buffer, InLen))
+        goto fail2;
+
+    status = XENBUS_STORE(Read, &Fdo->StoreInterface, NULL, NULL, Buffer, &Value);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    Length = (ULONG)strlen(Value) + 1;
+
+    status = STATUS_BUFFER_OVERFLOW;
+    if (OutLen == 0) {
+        XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)\n", Buffer, Length);
+        goto done;
+    }
+
+    status = STATUS_INVALID_PARAMETER;
+    if (OutLen < Length)
+        goto fail4;
+
+    XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)->\"%s\"\n", Buffer, Length, Value);
+
+    RtlCopyMemory(Buffer, Value, Length);
+    Buffer[Length - 1] = 0;
+    status = STATUS_SUCCESS;
+
+done:
+    *Info = (ULONG_PTR)Length;
+    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
+    return status;
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")=(%d < %d)\n", Buffer, OutLen, Length);
+    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreWrite(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    )
+{
+    NTSTATUS    status;
+    PCHAR       Value;
+    ULONG       Length;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen == 0 || OutLen != 0)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (!__IsValidStr(Buffer, InLen))
+        goto fail2;
+
+    Length = (ULONG)strlen(Buffer) + 1;
+    Value = Buffer + Length;
+
+    if (!__IsValidStr(Value, InLen - Length))
+        goto fail3;
+
+    status = XENBUS_STORE(Printf, &Fdo->StoreInterface, NULL, NULL, Buffer, Value);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+    XenIfaceDebugPrint(TRACE, "(\"%s\"=\"%s\")\n", Buffer, Value);
+    return status;
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")\n", Value);
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreDirectory(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS    status;
+    PCHAR       Value;
+    ULONG       Length;
+    ULONG       Count;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen == 0)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (!__IsValidStr(Buffer, InLen))
+        goto fail2;
+
+    status = XENBUS_STORE(Directory, &Fdo->StoreInterface, NULL, NULL, Buffer, &Value);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    Length = __MultiSzLen(Value, &Count) + 1;
+
+    status = STATUS_BUFFER_OVERFLOW;
+    if (OutLen == 0) {
+        XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)(%d)\n", Buffer, Length, Count);
+        goto done;
+    }
+
+    status = STATUS_INVALID_PARAMETER;
+    if (OutLen < Length)
+        goto fail4;
+
+    XenIfaceDebugPrint(INFO, "(\"%s\")=(%d)(%d)\n", Buffer, Length, Count);
+#if DBG
+    __DisplayMultiSz(__FUNCTION__, Value);
+#endif
+
+    RtlCopyMemory(Buffer, Value, Length);
+    Buffer[Length - 2] = 0;
+    Buffer[Length - 1] = 0;
+    status = STATUS_SUCCESS;
+
+done:
+    *Info = (ULONG_PTR)Length;
+    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
+    return status;
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")=(%d < %d)\n", Buffer, OutLen, Length);
+    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRemove(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    )
+{
+    NTSTATUS    status;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen == 0 || OutLen != 0)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (!__IsValidStr(Buffer, InLen))
+        goto fail2;
+
+    status = XENBUS_STORE(Remove, &Fdo->StoreInterface, NULL, NULL, Buffer);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    XenIfaceDebugPrint(TRACE, "(\"%s\")\n", Buffer);
+    return status;
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+static
+PXENBUS_STORE_PERMISSION
+__ConvertPermissions(
+    __in  ULONG                       NumberPermissions,
+    __in  PXENIFACE_STORE_PERMISSION  XenifacePermissions
+)
+{
+    PXENBUS_STORE_PERMISSION          XenbusPermissions;
+    ULONG                             Index;
+
+    if (NumberPermissions > 255)
+        goto fail1;
+
+    XenbusPermissions = ExAllocatePoolWithTag(NonPagedPool, NumberPermissions * sizeof(XENBUS_STORE_PERMISSION), XENIFACE_POOL_TAG);
+    if (XenbusPermissions == NULL)
+        goto fail2;
+
+    // Currently XENIFACE_STORE_PERMISSION is the same as XENBUS_STORE_PERMISSION,
+    // but we convert them here in case something changes in the future.
+    for (Index = 0; Index < NumberPermissions; Index++) {
+        if ((XenifacePermissions[Index].Mask & ~XENIFACE_STORE_ALLOWED_PERMISSIONS) != 0)
+            goto fail3;
+
+        XenbusPermissions[Index].Domain = XenifacePermissions[Index].Domain;
+        XenbusPermissions[Index].Mask = (XENBUS_STORE_PERMISSION_MASK)XenifacePermissions[Index].Mask;
+    }
+
+    return XenbusPermissions;
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+    ExFreePoolWithTag(XenbusPermissions, XENIFACE_POOL_TAG);
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1\n");
+    return NULL;
+}
+
+static
+VOID
+__FreePermissions(
+    __in  PXENBUS_STORE_PERMISSION    Permissions
+    )
+{
+    ExFreePoolWithTag(Permissions, XENIFACE_POOL_TAG);
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreSetPermissions(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_STORE_SET_PERMISSIONS_IN In = Buffer;
+    PXENBUS_STORE_PERMISSION Permissions;
+    ULONG Index;
+    PCHAR Path;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen < sizeof(XENIFACE_STORE_SET_PERMISSIONS_IN) ||
+        OutLen != 0) {
+        goto fail1;
+    }
+
+    if (InLen != (ULONG)FIELD_OFFSET(XENIFACE_STORE_SET_PERMISSIONS_IN, Permissions[In->NumberPermissions]))
+        goto fail2;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (In->PathLength == 0 ||
+        In->PathLength > XENSTORE_ABS_PATH_MAX) {
+        goto fail3;
+    }
+
+    Permissions = __ConvertPermissions(In->NumberPermissions, In->Permissions);
+    if (Permissions == NULL)
+        goto fail4;
+
+    status = __CaptureUserBuffer(In->Path, In->PathLength, &Path);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
+    Path[In->PathLength - 1] = 0;
+    XenIfaceDebugPrint(TRACE, "> Path '%s', NumberPermissions %lu\n", Path, In->NumberPermissions);
+
+    for (Index = 0; Index < In->NumberPermissions; Index++) {
+        XenIfaceDebugPrint(TRACE, "> %lu: Domain %d, Mask 0x%x\n",
+                           Index, Permissions[Index].Domain, Permissions[Index].Mask);
+    }
+
+    status = XENBUS_STORE(PermissionsSet,
+                          &Fdo->StoreInterface,
+                          NULL, // transaction
+                          NULL, // prefix
+                          Path,
+                          Permissions,
+                          In->NumberPermissions);
+
+    if (!NT_SUCCESS(status))
+        goto fail6;
+
+    __FreeCapturedBuffer(Path);
+    return status;
+
+fail6:
+    XenIfaceDebugPrint(ERROR, "Fail6\n");
+    __FreeCapturedBuffer(Path);
+
+fail5:
+    XenIfaceDebugPrint(ERROR, "Fail5\n");
+    __FreePermissions(Permissions);
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreAddWatch(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_STORE_ADD_WATCH_IN In = Buffer;
+    PXENIFACE_STORE_ADD_WATCH_OUT Out = Buffer;
+    PCHAR Path;
+    PXENIFACE_STORE_CONTEXT Context;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_STORE_ADD_WATCH_IN) ||
+        OutLen != sizeof(XENIFACE_STORE_ADD_WATCH_OUT)) {
+        goto fail1;
+    }
+
+    status = STATUS_INVALID_PARAMETER;
+    if (In->PathLength == 0 ||
+        In->PathLength > XENSTORE_ABS_PATH_MAX) {
+        goto fail2;
+    }
+
+    status = __CaptureUserBuffer(In->Path, In->PathLength, &Path);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    Path[In->PathLength - 1] = 0;
+
+    status = STATUS_NO_MEMORY;
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_STORE_CONTEXT), XENIFACE_POOL_TAG);
+    if (Context == NULL)
+        goto fail4;
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
+
+    Context->FileObject = FileObject;
+
+    status = ObReferenceObjectByHandle(In->Event,
+                                       EVENT_MODIFY_STATE,
+                                       *ExEventObjectType,
+                                       UserMode,
+                                       &Context->Event,
+                                       NULL);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
+    XenIfaceDebugPrint(TRACE, "> Path '%s', Event %p, FO %p\n", Path, In->Event, FileObject);
+
+    status = XENBUS_STORE(WatchAdd,
+                          &Fdo->StoreInterface,
+                          NULL, // prefix
+                          Path,
+                          Context->Event,
+                          &Context->Watch);
+
+    if (!NT_SUCCESS(status))
+        goto fail6;
+
+    __FreeCapturedBuffer(Path);
+
+    ExInterlockedInsertTailList(&Fdo->StoreWatchList, &Context->Entry, &Fdo->StoreWatchLock);
+
+    XenIfaceDebugPrint(TRACE, "< Context %p, Watch %p\n", Context, Context->Watch);
+
+    Out->Context = Context;
+    *Info = sizeof(XENIFACE_STORE_ADD_WATCH_OUT);
+
+    return status;
+
+fail6:
+    XenIfaceDebugPrint(ERROR, "Fail6\n");
+    ObDereferenceObject(Context->Event);
+
+fail5:
+    XenIfaceDebugPrint(ERROR, "Fail5\n");
+    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+    __FreeCapturedBuffer(Path);
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+_IRQL_requires_max_(DISPATCH_LEVEL)
+VOID
+StoreFreeWatch(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_STORE_CONTEXT Context
+    )
+{
+    NTSTATUS status;
+
+    XenIfaceDebugPrint(TRACE, "Context %p, Watch %p, FO %p\n",
+                       Context, Context->Watch, Context->FileObject);
+
+    status = XENBUS_STORE(WatchRemove,
+                          &Fdo->StoreInterface,
+                          Context->Watch);
+
+    ASSERT(NT_SUCCESS(status)); // this is fatal since we'd leave an active watch without cleaning it up
+
+    ObDereferenceObject(Context->Event);
+    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRemoveWatch(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_STORE_REMOVE_WATCH_IN In = Buffer;
+    PXENIFACE_STORE_CONTEXT Context = NULL;
+    KIRQL Irql;
+    PLIST_ENTRY Node;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_STORE_REMOVE_WATCH_IN) ||
+        OutLen != 0) {
+        goto fail1;
+    }
+
+    XenIfaceDebugPrint(TRACE, "> Context %p, FO %p\n", In->Context, FileObject);
+
+    KeAcquireSpinLock(&Fdo->StoreWatchLock, &Irql);
+    Node = Fdo->StoreWatchList.Flink;
+    while (Node->Flink != Fdo->StoreWatchList.Flink) {
+        Context = CONTAINING_RECORD(Node, XENIFACE_STORE_CONTEXT, Entry);
+
+        Node = Node->Flink;
+        if (Context != In->Context ||
+            Context->FileObject != FileObject) {
+            continue;
+        }
+
+        RemoveEntryList(&Context->Entry);
+        break;
+    }
+    KeReleaseSpinLock(&Fdo->StoreWatchLock, Irql);
+
+    status = STATUS_NOT_FOUND;
+    if (Context == NULL || Context != In->Context)
+        goto fail2;
+
+    StoreFreeWatch(Fdo, Context);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
diff --git a/src/xeniface/ioctls.c b/src/xeniface/ioctls.c
index ead7f9b..b306a45 100644
--- a/src/xeniface/ioctls.c
+++ b/src/xeniface/ioctls.c
@@ -1,4 +1,5 @@
 /* Copyright (c) Citrix Systems Inc.
+ * Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, 
@@ -29,266 +30,123 @@
  * SUCH DAMAGE.
  */
 
-
 #include "driver.h"
 #include "ioctls.h"
-#include "..\..\include\xeniface_ioctls.h"
+#include "xeniface_ioctls.h"
 #include "log.h"
 
-static FORCEINLINE BOOLEAN
-__IsValidStr(
-    __in  PCHAR             Str,
-    __in  ULONG             Len
+NTSTATUS
+__CaptureUserBuffer(
+    __in  PVOID Buffer,
+    __in  ULONG Length,
+    __out PVOID *CapturedBuffer
     )
 {
-    for ( ; Len--; ++Str) {
-        if (*Str == '\0')
-            return TRUE;
-        if (!isprint((unsigned char)*Str))
-            break;
+    NTSTATUS Status;
+    PVOID TempBuffer = NULL;
+
+    if (Length == 0) {
+        *CapturedBuffer = NULL;
+        return STATUS_SUCCESS;
     }
-    return FALSE;
-}
-static FORCEINLINE ULONG
-__MultiSzLen(
-    __in  PCHAR             Str,
-    __out PULONG            Count
-    )
-{
-    ULONG Length = 0;
-    if (Count)  *Count = 0;
-    do {
-        for ( ; *Str; ++Str, ++Length) ;
-        ++Str; ++Length;
-        if (*Count) ++(*Count);
-    } while (*Str);
-    return Length;
-}
-static FORCEINLINE VOID
-__DisplayMultiSz(
-    __in PCHAR              Caller,
-    __in PCHAR              Str
-    )
-{
-    PCHAR   Ptr;
-    ULONG   Idx;
-    ULONG   Len;
-
-    for (Ptr = Str, Idx = 0; *Ptr; ++Idx) {
-        Len = (ULONG)strlen(Ptr);
-        XenIfaceDebugPrint(INFO, "|%s: [%d]=(%d)->\"%s\"\n", Caller, Idx, Len, Ptr);
-        Ptr += (Len + 1);
+
+    Status = STATUS_NO_MEMORY;
+    TempBuffer = ExAllocatePoolWithTag(NonPagedPool, Length, XENIFACE_POOL_TAG);
+    if (TempBuffer == NULL)
+        return STATUS_INSUFFICIENT_RESOURCES;
+
+    Status = STATUS_SUCCESS;
+
+#pragma prefast(suppress: 6320) // we want to catch all exceptions
+    try {
+        ProbeForRead(Buffer, Length, 1);
+        RtlCopyMemory(TempBuffer, Buffer, Length);
+    } except(EXCEPTION_EXECUTE_HANDLER) {
+        XenIfaceDebugPrint(ERROR, "Exception while probing/reading buffer at %p, size 0x%lx\n", Buffer, Length);
+        ExFreePoolWithTag(TempBuffer, XENIFACE_POOL_TAG);
+        TempBuffer = NULL;
+        Status = GetExceptionCode();
     }
-}
 
+    *CapturedBuffer = TempBuffer;
 
-static DECLSPEC_NOINLINE NTSTATUS
-IoctlRead(
-    __in  PXENIFACE_FDO         Fdo,
-    __in  PCHAR             Buffer,
-    __in  ULONG             InLen,
-    __in  ULONG             OutLen,
-    __out PULONG_PTR        Info
-    )
-{
-    NTSTATUS    status;
-    PCHAR       Value;
-    ULONG       Length;
-
-    status = STATUS_INVALID_BUFFER_SIZE;
-    if (InLen == 0)
-        goto fail1;
-
-    status = STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
-        goto fail2;
-
-    status = XENBUS_STORE(Read, &Fdo->StoreInterface, NULL, NULL, Buffer, &Value);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
-    Length = (ULONG)strlen(Value) + 1;
-
-    status = STATUS_BUFFER_OVERFLOW;
-    if (OutLen == 0) {
-        XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)\n", __FUNCTION__, Buffer, Length);
-        goto done;
-    } 
-    
-    status = STATUS_INVALID_PARAMETER;
-    if (OutLen < Length)
-        goto fail4;
-
-    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)->\"%s\"\n", __FUNCTION__, Buffer, Length, Value);
-
-    RtlCopyMemory(Buffer, Value, Length);
-    Buffer[Length - 1] = 0;
-    status = STATUS_SUCCESS;
-
-done:
-    *Info = (ULONG_PTR)Length;
-    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
-    return status;
-
-fail4:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")=(%d < %d)\n", __FUNCTION__, Buffer, OutLen, Length);
-    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
-fail3:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__, Buffer);
-fail2:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
-fail1:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__, status);
-    return status;
+    return Status;
 }
 
-static DECLSPEC_NOINLINE NTSTATUS
-IoctlWrite(
-    __in  PXENIFACE_FDO         Fdo,
-    __in  PCHAR             Buffer,
-    __in  ULONG             InLen,
-    __in  ULONG             OutLen
+VOID
+__FreeCapturedBuffer(
+    __in  PVOID CapturedBuffer
     )
 {
-    NTSTATUS    status;
-    PCHAR       Value;
-    ULONG       Length;
-
-    status = STATUS_INVALID_BUFFER_SIZE;
-    if (InLen == 0 || OutLen != 0)
-        goto fail1;
-
-    status = STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
-        goto fail2;
-
-    Length = (ULONG)strlen(Buffer) + 1;
-    Value = Buffer + Length;
-
-    if (!__IsValidStr(Value, InLen - Length))
-        goto fail3;
-
-    status = XENBUS_STORE(Printf, &Fdo->StoreInterface, NULL, NULL, Buffer, Value);
-    if (!NT_SUCCESS(status))
-        goto fail4;
-
-    XenIfaceDebugPrint(INFO, "|%s: (\"%s\"=\"%s\")\n", __FUNCTION__, Buffer, Value);
-    return status;
-
-fail4:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")\n", __FUNCTION__, Value);
-fail3:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__, Buffer);
-fail2:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
-fail1:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__, status);
-    return status;
+    if (CapturedBuffer != NULL) {
+        ExFreePoolWithTag(CapturedBuffer, XENIFACE_POOL_TAG);
+    }
 }
 
-static DECLSPEC_NOINLINE NTSTATUS
-IoctlDirectory(
-    __in  PXENIFACE_FDO         Fdo,
-    __in  PCHAR             Buffer,
-    __in  ULONG             InLen,
-    __in  ULONG             OutLen,
-    __out PULONG_PTR        Info
+// Cleanup store watches and event channels, called on file object close.
+_IRQL_requires_(PASSIVE_LEVEL) // EvtchnFree calls KeFlushQueuedDpcs
+VOID
+XenIfaceCleanup(
+    __in  PXENIFACE_FDO Fdo,
+    __in  PFILE_OBJECT  FileObject
     )
 {
-    NTSTATUS    status;
-    PCHAR       Value;
-    ULONG       Length;
-    ULONG       Count;
-
-    status = STATUS_INVALID_BUFFER_SIZE;
-    if (InLen == 0)
-        goto fail1;
-
-    status = STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
-        goto fail2;
-
-    status = XENBUS_STORE(Directory, &Fdo->StoreInterface, NULL, NULL, Buffer, &Value);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
-    Length = __MultiSzLen(Value, &Count) + 1;
-
-    status = STATUS_BUFFER_OVERFLOW;
-    if (OutLen == 0) {
-        XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)(%d)\n", __FUNCTION__, Buffer, Length, Count);
-        goto done;
-    } 
-
-    status = STATUS_INVALID_PARAMETER;
-    if (OutLen < Length)
-        goto fail4;
-
-    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)(%d)\n", __FUNCTION__, Buffer, Length, Count);
-#if DBG
-    __DisplayMultiSz(__FUNCTION__, Value);
-#endif
-
-    RtlCopyMemory(Buffer, Value, Length);
-    Buffer[Length - 2] = 0;
-    Buffer[Length - 1] = 0;
-    status = STATUS_SUCCESS;
-
-done:
-    *Info = (ULONG_PTR)Length;
-    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
-    return status;
-
-fail4:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")=(%d < %d)\n", __FUNCTION__, Buffer, OutLen, Length);
-    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
-fail3:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__, Buffer);
-fail2:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
-fail1:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__, status);
-    return status;
-}
+    PLIST_ENTRY Node;
+    PXENIFACE_STORE_CONTEXT StoreContext;
+    PXENIFACE_EVTCHN_CONTEXT EvtchnContext;
+    KIRQL Irql;
+    LIST_ENTRY ToFree;
+
+    XenIfaceDebugPrint(TRACE, "FO %p, IRQL %d, Cpu %lu\n", FileObject, KeGetCurrentIrql(), KeGetCurrentProcessorNumber());
+
+    // store watches
+    KeAcquireSpinLock(&Fdo->StoreWatchLock, &Irql);
+    Node = Fdo->StoreWatchList.Flink;
+    while (Node->Flink != Fdo->StoreWatchList.Flink) {
+        StoreContext = CONTAINING_RECORD(Node, XENIFACE_STORE_CONTEXT, Entry);
+
+        Node = Node->Flink;
+        if (StoreContext->FileObject != FileObject)
+            continue;
+
+        XenIfaceDebugPrint(TRACE, "Store context %p\n", StoreContext);
+        RemoveEntryList(&StoreContext->Entry);
+        StoreFreeWatch(Fdo, StoreContext);
+    }
+    KeReleaseSpinLock(&Fdo->StoreWatchLock, Irql);
+
+    // event channels
+    InitializeListHead(&ToFree);
+    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
+    Node = Fdo->EvtchnList.Flink;
+    while (Node->Flink != Fdo->EvtchnList.Flink) {
+        EvtchnContext = CONTAINING_RECORD(Node, XENIFACE_EVTCHN_CONTEXT, Entry);
+
+        Node = Node->Flink;
+        if (EvtchnContext->FileObject != FileObject)
+            continue;
+
+        XenIfaceDebugPrint(TRACE, "Evtchn context %p\n", EvtchnContext);
+        RemoveEntryList(&EvtchnContext->Entry);
+        // EvtchnFree requires PASSIVE_LEVEL and we're inside a lock
+        InsertTailList(&ToFree, &EvtchnContext->Entry);
+    }
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
 
-static DECLSPEC_NOINLINE NTSTATUS
-IoctlRemove(
-    __in  PXENIFACE_FDO         Fdo,
-    __in  PCHAR             Buffer,
-    __in  ULONG             InLen,
-    __in  ULONG             OutLen
-    )
-{
-    NTSTATUS    status;
-
-    status = STATUS_INVALID_BUFFER_SIZE;
-    if (InLen == 0 || OutLen != 0)
-        goto fail1;
-
-    status = STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
-        goto fail2;
-
-    status = XENBUS_STORE(Remove, &Fdo->StoreInterface, NULL, NULL, Buffer);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
-    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")\n", __FUNCTION__, Buffer);
-    return status;
-
-fail3:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__, Buffer);
-fail2:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
-fail1:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__, status);
-    return status;
+    Node = ToFree.Flink;
+    while (Node->Flink != ToFree.Flink) {
+        EvtchnContext = CONTAINING_RECORD(Node, XENIFACE_EVTCHN_CONTEXT, Entry);
+        Node = Node->Flink;
+
+        RemoveEntryList(&EvtchnContext->Entry);
+        EvtchnFree(Fdo, EvtchnContext);
+    }
 }
 
 NTSTATUS
-XenIFaceIoctl(
-    __in  PXENIFACE_FDO         Fdo,
-    __in  PIRP              Irp
+XenIfaceIoctl(
+    __in     PXENIFACE_FDO     Fdo,
+    __inout  PIRP              Irp
     )
 {
     NTSTATUS            status;
@@ -302,20 +160,71 @@ XenIFaceIoctl(
         goto done;
 
     switch (Stack->Parameters.DeviceIoControl.IoControlCode) {
+        // store
     case IOCTL_XENIFACE_STORE_READ:
-        status = IoctlRead(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp->IoStatus.Information);
+        status = IoctlStoreRead(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp->IoStatus.Information);
         break;
 
     case IOCTL_XENIFACE_STORE_WRITE:
-        status = IoctlWrite(Fdo, (PCHAR)Buffer, InLen, OutLen);
+        status = IoctlStoreWrite(Fdo, (PCHAR)Buffer, InLen, OutLen);
         break;
 
     case IOCTL_XENIFACE_STORE_DIRECTORY:
-        status = IoctlDirectory(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp->IoStatus.Information);
+        status = IoctlStoreDirectory(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp->IoStatus.Information);
         break;
 
     case IOCTL_XENIFACE_STORE_REMOVE:
-        status = IoctlRemove(Fdo, (PCHAR)Buffer, InLen, OutLen);
+        status = IoctlStoreRemove(Fdo, (PCHAR)Buffer, InLen, OutLen);
+        break;
+
+    case IOCTL_XENIFACE_STORE_SET_PERMISSIONS:
+        status = IoctlStoreSetPermissions(Fdo, Buffer, InLen, OutLen);
+        break;
+
+    case IOCTL_XENIFACE_STORE_ADD_WATCH:
+        status = IoctlStoreAddWatch(Fdo, Buffer, InLen, OutLen, Stack->FileObject, &Irp->IoStatus.Information);
+        break;
+
+    case IOCTL_XENIFACE_STORE_REMOVE_WATCH:
+        status = IoctlStoreRemoveWatch(Fdo, Buffer, InLen, OutLen, Stack->FileObject);
+        break;
+
+        // evtchn
+    case IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND:
+        status = IoctlEvtchnBindUnbound(Fdo, Buffer, InLen, OutLen, Stack->FileObject, &Irp->IoStatus.Information);
+        break;
+
+    case IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN:
+        status = IoctlEvtchnBindInterdomain(Fdo, Buffer, InLen, OutLen, Stack->FileObject, &Irp->IoStatus.Information);
+        break;
+
+    case IOCTL_XENIFACE_EVTCHN_CLOSE:
+        status = IoctlEvtchnClose(Fdo, Buffer, InLen, OutLen, Stack->FileObject);
+        break;
+
+    case IOCTL_XENIFACE_EVTCHN_NOTIFY:
+        status = IoctlEvtchnNotify(Fdo, Buffer, InLen, OutLen, Stack->FileObject);
+        break;
+
+    case IOCTL_XENIFACE_EVTCHN_UNMASK:
+        status = IoctlEvtchnUnmask(Fdo, Buffer, InLen, OutLen, Stack->FileObject);
+        break;
+
+        // gnttab
+    case IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS: // this is a METHOD_NEITHER IOCTL
+        status = IoctlGnttabPermitForeignAccess(Fdo, Stack->Parameters.DeviceIoControl.Type3InputBuffer, InLen, OutLen, Irp);
+        break;
+
+    case IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS:
+        status = IoctlGnttabRevokeForeignAccess(Fdo, Buffer, InLen, OutLen);
+        break;
+
+    case IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES: // this is a METHOD_NEITHER IOCTL
+        status = IoctlGnttabMapForeignPages(Fdo, Stack->Parameters.DeviceIoControl.Type3InputBuffer, InLen, OutLen, Irp);
+        break;
+
+    case IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES:
+        status = IoctlGnttabUnmapForeignPages(Fdo, Buffer, InLen, OutLen);
         break;
 
     default:
@@ -327,7 +236,8 @@ done:
 
     Irp->IoStatus.Status = status;
 
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    if (status != STATUS_PENDING)
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
     return status;
 }
diff --git a/src/xeniface/ioctls.h b/src/xeniface/ioctls.h
index 63de9eb..225ed7f 100644
--- a/src/xeniface/ioctls.h
+++ b/src/xeniface/ioctls.h
@@ -1,4 +1,5 @@
 /* Copyright (c) Citrix Systems Inc.
+ * Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, 
@@ -32,10 +33,333 @@
 #ifndef _IOCTLS_H_
 #define _IOCTLS_H_
 
+#include "xeniface_ioctls.h"
+
+typedef enum _XENIFACE_CONTEXT_TYPE {
+    XENIFACE_CONTEXT_GRANT = 1,
+    XENIFACE_CONTEXT_MAP
+} XENIFACE_CONTEXT_TYPE;
+
+typedef struct _XENIFACE_CONTEXT_ID {
+    XENIFACE_CONTEXT_TYPE  Type;
+    ULONG                  RequestId;
+    PEPROCESS              Process;
+} XENIFACE_CONTEXT_ID, *PXENIFACE_CONTEXT_ID;
+
+typedef struct _XENIFACE_STORE_CONTEXT {
+    LIST_ENTRY             Entry;
+    PXENBUS_STORE_WATCH    Watch;
+    PKEVENT                Event;
+    PVOID                  FileObject;
+} XENIFACE_STORE_CONTEXT, *PXENIFACE_STORE_CONTEXT;
+
+typedef struct _XENIFACE_EVTCHN_CONTEXT {
+    LIST_ENTRY             Entry;
+    PXENBUS_EVTCHN_CHANNEL Channel;
+    ULONG                  LocalPort;
+    PKEVENT                Event;
+    PXENIFACE_FDO          Fdo;
+    PVOID                  FileObject;
+} XENIFACE_EVTCHN_CONTEXT, *PXENIFACE_EVTCHN_CONTEXT;
+
+typedef struct _XENIFACE_GRANT_CONTEXT {
+    XENIFACE_CONTEXT_ID        Id;
+    LIST_ENTRY                 Entry;
+    PXENBUS_GNTTAB_ENTRY       *Grants;
+    USHORT                     RemoteDomain;
+    ULONG                      NumberPages;
+    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
+    ULONG                      NotifyOffset;
+    ULONG                      NotifyPort;
+    PVOID                      KernelVa;
+    PVOID                      UserVa;
+    PMDL                       Mdl;
+} XENIFACE_GRANT_CONTEXT, *PXENIFACE_GRANT_CONTEXT;
+
+typedef struct _XENIFACE_MAP_CONTEXT {
+    XENIFACE_CONTEXT_ID        Id;
+    LIST_ENTRY                 Entry;
+    USHORT                     RemoteDomain;
+    ULONG                      NumberPages;
+    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
+    ULONG                      NotifyOffset;
+    ULONG                      NotifyPort;
+    PHYSICAL_ADDRESS           Address;
+    PVOID                      KernelVa;
+    PVOID                      UserVa;
+    PMDL                       Mdl;
+} XENIFACE_MAP_CONTEXT, *PXENIFACE_MAP_CONTEXT;
+
 NTSTATUS
-XenIFaceIoctl(
-    __in  PXENIFACE_FDO         Fdo,
-    __in  PIRP              Irp
+__CaptureUserBuffer(
+    __in  PVOID Buffer,
+    __in  ULONG Length,
+    __out PVOID *CapturedBuffer
+    );
+
+VOID
+__FreeCapturedBuffer(
+    __in  PVOID CapturedBuffer
+    );
+
+NTSTATUS
+XenIfaceIoctl(
+    __in     PXENIFACE_FDO     Fdo,
+    __inout  PIRP              Irp
+    );
+
+_IRQL_requires_(PASSIVE_LEVEL)
+VOID
+XenIfaceCleanup(
+    __in  PXENIFACE_FDO Fdo,
+    __in  PFILE_OBJECT  FileObject
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRead(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreWrite(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreDirectory(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRemove(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreSetPermissions(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreAddWatch(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRemoveWatch(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    );
+
+_IRQL_requires_max_(DISPATCH_LEVEL)
+VOID
+StoreFreeWatch(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_STORE_CONTEXT Context
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnBindUnbound(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnBindInterdomain(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnClose(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnNotify(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnUnmask(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    );
+
+_Requires_lock_not_held_(Fdo->EvtchnLock)
+DECLSPEC_NOINLINE
+NTSTATUS
+EvtchnNotify(
+    __in      PXENIFACE_FDO Fdo,
+    __in      ULONG         LocalPort,
+    __in_opt  PFILE_OBJECT  FileObject
+    );
+
+_Function_class_(KDEFERRED_ROUTINE)
+_IRQL_requires_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+VOID
+EvtchnNotificationDpc(
+    __in      PKDPC Dpc,
+    __in_opt  PVOID Context,
+    __in_opt  PVOID Argument1,
+    __in_opt  PVOID Argument2
+    );
+
+_IRQL_requires_(PASSIVE_LEVEL)
+VOID
+EvtchnFree(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_EVTCHN_CONTEXT Context
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabPermitForeignAccess(
+    __in     PXENIFACE_FDO  Fdo,
+    __in     PVOID          Buffer,
+    __in     ULONG          InLen,
+    __in     ULONG          OutLen,
+    __inout  PIRP           Irp
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabGetGrantResult(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabRevokeForeignAccess(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabMapForeignPages(
+    __in     PXENIFACE_FDO     Fdo,
+    __in     PVOID             Buffer,
+    __in     ULONG             InLen,
+    __in     ULONG             OutLen,
+    __inout  PIRP              Irp
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabGetMapResult(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabUnmapForeignPages(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    );
+
+_Acquires_exclusive_lock_(((PXENIFACE_FDO)Argument)->GnttabCacheLock)
+_IRQL_requires_(DISPATCH_LEVEL)
+VOID
+GnttabAcquireLock(
+    __in  PVOID Argument
+    );
+
+_Releases_exclusive_lock_(((PXENIFACE_FDO)Argument)->GnttabCacheLock)
+_IRQL_requires_(DISPATCH_LEVEL)
+VOID
+GnttabReleaseLock(
+    __in  PVOID Argument
+    );
+
+_Function_class_(IO_WORKITEM_ROUTINE)
+VOID
+CompleteGnttabIrp(
+    __in      PDEVICE_OBJECT DeviceObject,
+    __in_opt  PVOID          Context
+    );
+
+_IRQL_requires_max_(APC_LEVEL)
+VOID
+GnttabFreeGrant(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_GRANT_CONTEXT Context
+    );
+
+_IRQL_requires_max_(APC_LEVEL)
+VOID
+GnttabFreeMap(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_MAP_CONTEXT Context
     );
 
 #endif // _IOCTLS_H_
diff --git a/src/xeniface/irp_queue.c b/src/xeniface/irp_queue.c
new file mode 100644
index 0000000..5184726
--- /dev/null
+++ b/src/xeniface/irp_queue.c
@@ -0,0 +1,162 @@
+/* Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
+ * 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 "driver.h"
+#include "irp_queue.h"
+#include "log.h"
+#include "ioctls.h"
+
+// Cancel-safe IRP queue implementation
+
+NTSTATUS
+CsqInsertIrpEx(
+    _In_  PIO_CSQ Csq,
+    _In_  PIRP    Irp,
+    _In_  PVOID   InsertContext // PXENIFACE_CONTEXT_ID
+    )
+{
+    PXENIFACE_FDO Fdo;
+
+    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
+
+    // Fail if a request with the same ID already exists.
+    if (CsqPeekNextIrp(Csq, NULL, InsertContext) != NULL)
+        return STATUS_INVALID_PARAMETER;
+
+    InsertTailList(&Fdo->IrpList, &Irp->Tail.Overlay.ListEntry);
+    return STATUS_SUCCESS;
+}
+
+VOID
+CsqRemoveIrp(
+    _In_  PIO_CSQ Csq,
+    _In_  PIRP    Irp
+    )
+{
+    UNREFERENCED_PARAMETER(Csq);
+
+    RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
+}
+
+PIRP
+CsqPeekNextIrp(
+    _In_      PIO_CSQ Csq,
+    _In_opt_  PIRP    Irp,
+    _In_opt_  PVOID   PeekContext // PXENIFACE_CONTEXT_ID
+    )
+{
+    PXENIFACE_FDO        Fdo;
+    PIRP                 NextIrp = NULL;
+    PLIST_ENTRY          Head, NextEntry;
+    PXENIFACE_CONTEXT_ID Id, TargetId;
+
+    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
+    TargetId = PeekContext;
+    Head = &Fdo->IrpList;
+
+    // If the IRP is NULL, we will start peeking from the list head,
+    // else we will start from that IRP onwards. This is done under the
+    // assumption that new IRPs are always inserted at the tail.
+
+    if (Irp == NULL) {
+        NextEntry = Head->Flink;
+    } else {
+        NextEntry = Irp->Tail.Overlay.ListEntry.Flink;
+    }
+
+    while (NextEntry != Head) {
+        NextIrp = CONTAINING_RECORD(NextEntry, IRP, Tail.Overlay.ListEntry);
+
+        if (PeekContext) {
+            Id = NextIrp->Tail.Overlay.DriverContext[0];
+            if (Id->RequestId == TargetId->RequestId && Id->Process == TargetId->Process)
+                break;
+        } else {
+            break;
+        }
+        NextIrp = NULL;
+        NextEntry = NextEntry->Flink;
+    }
+
+    return NextIrp;
+}
+
+_IRQL_raises_(DISPATCH_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_Acquires_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)->IrpQueueLock)
+VOID
+CsqAcquireLock(
+    _In_                                       PIO_CSQ Csq,
+    _Out_ _At_(*Irql, _Post_ _IRQL_saves_)     PKIRQL  Irql
+    )
+{
+    PXENIFACE_FDO Fdo;
+
+    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
+
+    KeAcquireSpinLock(&Fdo->IrpQueueLock, Irql);
+}
+
+_IRQL_requires_(DISPATCH_LEVEL)
+_Releases_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)->IrpQueueLock)
+VOID
+CsqReleaseLock(
+    _In_                    PIO_CSQ Csq,
+    _In_ _IRQL_restores_    KIRQL   Irql
+    )
+{
+    PXENIFACE_FDO Fdo;
+
+    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
+
+    KeReleaseSpinLock(&Fdo->IrpQueueLock, Irql);
+}
+
+_IRQL_requires_max_(DISPATCH_LEVEL)
+VOID
+CsqCompleteCanceledIrp(
+    _In_  PIO_CSQ Csq,
+    _In_  PIRP    Irp
+    )
+{
+    PXENIFACE_FDO Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
+    PIO_WORKITEM WorkItem;
+
+    XenIfaceDebugPrint(TRACE, "Irp %p, IRQL %d\n",
+                       Irp, KeGetCurrentIrql());
+
+    // This is not guaranteed to run at PASSIVE_LEVEL, so queue a work item
+    // to perform actual cleanup/IRP completion.
+
+    WorkItem = IoAllocateWorkItem(Fdo->Dx->DeviceObject);
+    Irp->Tail.Overlay.DriverContext[1] = WorkItem; // store so the work item can free it
+    IoQueueWorkItem(WorkItem, CompleteGnttabIrp, DelayedWorkQueue, Irp);
+}
diff --git a/src/xeniface/irp_queue.h b/src/xeniface/irp_queue.h
new file mode 100644
index 0000000..47c36dc
--- /dev/null
+++ b/src/xeniface/irp_queue.h
@@ -0,0 +1,81 @@
+/* Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
+ * 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 _IRP_QUEUE_H_
+#define _IRP_QUEUE_H_
+
+#include <ntddk.h>
+
+NTSTATUS
+CsqInsertIrpEx(
+    _In_  PIO_CSQ Csq,
+    _In_  PIRP    Irp,
+    _In_  PVOID   InsertContext
+    );
+
+VOID
+CsqRemoveIrp(
+    _In_  PIO_CSQ Csq,
+    _In_  PIRP    Irp
+    );
+
+PIRP
+CsqPeekNextIrp(
+    _In_      PIO_CSQ Csq,
+    _In_opt_  PIRP    Irp,
+    _In_opt_  PVOID   PeekContext // PXENIFACE_CONTEXT_ID
+    );
+
+_IRQL_raises_(DISPATCH_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_Acquires_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)->IrpQueueLock)
+VOID
+CsqAcquireLock(
+    _In_                                       PIO_CSQ Csq,
+    _Out_ _At_(*Irql, _Post_ _IRQL_saves_)     PKIRQL  Irql
+    );
+
+_IRQL_requires_(DISPATCH_LEVEL)
+_Releases_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)->IrpQueueLock)
+VOID
+CsqReleaseLock(
+    _In_                    PIO_CSQ Csq,
+    _In_ _IRQL_restores_    KIRQL   Irql
+    );
+
+_IRQL_requires_max_(DISPATCH_LEVEL)
+VOID
+CsqCompleteCanceledIrp(
+    _In_  PIO_CSQ             Csq,
+    _In_  PIRP                Irp
+    );
+
+#endif
diff --git a/vs2012/xeniface/xeniface.vcxproj b/vs2012/xeniface/xeniface.vcxproj
index a3472ba..fadc1d1 100644
--- a/vs2012/xeniface/xeniface.vcxproj
+++ b/vs2012/xeniface/xeniface.vcxproj
@@ -73,12 +73,16 @@
 		<FilesToPackage Include="@(Inf->'%(CopyOutput)')" Condition="'@(Inf)'!=''" />
 	</ItemGroup>
 	<ItemGroup>
-	        <ClCompile Include="../../src/xeniface/ioctls.c" />
-                <ClCompile Include="../../src/xeniface/wmi.c" />
-                <ClCompile Include="../../src/xeniface/driver.c" />
-                <ClCompile Include="../../src/xeniface/fdo.c" />
-                <ClCompile Include="../../src/xeniface/registry.c" />
-                <ClCompile Include="../../src\xeniface/thread.c" />
+		<ClCompile Include="..\..\src\xeniface\ioctls.c" />
+		<ClCompile Include="..\..\src\xeniface\wmi.c" />
+		<ClCompile Include="..\..\src\xeniface\driver.c" />
+		<ClCompile Include="..\..\src\xeniface\fdo.c" />
+		<ClCompile Include="..\..\src\xeniface\registry.c" />
+		<ClCompile Include="..\..\src\xeniface\thread.c" />
+		<ClCompile Include="..\..\src\xeniface\ioctl_evtchn.c" />
+		<ClCompile Include="..\..\src\xeniface\ioctl_gnttab.c" />
+		<ClCompile Include="..\..\src\xeniface\ioctl_store.c" />
+		<ClCompile Include="..\..\src\xeniface\irp_queue.c" />
 	</ItemGroup>
         <ItemGroup>
                 <Mofcomp Include="../../src/xeniface/wmi.mof">
@@ -96,5 +100,19 @@
 	<ItemGroup>
 		<Inf Include="..\xeniface.inf" />
 	</ItemGroup>
+	<ItemGroup>
+		<ClInclude Include="..\..\src\xeniface\assert.h" />
+		<ClInclude Include="..\..\src\xeniface\driver.h" />
+		<ClInclude Include="..\..\src\xeniface\fdo.h" />
+		<ClInclude Include="..\..\src\xeniface\ioctls.h" />
+		<ClInclude Include="..\..\src\xeniface\irp_queue.h" />
+		<ClInclude Include="..\..\src\xeniface\log.h" />
+		<ClInclude Include="..\..\src\xeniface\mutex.h" />
+		<ClInclude Include="..\..\src\xeniface\names.h" />
+		<ClInclude Include="..\..\src\xeniface\registry.h" />
+		<ClInclude Include="..\..\src\xeniface\thread.h" />
+		<ClInclude Include="..\..\src\xeniface\types.h" />
+		<ClInclude Include="..\..\src\xeniface\wmi.h" />
+	</ItemGroup>
 	<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 </Project>
diff --git a/vs2013/xeniface/xeniface.vcxproj b/vs2013/xeniface/xeniface.vcxproj
index fea2ad1..44a1cdf 100644
--- a/vs2013/xeniface/xeniface.vcxproj
+++ b/vs2013/xeniface/xeniface.vcxproj
@@ -125,12 +125,16 @@
     <FilesToPackage Include="@(Inf->'%(CopyOutput)')" Condition="'@(Inf)'!=''" />
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="../../src/xeniface/ioctls.c" />
-    <ClCompile Include="../../src/xeniface/wmi.c" />
-    <ClCompile Include="../../src/xeniface/driver.c" />
-    <ClCompile Include="../../src/xeniface/fdo.c" />
-    <ClCompile Include="../../src/xeniface/registry.c" />
-    <ClCompile Include="../../src\xeniface/thread.c" />
+    <ClCompile Include="..\..\src\xeniface\ioctls.c" />
+    <ClCompile Include="..\..\src\xeniface\wmi.c" />
+    <ClCompile Include="..\..\src\xeniface\driver.c" />
+    <ClCompile Include="..\..\src\xeniface\fdo.c" />
+    <ClCompile Include="..\..\src\xeniface\registry.c" />
+    <ClCompile Include="..\..\src\xeniface\thread.c" />
+    <ClCompile Include="..\..\src\xeniface\ioctl_evtchn.c" />
+    <ClCompile Include="..\..\src\xeniface\ioctl_gnttab.c" />
+    <ClCompile Include="..\..\src\xeniface\ioctl_store.c" />
+    <ClCompile Include="..\..\src\xeniface\irp_queue.c" />
   </ItemGroup>
   <ItemGroup>
     <Mofcomp Include="../../src/xeniface/wmi.mof">
@@ -148,5 +152,19 @@
   <ItemGroup>
     <Inf Include="..\xeniface.inf" />
   </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\..\src\xeniface\assert.h" />
+    <ClInclude Include="..\..\src\xeniface\driver.h" />
+    <ClInclude Include="..\..\src\xeniface\fdo.h" />
+    <ClInclude Include="..\..\src\xeniface\ioctls.h" />
+    <ClInclude Include="..\..\src\xeniface\irp_queue.h" />
+    <ClInclude Include="..\..\src\xeniface\log.h" />
+    <ClInclude Include="..\..\src\xeniface\mutex.h" />
+    <ClInclude Include="..\..\src\xeniface\names.h" />
+    <ClInclude Include="..\..\src\xeniface\registry.h" />
+    <ClInclude Include="..\..\src\xeniface\thread.h" />
+    <ClInclude Include="..\..\src\xeniface\types.h" />
+    <ClInclude Include="..\..\src\xeniface\wmi.h" />
+  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 </Project>
-- 
1.8.1.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 Wed Oct 21 05:26:38 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 21 Oct 2015 05:26: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 1Zolv4-0007uI-Hb; Wed, 21 Oct 2015 05:26:38 +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 1Zolv3-0007pQ-7H
	for win-pv-devel@lists.xenproject.org; Wed, 21 Oct 2015 05:26:37 +0000
Received: from [85.158.137.68] by server-16.bemta-3.messagelabs.com id
	54/BE-03763-B0227265; Wed, 21 Oct 2015 05:26:35 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-7.tower-31.messagelabs.com!1445405192!20515224!1
X-Originating-IP: [66.111.4.27]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjcgPT4gODQ2Mw==\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25939 invoked from network); 21 Oct 2015 05:26:33 -0000
Received: from out3-smtp.messagingengine.com (HELO
	out3-smtp.messagingengine.com) (66.111.4.27)
	by server-7.tower-31.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2015 05:26:33 -0000
Received: from compute2.internal (compute2.nyi.internal [10.202.2.42])
	by mailout.nyi.internal (Postfix) with ESMTP id B1A3F20641
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:26:32 -0400 (EDT)
Received: from frontend1 ([10.202.2.160])
	by compute2.internal (MEProxy); Wed, 21 Oct 2015 01:26:32 -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=liPTD3fPHcqu8XroTGnsOuhUED4=; b=n8JcRZ
	RtYbN+SRxRvAZ1I0tEAPG1NotoynchqR0OXo/Obh2piXkNHtEzJIr6dMrNaiPewp
	fQeSauTNCdn/DTL/0jJWXHWW7rngCOMBGDucHnAdPYBegc8ivwubpMpDmJtpVXgV
	VxgP6z2Bm1lr7vIFeCjNzFF+FOv640HGE3Ud0=
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=liPTD3fPHcqu8XroTGnsOuhUED4=; b=n7bhk
	DXNtIIx4WtEW7h+fsCJatoxzzT6GlXPkoIT0XVtiT/sWr0n9mOCe7/FNQKD7XLPT
	2X+ZE1qxV1yJU2ItY5DW0kJnBuWS4q/YHagbzzKMmz3Fcg4jErekMHmWKOS/qYkx
	MDGrJAhYT9srg2pV2NQ23dzMiTWZTzDwHJZsmI=
X-Sasl-enc: 6upeXLvkz/Lli65Fk0mk4eyffSRzGpokHVYX9//TKx8v 1445405191
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 35F02C00014
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:26:31 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <56272208.8060208@invisiblethingslab.com>
Date: Wed, 21 Oct 2015 07:26:32 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 5/6] Implement new IOCTL handlers
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

This patch implements new store, evtchn and gnttab IOCTLs.
Handlers are split into separate files for readability.

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 include/xeniface_ioctls.h        |   1 +
 src/xeniface/fdo.c               | 179 +++++++++-
 src/xeniface/fdo.h               |  44 ++-
 src/xeniface/ioctl_evtchn.c      | 492 ++++++++++++++++++++++++++
 src/xeniface/ioctl_gnttab.c      | 747 +++++++++++++++++++++++++++++++++++++++
 src/xeniface/ioctl_store.c       | 608 +++++++++++++++++++++++++++++++
 src/xeniface/ioctls.c            | 396 ++++++++-------------
 src/xeniface/ioctls.h            | 330 ++++++++++++++++-
 src/xeniface/irp_queue.c         | 162 +++++++++
 src/xeniface/irp_queue.h         |  81 +++++
 vs2012/xeniface/xeniface.vcxproj |  30 +-
 vs2013/xeniface/xeniface.vcxproj |  30 +-
 12 files changed, 2807 insertions(+), 293 deletions(-)
 create mode 100644 src/xeniface/ioctl_evtchn.c
 create mode 100644 src/xeniface/ioctl_gnttab.c
 create mode 100644 src/xeniface/ioctl_store.c
 create mode 100644 src/xeniface/irp_queue.c
 create mode 100644 src/xeniface/irp_queue.h

diff --git a/include/xeniface_ioctls.h b/include/xeniface_ioctls.h
index 6ad98d6..a842d4f 100644
--- a/include/xeniface_ioctls.h
+++ b/include/xeniface_ioctls.h
@@ -1,4 +1,5 @@
 /* Copyright (c) Citrix Systems Inc.
+ * Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, 
diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index b73dee1..71ffbe2 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -36,7 +36,8 @@
 #include <stdlib.h>
 
 #include <store_interface.h>
-
+#include <evtchn_interface.h>
+#include <gnttab_interface.h>
 #include <suspend_interface.h>
 
 
@@ -52,6 +53,7 @@
 #include "ioctls.h"
 #include "wmi.h"
 #include "xeniface_ioctls.h"
+#include "irp_queue.h"
 
 #define FDO_POOL 'ODF'
 
@@ -664,6 +666,25 @@ __FdoD3ToD0(
     if (!NT_SUCCESS(status))
         goto fail1;
 
+    status = XENBUS_EVTCHN(Acquire, &Fdo->EvtchnInterface);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = XENBUS_GNTTAB(Acquire, &Fdo->GnttabInterface);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    status = XENBUS_GNTTAB(CreateCache,
+                           &Fdo->GnttabInterface,
+                           "xeniface-gnttab",
+                           0,
+                           GnttabAcquireLock,
+                           GnttabReleaseLock,
+                           Fdo,
+                           &Fdo->GnttabCache);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
     __FdoSetDevicePowerState(Fdo, PowerDeviceD0);
 
     PowerState.DeviceState = PowerDeviceD0;
@@ -675,6 +696,18 @@ __FdoD3ToD0(
 
     return STATUS_SUCCESS;
 
+fail4:
+    Error("fail4\n");
+    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
+
+fail3:
+    Error("fail3\n");
+    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
+
+fail2:
+    Error("fail2\n");
+    XENBUS_STORE(Release, &Fdo->StoreInterface);
+
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -700,6 +733,9 @@ __FdoD0ToD3(
 
     __FdoSetDevicePowerState(Fdo, PowerDeviceD3);
 
+    XENBUS_GNTTAB(DestroyCache, &Fdo->GnttabInterface, Fdo->GnttabCache);
+    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
+    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
     XENBUS_STORE(Release, &Fdo->StoreInterface);
 
     Trace("<====\n");
@@ -1991,27 +2027,25 @@ FdoDispatchDefault(
 
 NTSTATUS
 FdoCreateFile (
-    __in PXENIFACE_FDO fdoData,
-    __inout PIRP Irp
+    __in PXENIFACE_FDO  Fdo,
+    __inout PIRP        Irp
     )
 {
-    NTSTATUS     status;
+    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
+    NTSTATUS            status;
 
+    XenIfaceDebugPrint(TRACE, "FO %p, Process %p\n", Stack->FileObject, PsGetCurrentProcess());
 
-    XenIfaceDebugPrint(TRACE, "Create \n");
-
-    if (Deleted == fdoData->Dx->DevicePnpState)
-    {
+    if (Deleted == Fdo->Dx->DevicePnpState) {
         Irp->IoStatus.Status = STATUS_NO_SUCH_DEVICE;
-        IoCompleteRequest (Irp, IO_NO_INCREMENT);
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
         return STATUS_NO_SUCH_DEVICE;
     }
 
-
     status = STATUS_SUCCESS;
     Irp->IoStatus.Information = 0;
     Irp->IoStatus.Status = status;
-    IoCompleteRequest (Irp, IO_NO_INCREMENT);
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
     return status;
 }
@@ -2019,20 +2053,22 @@ FdoCreateFile (
 
 NTSTATUS
 FdoClose (
-    __in PXENIFACE_FDO fdoData,
-    __inout PIRP Irp
+    __in PXENIFACE_FDO  Fdo,
+    __inout PIRP        Irp
     )
 
 {
+    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
+    NTSTATUS            status;
 
-    NTSTATUS     status;
+    XenIfaceDebugPrint(TRACE, "FO %p, Process %p\n", Stack->FileObject, PsGetCurrentProcess());
 
-    XenIfaceDebugPrint(TRACE, "Close \n");
+    XenIfaceCleanup(Fdo, Stack->FileObject);
 
     status = STATUS_SUCCESS;
     Irp->IoStatus.Information = 0;
     Irp->IoStatus.Status = status;
-    IoCompleteRequest (Irp, IO_NO_INCREMENT);
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
     return status;
 }
@@ -2081,7 +2117,7 @@ FdoDispatch(
         break;
 
     case IRP_MJ_DEVICE_CONTROL:
-        status = XenIFaceIoctl(Fdo, Irp);
+        status = XenIfaceIoctl(Fdo, Irp);
         break;
 
     case IRP_MJ_SYSTEM_CONTROL:
@@ -2206,6 +2242,8 @@ FdoCreate(
     WCHAR               Name[MAXNAMELEN * sizeof (WCHAR)];
     ULONG               Size;
     NTSTATUS            status;
+    ULONG               ProcessorCount;
+    ULONG               Index;
 
 #pragma prefast(suppress:28197) // Possibly leaking memory 'FunctionDeviceObject'
     status = IoCreateDevice(DriverObject,
@@ -2296,6 +2334,24 @@ FdoCreate(
     if (!NT_SUCCESS(status))
         goto fail10;
 
+    status = FDO_QUERY_INTERFACE(Fdo,
+                                 XENBUS,
+                                 EVTCHN,
+                                 (PINTERFACE)&Fdo->EvtchnInterface,
+                                 sizeof (Fdo->EvtchnInterface),
+                                 FALSE);
+    if (!NT_SUCCESS(status))
+        goto fail11;
+
+    status = FDO_QUERY_INTERFACE(Fdo,
+                                 XENBUS,
+                                 GNTTAB,
+                                 (PINTERFACE)&Fdo->GnttabInterface,
+                                 sizeof (Fdo->GnttabInterface),
+                                 FALSE);
+    if (!NT_SUCCESS(status))
+        goto fail12;
+
     InitializeMutex(&Fdo->Mutex);
     InitializeListHead(&Dx->ListEntry);
     Fdo->References = 1;
@@ -2306,7 +2362,46 @@ FdoCreate(
 
     status = ThreadCreate(FdoRegistryThreadHandler, Fdo, &Fdo->registryThread);
     if (!NT_SUCCESS(status))
-        goto fail11;
+        goto fail13;
+
+    KeInitializeSpinLock(&Fdo->StoreWatchLock);
+    InitializeListHead(&Fdo->StoreWatchList);
+
+    KeInitializeSpinLock(&Fdo->EvtchnLock);
+    InitializeListHead(&Fdo->EvtchnList);
+
+    KeInitializeSpinLock(&Fdo->IrpQueueLock);
+    InitializeListHead(&Fdo->IrpList);
+
+    KeInitializeSpinLock(&Fdo->GnttabCacheLock);
+
+    status = IoCsqInitializeEx(&Fdo->IrpQueue,
+                               CsqInsertIrpEx,
+                               CsqRemoveIrp,
+                               CsqPeekNextIrp,
+                               CsqAcquireLock,
+                               CsqReleaseLock,
+                               CsqCompleteCanceledIrp);
+    if (!NT_SUCCESS(status))
+        goto fail14;
+
+    ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
+
+    status = STATUS_NO_MEMORY;
+    Fdo->EvtchnDpc = __FdoAllocate(sizeof (KDPC) * ProcessorCount);
+    if (Fdo->EvtchnDpc == NULL)
+        goto fail15;
+
+    for (Index = 0; Index < ProcessorCount; Index++) {
+        PROCESSOR_NUMBER ProcNumber;
+
+        status = KeGetProcessorNumberFromIndex(Index, &ProcNumber);
+        ASSERT(NT_SUCCESS(status));
+
+        KeInitializeDpc(&Fdo->EvtchnDpc[Index], EvtchnNotificationDpc, NULL);
+        status = KeSetTargetProcessorDpcEx(&Fdo->EvtchnDpc[Index], &ProcNumber);
+        ASSERT(NT_SUCCESS(status));
+    }
 
     Info("%p (%s)\n",
          FunctionDeviceObject,
@@ -2317,6 +2412,27 @@ FdoCreate(
 
     return STATUS_SUCCESS;
 
+fail15:
+    Error("fail15\n");
+
+fail14:
+    Error("fail14\n");
+
+    ThreadAlert(Fdo->registryThread);
+    ThreadJoin(Fdo->registryThread);
+    Fdo->registryThread = NULL;
+
+fail13:
+    Error("fail13\n");
+
+    RtlZeroMemory(&Fdo->GnttabInterface,
+                  sizeof (XENBUS_GNTTAB_INTERFACE));
+
+fail12:
+    Error("fail12\n");
+
+    RtlZeroMemory(&Fdo->EvtchnInterface,
+                  sizeof (XENBUS_EVTCHN_INTERFACE));
 
 fail11:
     Error("fail11\n");
@@ -2394,7 +2510,8 @@ FdoDestroy(
     )
 {
     PXENIFACE_DX          Dx = Fdo->Dx;
-    PDEVICE_OBJECT      FunctionDeviceObject = Dx->DeviceObject;
+    PDEVICE_OBJECT        FunctionDeviceObject = Dx->DeviceObject;
+    ULONG                 ProcessorCount;
 
     ASSERT(IsListEmpty(&Dx->ListEntry));
     ASSERT3U(Fdo->References, ==, 0);
@@ -2408,10 +2525,34 @@ FdoDestroy(
 
     Dx->Fdo = NULL;
 
+    ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
+    RtlZeroMemory(Fdo->EvtchnDpc, sizeof (KDPC) * ProcessorCount);
+    __FdoFree(Fdo->EvtchnDpc);
+
+    RtlZeroMemory(&Fdo->GnttabCacheLock, sizeof (KSPIN_LOCK));
+    ASSERT(IsListEmpty(&Fdo->IrpList));
+    RtlZeroMemory(&Fdo->IrpList, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&Fdo->IrpQueueLock, sizeof (KSPIN_LOCK));
+    RtlZeroMemory(&Fdo->IrpQueue, sizeof (IO_CSQ));
+
+    ASSERT(IsListEmpty(&Fdo->EvtchnList));
+    RtlZeroMemory(&Fdo->EvtchnList, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&Fdo->EvtchnLock, sizeof (KSPIN_LOCK));
+
+    ASSERT(IsListEmpty(&Fdo->StoreWatchList));
+    RtlZeroMemory(&Fdo->StoreWatchList, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&Fdo->StoreWatchLock, sizeof (KSPIN_LOCK));
+
     RtlZeroMemory(&Fdo->Mutex, sizeof (XENIFACE_MUTEX));
 
     Fdo->InterfacesAcquired = FALSE;
 
+    RtlZeroMemory(&Fdo->GnttabInterface,
+                  sizeof (XENBUS_GNTTAB_INTERFACE));
+
+    RtlZeroMemory(&Fdo->EvtchnInterface,
+                  sizeof (XENBUS_EVTCHN_INTERFACE));
+
     RtlZeroMemory(&Fdo->StoreInterface,
                   sizeof (XENBUS_STORE_INTERFACE));
 
diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
index c859338..781b1cc 100644
--- a/src/xeniface/fdo.h
+++ b/src/xeniface/fdo.h
@@ -34,6 +34,8 @@
 
 #include <ntifs.h>
 #include <store_interface.h>
+#include <evtchn_interface.h>
+#include <gnttab_interface.h>
 #include <suspend_interface.h>
 #include <shared_info_interface.h>
 
@@ -73,32 +75,44 @@ typedef struct _XENIFACE_FDO {
 
     FDO_RESOURCE                    Resource[RESOURCE_COUNT];
 
-
     XENBUS_STORE_INTERFACE          StoreInterface;
-
     XENBUS_SUSPEND_INTERFACE        SuspendInterface;
-
     XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
-
+    XENBUS_EVTCHN_INTERFACE         EvtchnInterface;
+    XENBUS_GNTTAB_INTERFACE         GnttabInterface;
     PXENBUS_SUSPEND_CALLBACK        SuspendCallbackLate;
 
-    BOOLEAN						    InterfacesAcquired;
+    BOOLEAN                         InterfacesAcquired;
+
+    KSPIN_LOCK                      StoreWatchLock;
+    LIST_ENTRY                      StoreWatchList;
+
+    KSPIN_LOCK                      EvtchnLock;
+    LIST_ENTRY                      EvtchnList;
+    PKDPC                           EvtchnDpc;
+
+    KSPIN_LOCK                      GnttabCacheLock;
+
+    IO_CSQ                          IrpQueue;
+    KSPIN_LOCK                      IrpQueueLock;
+    LIST_ENTRY                      IrpList;
+
+    PXENBUS_GNTTAB_CACHE            GnttabCache;
 
     #define MAX_SESSIONS    (65536)
 
-    int							    WmiReady;
+    int                             WmiReady;
 
-    USHORT						    Sessions;
-    FAST_MUTEX					    SessionLock;
-    LIST_ENTRY					    SessionHead;
+    USHORT                          Sessions;
+    FAST_MUTEX                      SessionLock;
+    LIST_ENTRY                      SessionHead;
 
-    PXENIFACE_THREAD			    registryThread;
-    KEVENT						    registryWriteEvent;
+    PXENIFACE_THREAD                registryThread;
+    KEVENT                          registryWriteEvent;
 
+    UNICODE_STRING                  SuggestedInstanceName;
 
-    UNICODE_STRING				    SuggestedInstanceName;
-
-    UNICODE_STRING				    InterfaceName;
+    UNICODE_STRING                  InterfaceName;
 
 } XENIFACE_FDO, *PXENIFACE_FDO;
 
@@ -163,6 +177,4 @@ FdoDispatch(
     IN  PIRP            Irp
     );
 
-
-
 #endif  // _XENIFACE_FDO_H
diff --git a/src/xeniface/ioctl_evtchn.c b/src/xeniface/ioctl_evtchn.c
new file mode 100644
index 0000000..93f1931
--- /dev/null
+++ b/src/xeniface/ioctl_evtchn.c
@@ -0,0 +1,492 @@
+/* Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
+ * 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 "driver.h"
+#include "ioctls.h"
+#include "xeniface_ioctls.h"
+#include "log.h"
+
+_Function_class_(KDEFERRED_ROUTINE)
+_IRQL_requires_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+VOID
+EvtchnNotificationDpc(
+    __in      PKDPC Dpc,
+    __in_opt  PVOID _Context,
+    __in_opt  PVOID Argument1,
+    __in_opt  PVOID Argument2
+    )
+{
+    PXENIFACE_EVTCHN_CONTEXT Context = Argument1;
+
+    UNREFERENCED_PARAMETER(Dpc);
+    UNREFERENCED_PARAMETER(_Context);
+    UNREFERENCED_PARAMETER(Argument2);
+
+    ASSERT(Context);
+
+#if DBG
+    XenIfaceDebugPrint(INFO, "Channel %p, LocalPort %d, Cpu %lu\n",
+                       Context->Channel, Context->LocalPort, KeGetCurrentProcessorNumber());
+#endif
+    KeSetEvent(Context->Event, 0, FALSE);
+
+    XENBUS_EVTCHN(Unmask,
+                  &Context->Fdo->EvtchnInterface,
+                  Context->Channel,
+                  FALSE);
+}
+
+_Function_class_(KSERVICE_ROUTINE)
+_IRQL_requires_(HIGH_LEVEL)
+_IRQL_requires_same_
+static DECLSPEC_NOINLINE
+BOOLEAN
+EvtchnInterruptHandler(
+    __in      PKINTERRUPT Interrupt,
+    __in_opt  PVOID Argument
+    )
+{
+    PXENIFACE_EVTCHN_CONTEXT Context = Argument;
+    PROCESSOR_NUMBER ProcNumber;
+    ULONG ProcIndex;
+
+    UNREFERENCED_PARAMETER(Interrupt);
+    ASSERT(Context);
+
+    KeGetCurrentProcessorNumberEx(&ProcNumber);
+    ProcIndex = KeGetProcessorIndexFromNumber(&ProcNumber);
+    if (!KeInsertQueueDpc(&Context->Fdo->EvtchnDpc[ProcIndex], Context, NULL)) {
+        XenIfaceDebugPrint(TRACE, "NOT INSERTED: Context %p, Port %lu, FO %p, Cpu %lu\n",
+                           Context, Context->LocalPort, Context->FileObject, ProcIndex);
+    }
+
+    return TRUE;
+}
+
+_IRQL_requires_(PASSIVE_LEVEL) // needed for KeFlushQueuedDpcs
+VOID
+EvtchnFree(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_EVTCHN_CONTEXT Context
+    )
+{
+    ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
+
+    XenIfaceDebugPrint(TRACE, "Context %p, LocalPort %d, FO %p\n",
+                       Context, Context->LocalPort, Context->FileObject);
+
+    XENBUS_EVTCHN(Close,
+                  &Fdo->EvtchnInterface,
+                  Context->Channel);
+
+    // There may still be a pending event at this time.
+    // Wait for our DPCs to complete.
+    KeFlushQueuedDpcs();
+
+    ObDereferenceObject(Context->Event);
+    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+}
+
+_Requires_exclusive_lock_held_(Fdo->EvtchnLock)
+static
+PXENIFACE_EVTCHN_CONTEXT
+EvtchnFindChannel(
+    __in      PXENIFACE_FDO Fdo,
+    __in      ULONG         LocalPort,
+    __in_opt  PFILE_OBJECT  FileObject
+    )
+{
+    PXENIFACE_EVTCHN_CONTEXT Context, Found = NULL;
+    PLIST_ENTRY Node;
+
+    Node = Fdo->EvtchnList.Flink;
+    while (Node->Flink != Fdo->EvtchnList.Flink) {
+        Context = CONTAINING_RECORD(Node, XENIFACE_EVTCHN_CONTEXT, Entry);
+
+        Node = Node->Flink;
+        if (Context->LocalPort != LocalPort)
+            continue;
+
+        if (FileObject != NULL &&
+            FileObject != Context->FileObject) {
+            continue;
+        }
+
+        Found = Context;
+        break;
+    }
+
+    return Found;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnBindUnbound(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_BIND_UNBOUND_IN In = Buffer;
+    PXENIFACE_EVTCHN_BIND_UNBOUND_OUT Out = Buffer;
+    PXENIFACE_EVTCHN_CONTEXT Context;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_IN) ||
+        OutLen != sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_OUT)) {
+        goto fail1;
+    }
+
+    status = STATUS_NO_MEMORY;
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_EVTCHN_CONTEXT), XENIFACE_POOL_TAG);
+    if (Context == NULL)
+        goto fail2;
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
+    Context->FileObject = FileObject;
+
+    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, Mask %d, FO %p\n",
+                       In->RemoteDomain, In->Mask, FileObject);
+
+    status = ObReferenceObjectByHandle(In->Event,
+                                       EVENT_MODIFY_STATE,
+                                       *ExEventObjectType,
+                                       UserMode,
+                                       &Context->Event,
+                                       NULL);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    status = STATUS_UNSUCCESSFUL;
+    Context->Channel = XENBUS_EVTCHN(Open,
+                                     &Fdo->EvtchnInterface,
+                                     XENBUS_EVTCHN_TYPE_UNBOUND,
+                                     EvtchnInterruptHandler,
+                                     Context,
+                                     In->RemoteDomain,
+                                     TRUE);
+    if (Context->Channel == NULL)
+        goto fail4;
+
+    Context->LocalPort = XENBUS_EVTCHN(GetPort,
+                                       &Fdo->EvtchnInterface,
+                                       Context->Channel);
+
+    Context->Fdo = Fdo;
+
+    ExInterlockedInsertTailList(&Fdo->EvtchnList, &Context->Entry, &Fdo->EvtchnLock);
+
+    Out->LocalPort = Context->LocalPort;
+    *Info = sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_OUT);
+
+    if (!In->Mask) {
+        XENBUS_EVTCHN(Unmask,
+                      &Fdo->EvtchnInterface,
+                      Context->Channel,
+                      FALSE);
+    }
+
+    XenIfaceDebugPrint(TRACE, "< LocalPort %lu, Context %p\n", Context->LocalPort, Context);
+    return STATUS_SUCCESS;
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+    ObDereferenceObject(Context->Event);
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnBindInterdomain(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_BIND_INTERDOMAIN_IN In = Buffer;
+    PXENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT Out = Buffer;
+    PXENIFACE_EVTCHN_CONTEXT Context;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN) ||
+        OutLen != sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT)) {
+        goto fail1;
+    }
+
+    status = STATUS_NO_MEMORY;
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_EVTCHN_CONTEXT), XENIFACE_POOL_TAG);
+    if (Context == NULL)
+        goto fail2;
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
+    Context->FileObject = FileObject;
+
+    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, RemotePort %lu, Mask %d, FO %p\n",
+                       In->RemoteDomain, In->RemotePort, In->Mask, FileObject);
+
+    status = ObReferenceObjectByHandle(In->Event,
+                                       EVENT_MODIFY_STATE,
+                                       *ExEventObjectType,
+                                       UserMode,
+                                       &Context->Event,
+                                       NULL);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    status = STATUS_UNSUCCESSFUL;
+    Context->Channel = XENBUS_EVTCHN(Open,
+                                     &Fdo->EvtchnInterface,
+                                     XENBUS_EVTCHN_TYPE_INTER_DOMAIN,
+                                     EvtchnInterruptHandler,
+                                     Context,
+                                     In->RemoteDomain,
+                                     In->RemotePort,
+                                     TRUE);
+    if (Context->Channel == NULL)
+        goto fail4;
+
+    Context->LocalPort = XENBUS_EVTCHN(GetPort,
+                                       &Fdo->EvtchnInterface,
+                                       Context->Channel);
+
+    Context->Fdo = Fdo;
+
+    ExInterlockedInsertTailList(&Fdo->EvtchnList, &Context->Entry, &Fdo->EvtchnLock);
+
+    Out->LocalPort = Context->LocalPort;
+    *Info = sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT);
+
+    if (!In->Mask) {
+        XENBUS_EVTCHN(Unmask,
+                      &Fdo->EvtchnInterface,
+                      Context->Channel,
+                      FALSE);
+    }
+
+    XenIfaceDebugPrint(TRACE, "< LocalPort %lu, Context %p\n", Context->LocalPort, Context);
+
+    return STATUS_SUCCESS;
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+    ObDereferenceObject(Context->Event);
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnClose(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_CLOSE_IN In = Buffer;
+    PXENIFACE_EVTCHN_CONTEXT Context;
+    KIRQL Irql;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_EVTCHN_CLOSE_IN) ||
+        OutLen != 0) {
+        goto fail1;
+    }
+
+    XenIfaceDebugPrint(TRACE, "> LocalPort %lu, FO %p\n", In->LocalPort, FileObject);
+
+    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
+    status = STATUS_NOT_FOUND;
+    Context = EvtchnFindChannel(Fdo, In->LocalPort, FileObject);
+    if (Context == NULL)
+        goto fail2;
+
+    RemoveEntryList(&Context->Entry);
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+    EvtchnFree(Fdo, Context);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+_Requires_lock_not_held_(Fdo->EvtchnLock)
+DECLSPEC_NOINLINE
+NTSTATUS
+EvtchnNotify(
+    __in      PXENIFACE_FDO Fdo,
+    __in      ULONG         LocalPort,
+    __in_opt  PFILE_OBJECT  FileObject
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_CONTEXT Context;
+    KIRQL Irql;
+
+    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
+
+    Context = EvtchnFindChannel(Fdo, LocalPort, FileObject);
+
+    status = STATUS_NOT_FOUND;
+    if (Context == NULL)
+        goto fail1;
+
+    XENBUS_EVTCHN(Send,
+                  &Fdo->EvtchnInterface,
+                  Context->Channel);
+
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+
+    return STATUS_SUCCESS;
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnNotify(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_NOTIFY_IN In = Buffer;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_EVTCHN_NOTIFY_IN) ||
+        OutLen != 0) {
+        goto fail1;
+    }
+
+#if DBG
+    XenIfaceDebugPrint(INFO, "> LocalPort %d, FO %p\n", In->LocalPort, FileObject);
+#endif
+
+    return EvtchnNotify(Fdo, In->LocalPort, FileObject);
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnUnmask(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_EVTCHN_UNMASK_IN In = Buffer;
+    PXENIFACE_EVTCHN_CONTEXT Context;
+    KIRQL Irql;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_EVTCHN_UNMASK_IN) ||
+        OutLen != 0) {
+        goto fail1;
+    }
+
+    XenIfaceDebugPrint(TRACE, "> LocalPort %d, FO %p\n", In->LocalPort, FileObject);
+
+    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
+
+    Context = EvtchnFindChannel(Fdo, In->LocalPort, FileObject);
+
+    status = STATUS_INVALID_PARAMETER;
+    if (Context == NULL)
+        goto fail2;
+
+    XENBUS_EVTCHN(Unmask,
+                  &Fdo->EvtchnInterface,
+                  Context->Channel,
+                  FALSE);
+
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
diff --git a/src/xeniface/ioctl_gnttab.c b/src/xeniface/ioctl_gnttab.c
new file mode 100644
index 0000000..a24a5ee
--- /dev/null
+++ b/src/xeniface/ioctl_gnttab.c
@@ -0,0 +1,747 @@
+/* Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
+ * 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 "driver.h"
+#include "ioctls.h"
+#include "xeniface_ioctls.h"
+#include "log.h"
+#include "irp_queue.h"
+
+// Complete a canceled gnttab IRP, cleanup associated grant/map.
+_Function_class_(IO_WORKITEM_ROUTINE)
+VOID
+CompleteGnttabIrp(
+    __in      PDEVICE_OBJECT DeviceObject,
+    __in_opt  PVOID          Context
+    )
+{
+    PXENIFACE_DX Dx = (PXENIFACE_DX)DeviceObject->DeviceExtension;
+    PXENIFACE_FDO Fdo = Dx->Fdo;
+    PIRP Irp = Context;
+    PXENIFACE_CONTEXT_ID Id;
+    PIO_WORKITEM WorkItem;
+    KAPC_STATE ApcState;
+    BOOLEAN ChangeProcess;
+
+    ASSERT(Context != NULL);
+
+    Id = Irp->Tail.Overlay.DriverContext[0];
+    WorkItem = Irp->Tail.Overlay.DriverContext[1];
+    
+    // We are not guaranteed to be in the context of the process that initiated the IRP,
+    // but we need to be there to unmap memory.
+    ChangeProcess = PsGetCurrentProcess() != Id->Process;
+    if (ChangeProcess) {
+        XenIfaceDebugPrint(TRACE, "Changing process from %p to %p\n", PsGetCurrentProcess(), Id->Process);
+        KeStackAttachProcess(Id->Process, &ApcState);
+    }
+
+    XenIfaceDebugPrint(TRACE, "Irp %p, Process %p, Id %lu, Type %d, IRQL %d\n",
+                       Irp, Id->Process, Id->RequestId, Id->Type, KeGetCurrentIrql());
+
+    switch (Id->Type) {
+
+    case XENIFACE_CONTEXT_GRANT:
+        GnttabFreeGrant(Fdo, CONTAINING_RECORD(Id, XENIFACE_GRANT_CONTEXT, Id));
+        break;
+
+    case XENIFACE_CONTEXT_MAP:
+        GnttabFreeMap(Fdo, CONTAINING_RECORD(Id, XENIFACE_MAP_CONTEXT, Id));
+        break;
+
+    default:
+        ASSERT(FALSE);
+    }
+
+    if (ChangeProcess)
+        KeUnstackDetachProcess(&ApcState);
+
+    IoFreeWorkItem(WorkItem);
+
+    Irp->IoStatus.Status = STATUS_CANCELLED;
+    Irp->IoStatus.Information = 0;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+}
+
+_Acquires_exclusive_lock_(((PXENIFACE_FDO)Argument)->GnttabCacheLock)
+_IRQL_requires_(DISPATCH_LEVEL)
+VOID
+GnttabAcquireLock(
+    __in  PVOID Argument
+    )
+{
+    PXENIFACE_FDO Fdo = Argument;
+
+    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+
+    KeAcquireSpinLockAtDpcLevel(&Fdo->GnttabCacheLock);
+}
+
+_Releases_exclusive_lock_(((PXENIFACE_FDO)Argument)->GnttabCacheLock)
+_IRQL_requires_(DISPATCH_LEVEL)
+VOID
+GnttabReleaseLock(
+    __in  PVOID Argument
+    )
+{
+    PXENIFACE_FDO Fdo = Argument;
+
+    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+
+    KeReleaseSpinLockFromDpcLevel(&Fdo->GnttabCacheLock);
+}
+
+_Requires_lock_not_held_(Fdo->IrpQueueLock)
+static
+PIRP
+FindGnttabIrp(
+    __in  PXENIFACE_FDO Fdo,
+    __in  PXENIFACE_CONTEXT_ID Id
+    )
+{
+    KIRQL Irql;
+    PIRP Irp;
+
+    CsqAcquireLock(&Fdo->IrpQueue, &Irql);
+    Irp = CsqPeekNextIrp(&Fdo->IrpQueue, NULL, Id);
+    CsqReleaseLock(&Fdo->IrpQueue, Irql);
+    return Irp;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabPermitForeignAccess(
+    __in     PXENIFACE_FDO  Fdo,
+    __in     PVOID          Buffer,
+    __in     ULONG          InLen,
+    __in     ULONG          OutLen,
+    __inout  PIRP           Irp
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN In;
+    PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT Out = Irp->UserBuffer;
+    PXENIFACE_GRANT_CONTEXT Context;
+    ULONG Page;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN))
+        goto fail1;
+
+    // This IOCTL uses METHOD_NEITHER so we directly access user memory.
+    status = __CaptureUserBuffer(Buffer, InLen, &In);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (In->NumberPages == 0 ||
+        In->NumberPages > 1024 * 1024) {
+        goto fail3;
+    }
+
+    if ((In->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) &&
+        (In->NotifyOffset >= In->NumberPages * PAGE_SIZE)) {
+        goto fail4;
+    }
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (OutLen != (ULONG)FIELD_OFFSET(XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT, References[In->NumberPages]))
+        goto fail5;
+
+    status = STATUS_NO_MEMORY;
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_GRANT_CONTEXT), XENIFACE_POOL_TAG);
+    if (Context == NULL)
+        goto fail6;
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
+    Context->Id.Type = XENIFACE_CONTEXT_GRANT;
+    Context->Id.Process = PsGetCurrentProcess();
+    Context->Id.RequestId = In->RequestId;
+    Context->RemoteDomain = In->RemoteDomain;
+    Context->NumberPages = In->NumberPages;
+    Context->Flags = In->Flags;
+    Context->NotifyOffset = In->NotifyOffset;
+    Context->NotifyPort = In->NotifyPort;
+
+    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, NumberPages %lu, Flags 0x%x, Offset 0x%x, Port %d, Process %p, Id %lu\n",
+                       Context->RemoteDomain, Context->NumberPages, Context->Flags, Context->NotifyOffset, Context->NotifyPort,
+                       Context->Id.Process, Context->Id.RequestId);
+
+    // Check if the request ID is unique for this process.
+    // This doesn't protect us from simultaneous requests with the same ID arriving here
+    // but another check for duplicate ID is performed when the context/IRP is queued at the end.
+    // Ideally we would lock the whole section but that's not really an option since we touch user memory.
+    status = STATUS_INVALID_PARAMETER;
+    if (FindGnttabIrp(Fdo, &Context->Id) != NULL)
+        goto fail7;
+
+    status = STATUS_NO_MEMORY;
+    Context->Grants = ExAllocatePoolWithTag(NonPagedPool, Context->NumberPages * sizeof(PXENBUS_GNTTAB_ENTRY), XENIFACE_POOL_TAG);
+    if (Context->Grants == NULL)
+        goto fail8;
+
+    RtlZeroMemory(Context->Grants, Context->NumberPages * sizeof(PXENBUS_GNTTAB_ENTRY));
+
+    // allocate memory to share
+    status = STATUS_NO_MEMORY;
+    Context->KernelVa = ExAllocatePoolWithTag(NonPagedPool, Context->NumberPages * PAGE_SIZE, XENIFACE_POOL_TAG);
+    if (Context->KernelVa == NULL)
+        goto fail9;
+
+    RtlZeroMemory(Context->KernelVa, Context->NumberPages * PAGE_SIZE);
+    Context->Mdl = IoAllocateMdl(Context->KernelVa, Context->NumberPages * PAGE_SIZE, FALSE, FALSE, NULL);
+    if (Context->Mdl == NULL)
+        goto fail10;
+
+    MmBuildMdlForNonPagedPool(Context->Mdl);
+    ASSERT(MmGetMdlByteCount(Context->Mdl) == Context->NumberPages * PAGE_SIZE);
+
+    // perform sharing
+    for (Page = 0; Page < Context->NumberPages; Page++) {
+        status = XENBUS_GNTTAB(PermitForeignAccess,
+                               &Fdo->GnttabInterface,
+                               Fdo->GnttabCache,
+                               FALSE,
+                               Context->RemoteDomain,
+                               MmGetMdlPfnArray(Context->Mdl)[Page],
+                               (Context->Flags & XENIFACE_GNTTAB_READONLY) != 0,
+                               &(Context->Grants[Page]));
+
+// prefast somehow thinks that this call can modify Page...
+#pragma prefast(suppress:6385)
+        XenIfaceDebugPrint(INFO, "Grants[%lu] = %p\n", Page, Context->Grants[Page]);
+        if (!NT_SUCCESS(status))
+            goto fail11;
+    }
+
+    // map into user mode
+#pragma prefast(suppress:6320) // we want to catch all exceptions
+    __try {
+        Context->UserVa = MmMapLockedPagesSpecifyCache(Context->Mdl,
+                                                       UserMode,
+                                                       MmCached,
+                                                       NULL,
+                                                       FALSE,
+                                                       NormalPagePriority);
+    }
+    __except (EXCEPTION_EXECUTE_HANDLER) {
+        status = GetExceptionCode();
+        goto fail12;
+    }
+
+    status = STATUS_UNSUCCESSFUL;
+    if (Context->UserVa == NULL)
+        goto fail13;
+
+    XenIfaceDebugPrint(TRACE, "< Context %p, Irp %p, KernelVa %p, UserVa %p\n",
+                       Context, Irp, Context->KernelVa, Context->UserVa);
+    
+    // Pass the result to user mode.
+#pragma prefast(suppress: 6320) // we want to catch all exceptions
+    try {
+        ProbeForWrite(Out, OutLen, 1);
+        Out->Address = Context->UserVa;
+
+        for (Page = 0; Page < Context->NumberPages; Page++) {
+            Out->References[Page] = XENBUS_GNTTAB(GetReference,
+                                                  &Fdo->GnttabInterface,
+                                                  Context->Grants[Page]);
+        }
+    } except(EXCEPTION_EXECUTE_HANDLER) {
+        status = GetExceptionCode();
+        XenIfaceDebugPrint(ERROR, "Exception 0x%lx while probing/writing output buffer at %p, size 0x%lx\n", status, Out, OutLen);
+        goto fail14;
+    }
+
+    // Insert the IRP/context into the pending queue.
+    // This also checks (again) if the request ID is unique for the calling process.
+    Irp->Tail.Overlay.DriverContext[0] = &Context->Id;
+    status = IoCsqInsertIrpEx(&Fdo->IrpQueue, Irp, NULL, &Context->Id);
+    if (!NT_SUCCESS(status))
+        goto fail15;
+
+    __FreeCapturedBuffer(In);
+
+    return STATUS_PENDING;
+
+fail15:
+    XenIfaceDebugPrint(ERROR, "Fail15\n");
+
+fail14:
+    XenIfaceDebugPrint(ERROR, "Fail14\n");
+    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
+
+fail13:
+    XenIfaceDebugPrint(ERROR, "Fail13\n");
+
+fail12:
+    XenIfaceDebugPrint(ERROR, "Fail12\n");
+
+fail11:
+    XenIfaceDebugPrint(ERROR, "Fail11: Page = %lu\n", Page);
+
+    while (Page > 0) {
+        ASSERT(NT_SUCCESS(XENBUS_GNTTAB(RevokeForeignAccess,
+                                        &Fdo->GnttabInterface,
+                                        Fdo->GnttabCache,
+                                        FALSE,
+                                        Context->Grants[Page - 1])));
+
+        --Page;
+    }
+    IoFreeMdl(Context->Mdl);
+
+fail10:
+    XenIfaceDebugPrint(ERROR, "Fail10\n");
+    ExFreePoolWithTag(Context->KernelVa, XENIFACE_POOL_TAG);
+
+fail9:
+    XenIfaceDebugPrint(ERROR, "Fail9\n");
+    ExFreePoolWithTag(Context->Grants, XENIFACE_POOL_TAG);
+
+fail8:
+    XenIfaceDebugPrint(ERROR, "Fail8\n");
+
+fail7:
+    XenIfaceDebugPrint(ERROR, "Fail7\n");
+    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+
+fail6:
+    XenIfaceDebugPrint(ERROR, "Fail6\n");
+
+fail5:
+    XenIfaceDebugPrint(ERROR, "Fail5\n");
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+    __FreeCapturedBuffer(In);
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+_IRQL_requires_max_(APC_LEVEL)
+VOID
+GnttabFreeGrant(
+    __in     PXENIFACE_FDO            Fdo,
+    __inout  PXENIFACE_GRANT_CONTEXT  Context
+)
+{
+    NTSTATUS status;
+    ULONG Page;
+
+    ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
+
+    XenIfaceDebugPrint(TRACE, "Context %p\n", Context);
+
+    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) {
+        ((PCHAR)Context->KernelVa)[Context->NotifyOffset] = 0;
+    }
+
+    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_PORT) {
+        status = EvtchnNotify(Fdo, Context->NotifyPort, NULL);
+
+        if (!NT_SUCCESS(status)) // non-fatal, we must free memory
+            XenIfaceDebugPrint(ERROR, "failed to notify port %lu: 0x%x\n", Context->NotifyPort, status);
+    }
+
+    // unmap from user address space
+    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
+
+    // stop sharing
+    for (Page = 0; Page < Context->NumberPages; Page++) {
+        status = XENBUS_GNTTAB(RevokeForeignAccess,
+                               &Fdo->GnttabInterface,
+                               Fdo->GnttabCache,
+                               FALSE,
+                               Context->Grants[Page]);
+
+        ASSERT(NT_SUCCESS(status)); // failure here is fatal, something must've gone catastrophically wrong
+    }
+
+    IoFreeMdl(Context->Mdl);
+
+    RtlZeroMemory(Context->KernelVa, Context->NumberPages * PAGE_SIZE);
+    ExFreePoolWithTag(Context->KernelVa, XENIFACE_POOL_TAG);
+
+    RtlZeroMemory(Context->Grants, Context->NumberPages * sizeof(PXENBUS_GNTTAB_ENTRY));
+    ExFreePoolWithTag(Context->Grants, XENIFACE_POOL_TAG);
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabRevokeForeignAccess(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN In = Buffer;
+    PXENIFACE_GRANT_CONTEXT Context = NULL;
+    XENIFACE_CONTEXT_ID Id;
+    PIRP PendingIrp;
+    PXENIFACE_CONTEXT_ID ContextId;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN))
+        goto fail1;
+
+    Id.Type = XENIFACE_CONTEXT_GRANT;
+    Id.Process = PsGetCurrentProcess();
+    Id.RequestId = In->RequestId;
+
+    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process, Id.RequestId);
+
+    status = STATUS_NOT_FOUND;
+    PendingIrp = IoCsqRemoveNextIrp(&Fdo->IrpQueue, &Id);
+    if (PendingIrp == NULL)
+        goto fail2;
+
+    ContextId = PendingIrp->Tail.Overlay.DriverContext[0];
+    Context = CONTAINING_RECORD(ContextId, XENIFACE_GRANT_CONTEXT, Id);
+    GnttabFreeGrant(Fdo, Context);
+
+    PendingIrp->IoStatus.Status = STATUS_SUCCESS;
+    PendingIrp->IoStatus.Information = 0;
+    IoCompleteRequest(PendingIrp, IO_NO_INCREMENT);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabMapForeignPages(
+    __in     PXENIFACE_FDO     Fdo,
+    __in     PVOID             Buffer,
+    __in     ULONG             InLen,
+    __in     ULONG             OutLen,
+    __inout  PIRP              Irp
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN In = Buffer;
+    PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT Out = Irp->UserBuffer;
+    ULONG NumberPages;
+    ULONG PageIndex;
+    PXENIFACE_MAP_CONTEXT Context;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen < sizeof(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN) ||
+        OutLen != sizeof(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT)) {
+        goto fail1;
+    }
+
+    // This IOCTL uses METHOD_NEITHER so we directly access user memory.
+
+    // Calculate the expected number of pages based on input buffer size.
+    NumberPages = (InLen - (ULONG)FIELD_OFFSET(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN, References)) / sizeof(In->References[0]);
+
+    status = __CaptureUserBuffer(Buffer, InLen, &In);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (In->NumberPages == 0 ||
+        In->NumberPages > 1024 * 1024 ||
+        In->NumberPages != NumberPages) {
+        goto fail3;
+    }
+
+    if ((In->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) &&
+        (In->NotifyOffset >= In->NumberPages * PAGE_SIZE)) {
+        goto fail4;
+    }
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != (ULONG)FIELD_OFFSET(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN, References[In->NumberPages]))
+        goto fail5;
+
+    status = STATUS_NO_MEMORY;
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_MAP_CONTEXT), XENIFACE_POOL_TAG);
+    if (Context == NULL)
+        goto fail6;
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
+    Context->Id.Type = XENIFACE_CONTEXT_MAP;
+    Context->Id.Process = PsGetCurrentProcess();
+    Context->Id.RequestId = In->RequestId;
+    Context->RemoteDomain = In->RemoteDomain;
+    Context->NumberPages = In->NumberPages;
+    Context->Flags = In->Flags;
+    Context->NotifyOffset = In->NotifyOffset;
+    Context->NotifyPort = In->NotifyPort;
+
+    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, NumberPages %lu, Flags 0x%x, Offset 0x%x, Port %d, Process %p, Id %lu\n",
+                       Context->RemoteDomain, Context->NumberPages, Context->Flags, Context->NotifyOffset, Context->NotifyPort,
+                       Context->Id.Process, Context->Id.RequestId);
+
+    for (PageIndex = 0; PageIndex < In->NumberPages; PageIndex++)
+        XenIfaceDebugPrint(INFO, "> Ref %d\n", In->References[PageIndex]);
+
+    status = STATUS_INVALID_PARAMETER;
+    if (FindGnttabIrp(Fdo, &Context->Id) != NULL)
+        goto fail7;
+
+    status = XENBUS_GNTTAB(MapForeignPages,
+                           &Fdo->GnttabInterface,
+                           Context->RemoteDomain,
+                           Context->NumberPages,
+                           In->References,
+                           Context->Flags & XENIFACE_GNTTAB_READONLY,
+                           &Context->Address);
+
+    if (!NT_SUCCESS(status))
+        goto fail8;
+
+    status = STATUS_NO_MEMORY;
+    Context->KernelVa = MmMapIoSpace(Context->Address, Context->NumberPages * PAGE_SIZE, MmCached);
+    if (Context->KernelVa == NULL)
+        goto fail9;
+
+    status = STATUS_NO_MEMORY;
+    Context->Mdl = IoAllocateMdl(Context->KernelVa, Context->NumberPages * PAGE_SIZE, FALSE, FALSE, NULL);
+    if (Context->Mdl == NULL)
+        goto fail10;
+
+    MmBuildMdlForNonPagedPool(Context->Mdl);
+
+    // map into user mode
+#pragma prefast(suppress: 6320) // we want to catch all exceptions
+    __try {
+        Context->UserVa = MmMapLockedPagesSpecifyCache(Context->Mdl,
+                                                       UserMode,
+                                                       MmCached,
+                                                       NULL,
+                                                       FALSE,
+                                                       NormalPagePriority);
+    }
+    __except (EXCEPTION_EXECUTE_HANDLER) {
+        status = GetExceptionCode();
+        goto fail11;
+    }
+
+    status = STATUS_UNSUCCESSFUL;
+    if (Context->UserVa == NULL)
+        goto fail12;
+
+    XenIfaceDebugPrint(TRACE, "< Context %p, Irp %p, Address %p, KernelVa %p, UserVa %p\n",
+                       Context, Irp, Context->Address, Context->KernelVa, Context->UserVa);
+
+    // Pass the result to user mode.
+#pragma prefast(suppress: 6320) // we want to catch all exceptions
+    try {
+        ProbeForWrite(Out, OutLen, 1);
+        Out->Address = Context->UserVa;
+    } except(EXCEPTION_EXECUTE_HANDLER) {
+        status = GetExceptionCode();
+        XenIfaceDebugPrint(ERROR, "Exception 0x%lx while probing/writing output buffer at %p, size 0x%lx\n", status, Out, OutLen);
+        goto fail13;
+    }
+
+    // Insert the IRP/context into the pending queue.
+    // This also checks (again) if the request ID is unique for the calling process.
+    Irp->Tail.Overlay.DriverContext[0] = &Context->Id;
+    status = IoCsqInsertIrpEx(&Fdo->IrpQueue, Irp, NULL, &Context->Id);
+    if (!NT_SUCCESS(status))
+        goto fail14;
+
+    __FreeCapturedBuffer(In);
+
+    return STATUS_PENDING;
+
+fail14:
+    XenIfaceDebugPrint(ERROR, "Fail14\n");
+
+fail13:
+    XenIfaceDebugPrint(ERROR, "Fail13\n");
+    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
+
+fail12:
+    XenIfaceDebugPrint(ERROR, "Fail12\n");
+
+fail11:
+    XenIfaceDebugPrint(ERROR, "Fail11\n");
+    IoFreeMdl(Context->Mdl);
+
+fail10:
+    XenIfaceDebugPrint(ERROR, "Fail10\n");
+    MmUnmapIoSpace(Context->KernelVa, Context->NumberPages * PAGE_SIZE);
+
+fail9:
+    XenIfaceDebugPrint(ERROR, "Fail9\n");
+    ASSERT(NT_SUCCESS(XENBUS_GNTTAB(UnmapForeignPages,
+                                    &Fdo->GnttabInterface,
+                                    Context->Address
+                                    )));
+
+fail8:
+    XenIfaceDebugPrint(ERROR, "Fail8\n");
+
+fail7:
+    XenIfaceDebugPrint(ERROR, "Fail7\n");
+    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+
+fail6:
+    XenIfaceDebugPrint(ERROR, "Fail6\n");
+
+fail5:
+    XenIfaceDebugPrint(ERROR, "Fail5\n");
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+    __FreeCapturedBuffer(In);
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+_IRQL_requires_max_(APC_LEVEL)
+DECLSPEC_NOINLINE
+VOID
+GnttabFreeMap(
+    __in     PXENIFACE_FDO            Fdo,
+    __inout  PXENIFACE_MAP_CONTEXT    Context
+    )
+{
+    NTSTATUS status;
+
+    ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
+
+    XenIfaceDebugPrint(TRACE, "Context %p\n", Context);
+
+    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) {
+        ((PCHAR)Context->KernelVa)[Context->NotifyOffset] = 0;
+    }
+
+    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_PORT) {
+        status = EvtchnNotify(Fdo, Context->NotifyPort, NULL);
+
+        if (!NT_SUCCESS(status)) // non-fatal, we must free memory
+            XenIfaceDebugPrint(ERROR, "failed to notify port %lu: 0x%x\n", Context->NotifyPort, status);
+    }
+
+    // unmap from user address space
+    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
+
+    IoFreeMdl(Context->Mdl);
+
+    // unmap from system space
+    MmUnmapIoSpace(Context->KernelVa, Context->NumberPages * PAGE_SIZE);
+
+    // undo mapping
+    status = XENBUS_GNTTAB(UnmapForeignPages,
+                           &Fdo->GnttabInterface,
+                           Context->Address);
+
+    ASSERT(NT_SUCCESS(status));
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabUnmapForeignPages(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN In = Buffer;
+    PXENIFACE_MAP_CONTEXT Context = NULL;
+    XENIFACE_CONTEXT_ID Id;
+    PIRP PendingIrp;
+    PXENIFACE_CONTEXT_ID ContextId;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN) &&
+        OutLen != 0) {
+        goto fail1;
+    }
+
+    Id.Type = XENIFACE_CONTEXT_MAP;
+    Id.Process = PsGetCurrentProcess();
+    Id.RequestId = In->RequestId;
+
+    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process, Id.RequestId);
+
+    status = STATUS_NOT_FOUND;
+    PendingIrp = IoCsqRemoveNextIrp(&Fdo->IrpQueue, &Id);
+    if (PendingIrp == NULL)
+        goto fail2;
+
+    ContextId = PendingIrp->Tail.Overlay.DriverContext[0];
+    Context = CONTAINING_RECORD(ContextId, XENIFACE_MAP_CONTEXT, Id);
+    GnttabFreeMap(Fdo, Context);
+
+    PendingIrp->IoStatus.Status = STATUS_SUCCESS;
+    PendingIrp->IoStatus.Information = 0;
+    IoCompleteRequest(PendingIrp, IO_NO_INCREMENT);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
diff --git a/src/xeniface/ioctl_store.c b/src/xeniface/ioctl_store.c
new file mode 100644
index 0000000..5bd4649
--- /dev/null
+++ b/src/xeniface/ioctl_store.c
@@ -0,0 +1,608 @@
+/* Copyright (c) Citrix Systems Inc.
+ * Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
+ * 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 "driver.h"
+#include "ioctls.h"
+#include "xeniface_ioctls.h"
+#include "log.h"
+
+#define XENSTORE_ABS_PATH_MAX 3072
+#define XENSTORE_REL_PATH_MAX 2048
+
+static FORCEINLINE
+BOOLEAN
+__IsValidStr(
+    __in  PCHAR             Str,
+    __in  ULONG             Len
+    )
+{
+    for ( ; Len--; ++Str) {
+        if (*Str == '\0')
+            return TRUE;
+        if (!isprint((unsigned char)*Str))
+            break;
+    }
+    return FALSE;
+}
+
+static FORCEINLINE
+ULONG
+__MultiSzLen(
+    __in  PCHAR             Str,
+    __out PULONG            Count
+    )
+{
+    ULONG Length = 0;
+    if (Count)  *Count = 0;
+    do {
+        for ( ; *Str; ++Str, ++Length) ;
+        ++Str; ++Length;
+        if (*Count) ++(*Count);
+    } while (*Str);
+    return Length;
+}
+
+static FORCEINLINE
+VOID
+__DisplayMultiSz(
+    __in PCHAR              Caller,
+    __in PCHAR              Str
+    )
+{
+    PCHAR   Ptr;
+    ULONG   Idx;
+    ULONG   Len;
+
+    for (Ptr = Str, Idx = 0; *Ptr; ++Idx) {
+        Len = (ULONG)strlen(Ptr);
+        XenIfaceDebugPrint(TRACE, "|%s: [%d]=(%d)->\"%s\"\n", Caller, Idx, Len, Ptr);
+        Ptr += (Len + 1);
+    }
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRead(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS    status;
+    PCHAR       Value;
+    ULONG       Length;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen == 0)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (!__IsValidStr(Buffer, InLen))
+        goto fail2;
+
+    status = XENBUS_STORE(Read, &Fdo->StoreInterface, NULL, NULL, Buffer, &Value);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    Length = (ULONG)strlen(Value) + 1;
+
+    status = STATUS_BUFFER_OVERFLOW;
+    if (OutLen == 0) {
+        XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)\n", Buffer, Length);
+        goto done;
+    }
+
+    status = STATUS_INVALID_PARAMETER;
+    if (OutLen < Length)
+        goto fail4;
+
+    XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)->\"%s\"\n", Buffer, Length, Value);
+
+    RtlCopyMemory(Buffer, Value, Length);
+    Buffer[Length - 1] = 0;
+    status = STATUS_SUCCESS;
+
+done:
+    *Info = (ULONG_PTR)Length;
+    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
+    return status;
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")=(%d < %d)\n", Buffer, OutLen, Length);
+    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreWrite(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    )
+{
+    NTSTATUS    status;
+    PCHAR       Value;
+    ULONG       Length;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen == 0 || OutLen != 0)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (!__IsValidStr(Buffer, InLen))
+        goto fail2;
+
+    Length = (ULONG)strlen(Buffer) + 1;
+    Value = Buffer + Length;
+
+    if (!__IsValidStr(Value, InLen - Length))
+        goto fail3;
+
+    status = XENBUS_STORE(Printf, &Fdo->StoreInterface, NULL, NULL, Buffer, Value);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+    XenIfaceDebugPrint(TRACE, "(\"%s\"=\"%s\")\n", Buffer, Value);
+    return status;
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")\n", Value);
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreDirectory(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS    status;
+    PCHAR       Value;
+    ULONG       Length;
+    ULONG       Count;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen == 0)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (!__IsValidStr(Buffer, InLen))
+        goto fail2;
+
+    status = XENBUS_STORE(Directory, &Fdo->StoreInterface, NULL, NULL, Buffer, &Value);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    Length = __MultiSzLen(Value, &Count) + 1;
+
+    status = STATUS_BUFFER_OVERFLOW;
+    if (OutLen == 0) {
+        XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)(%d)\n", Buffer, Length, Count);
+        goto done;
+    }
+
+    status = STATUS_INVALID_PARAMETER;
+    if (OutLen < Length)
+        goto fail4;
+
+    XenIfaceDebugPrint(INFO, "(\"%s\")=(%d)(%d)\n", Buffer, Length, Count);
+#if DBG
+    __DisplayMultiSz(__FUNCTION__, Value);
+#endif
+
+    RtlCopyMemory(Buffer, Value, Length);
+    Buffer[Length - 2] = 0;
+    Buffer[Length - 1] = 0;
+    status = STATUS_SUCCESS;
+
+done:
+    *Info = (ULONG_PTR)Length;
+    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
+    return status;
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")=(%d < %d)\n", Buffer, OutLen, Length);
+    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRemove(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    )
+{
+    NTSTATUS    status;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen == 0 || OutLen != 0)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (!__IsValidStr(Buffer, InLen))
+        goto fail2;
+
+    status = XENBUS_STORE(Remove, &Fdo->StoreInterface, NULL, NULL, Buffer);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    XenIfaceDebugPrint(TRACE, "(\"%s\")\n", Buffer);
+    return status;
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+static
+PXENBUS_STORE_PERMISSION
+__ConvertPermissions(
+    __in  ULONG                       NumberPermissions,
+    __in  PXENIFACE_STORE_PERMISSION  XenifacePermissions
+)
+{
+    PXENBUS_STORE_PERMISSION          XenbusPermissions;
+    ULONG                             Index;
+
+    if (NumberPermissions > 255)
+        goto fail1;
+
+    XenbusPermissions = ExAllocatePoolWithTag(NonPagedPool, NumberPermissions * sizeof(XENBUS_STORE_PERMISSION), XENIFACE_POOL_TAG);
+    if (XenbusPermissions == NULL)
+        goto fail2;
+
+    // Currently XENIFACE_STORE_PERMISSION is the same as XENBUS_STORE_PERMISSION,
+    // but we convert them here in case something changes in the future.
+    for (Index = 0; Index < NumberPermissions; Index++) {
+        if ((XenifacePermissions[Index].Mask & ~XENIFACE_STORE_ALLOWED_PERMISSIONS) != 0)
+            goto fail3;
+
+        XenbusPermissions[Index].Domain = XenifacePermissions[Index].Domain;
+        XenbusPermissions[Index].Mask = (XENBUS_STORE_PERMISSION_MASK)XenifacePermissions[Index].Mask;
+    }
+
+    return XenbusPermissions;
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+    ExFreePoolWithTag(XenbusPermissions, XENIFACE_POOL_TAG);
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1\n");
+    return NULL;
+}
+
+static
+VOID
+__FreePermissions(
+    __in  PXENBUS_STORE_PERMISSION    Permissions
+    )
+{
+    ExFreePoolWithTag(Permissions, XENIFACE_POOL_TAG);
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreSetPermissions(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_STORE_SET_PERMISSIONS_IN In = Buffer;
+    PXENBUS_STORE_PERMISSION Permissions;
+    ULONG Index;
+    PCHAR Path;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen < sizeof(XENIFACE_STORE_SET_PERMISSIONS_IN) ||
+        OutLen != 0) {
+        goto fail1;
+    }
+
+    if (InLen != (ULONG)FIELD_OFFSET(XENIFACE_STORE_SET_PERMISSIONS_IN, Permissions[In->NumberPermissions]))
+        goto fail2;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (In->PathLength == 0 ||
+        In->PathLength > XENSTORE_ABS_PATH_MAX) {
+        goto fail3;
+    }
+
+    Permissions = __ConvertPermissions(In->NumberPermissions, In->Permissions);
+    if (Permissions == NULL)
+        goto fail4;
+
+    status = __CaptureUserBuffer(In->Path, In->PathLength, &Path);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
+    Path[In->PathLength - 1] = 0;
+    XenIfaceDebugPrint(TRACE, "> Path '%s', NumberPermissions %lu\n", Path, In->NumberPermissions);
+
+    for (Index = 0; Index < In->NumberPermissions; Index++) {
+        XenIfaceDebugPrint(TRACE, "> %lu: Domain %d, Mask 0x%x\n",
+                           Index, Permissions[Index].Domain, Permissions[Index].Mask);
+    }
+
+    status = XENBUS_STORE(PermissionsSet,
+                          &Fdo->StoreInterface,
+                          NULL, // transaction
+                          NULL, // prefix
+                          Path,
+                          Permissions,
+                          In->NumberPermissions);
+
+    if (!NT_SUCCESS(status))
+        goto fail6;
+
+    __FreeCapturedBuffer(Path);
+    return status;
+
+fail6:
+    XenIfaceDebugPrint(ERROR, "Fail6\n");
+    __FreeCapturedBuffer(Path);
+
+fail5:
+    XenIfaceDebugPrint(ERROR, "Fail5\n");
+    __FreePermissions(Permissions);
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreAddWatch(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_STORE_ADD_WATCH_IN In = Buffer;
+    PXENIFACE_STORE_ADD_WATCH_OUT Out = Buffer;
+    PCHAR Path;
+    PXENIFACE_STORE_CONTEXT Context;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_STORE_ADD_WATCH_IN) ||
+        OutLen != sizeof(XENIFACE_STORE_ADD_WATCH_OUT)) {
+        goto fail1;
+    }
+
+    status = STATUS_INVALID_PARAMETER;
+    if (In->PathLength == 0 ||
+        In->PathLength > XENSTORE_ABS_PATH_MAX) {
+        goto fail2;
+    }
+
+    status = __CaptureUserBuffer(In->Path, In->PathLength, &Path);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    Path[In->PathLength - 1] = 0;
+
+    status = STATUS_NO_MEMORY;
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_STORE_CONTEXT), XENIFACE_POOL_TAG);
+    if (Context == NULL)
+        goto fail4;
+
+    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
+
+    Context->FileObject = FileObject;
+
+    status = ObReferenceObjectByHandle(In->Event,
+                                       EVENT_MODIFY_STATE,
+                                       *ExEventObjectType,
+                                       UserMode,
+                                       &Context->Event,
+                                       NULL);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
+    XenIfaceDebugPrint(TRACE, "> Path '%s', Event %p, FO %p\n", Path, In->Event, FileObject);
+
+    status = XENBUS_STORE(WatchAdd,
+                          &Fdo->StoreInterface,
+                          NULL, // prefix
+                          Path,
+                          Context->Event,
+                          &Context->Watch);
+
+    if (!NT_SUCCESS(status))
+        goto fail6;
+
+    __FreeCapturedBuffer(Path);
+
+    ExInterlockedInsertTailList(&Fdo->StoreWatchList, &Context->Entry, &Fdo->StoreWatchLock);
+
+    XenIfaceDebugPrint(TRACE, "< Context %p, Watch %p\n", Context, Context->Watch);
+
+    Out->Context = Context;
+    *Info = sizeof(XENIFACE_STORE_ADD_WATCH_OUT);
+
+    return status;
+
+fail6:
+    XenIfaceDebugPrint(ERROR, "Fail6\n");
+    ObDereferenceObject(Context->Event);
+
+fail5:
+    XenIfaceDebugPrint(ERROR, "Fail5\n");
+    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+
+fail4:
+    XenIfaceDebugPrint(ERROR, "Fail4\n");
+    __FreeCapturedBuffer(Path);
+
+fail3:
+    XenIfaceDebugPrint(ERROR, "Fail3\n");
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
+
+_IRQL_requires_max_(DISPATCH_LEVEL)
+VOID
+StoreFreeWatch(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_STORE_CONTEXT Context
+    )
+{
+    NTSTATUS status;
+
+    XenIfaceDebugPrint(TRACE, "Context %p, Watch %p, FO %p\n",
+                       Context, Context->Watch, Context->FileObject);
+
+    status = XENBUS_STORE(WatchRemove,
+                          &Fdo->StoreInterface,
+                          Context->Watch);
+
+    ASSERT(NT_SUCCESS(status)); // this is fatal since we'd leave an active watch without cleaning it up
+
+    ObDereferenceObject(Context->Event);
+    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
+    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRemoveWatch(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    )
+{
+    NTSTATUS status;
+    PXENIFACE_STORE_REMOVE_WATCH_IN In = Buffer;
+    PXENIFACE_STORE_CONTEXT Context = NULL;
+    KIRQL Irql;
+    PLIST_ENTRY Node;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (InLen != sizeof(XENIFACE_STORE_REMOVE_WATCH_IN) ||
+        OutLen != 0) {
+        goto fail1;
+    }
+
+    XenIfaceDebugPrint(TRACE, "> Context %p, FO %p\n", In->Context, FileObject);
+
+    KeAcquireSpinLock(&Fdo->StoreWatchLock, &Irql);
+    Node = Fdo->StoreWatchList.Flink;
+    while (Node->Flink != Fdo->StoreWatchList.Flink) {
+        Context = CONTAINING_RECORD(Node, XENIFACE_STORE_CONTEXT, Entry);
+
+        Node = Node->Flink;
+        if (Context != In->Context ||
+            Context->FileObject != FileObject) {
+            continue;
+        }
+
+        RemoveEntryList(&Context->Entry);
+        break;
+    }
+    KeReleaseSpinLock(&Fdo->StoreWatchLock, Irql);
+
+    status = STATUS_NOT_FOUND;
+    if (Context == NULL || Context != In->Context)
+        goto fail2;
+
+    StoreFreeWatch(Fdo, Context);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    XenIfaceDebugPrint(ERROR, "Fail2\n");
+
+fail1:
+    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+    return status;
+}
diff --git a/src/xeniface/ioctls.c b/src/xeniface/ioctls.c
index ead7f9b..b306a45 100644
--- a/src/xeniface/ioctls.c
+++ b/src/xeniface/ioctls.c
@@ -1,4 +1,5 @@
 /* Copyright (c) Citrix Systems Inc.
+ * Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, 
@@ -29,266 +30,123 @@
  * SUCH DAMAGE.
  */
 
-
 #include "driver.h"
 #include "ioctls.h"
-#include "..\..\include\xeniface_ioctls.h"
+#include "xeniface_ioctls.h"
 #include "log.h"
 
-static FORCEINLINE BOOLEAN
-__IsValidStr(
-    __in  PCHAR             Str,
-    __in  ULONG             Len
+NTSTATUS
+__CaptureUserBuffer(
+    __in  PVOID Buffer,
+    __in  ULONG Length,
+    __out PVOID *CapturedBuffer
     )
 {
-    for ( ; Len--; ++Str) {
-        if (*Str == '\0')
-            return TRUE;
-        if (!isprint((unsigned char)*Str))
-            break;
+    NTSTATUS Status;
+    PVOID TempBuffer = NULL;
+
+    if (Length == 0) {
+        *CapturedBuffer = NULL;
+        return STATUS_SUCCESS;
     }
-    return FALSE;
-}
-static FORCEINLINE ULONG
-__MultiSzLen(
-    __in  PCHAR             Str,
-    __out PULONG            Count
-    )
-{
-    ULONG Length = 0;
-    if (Count)  *Count = 0;
-    do {
-        for ( ; *Str; ++Str, ++Length) ;
-        ++Str; ++Length;
-        if (*Count) ++(*Count);
-    } while (*Str);
-    return Length;
-}
-static FORCEINLINE VOID
-__DisplayMultiSz(
-    __in PCHAR              Caller,
-    __in PCHAR              Str
-    )
-{
-    PCHAR   Ptr;
-    ULONG   Idx;
-    ULONG   Len;
-
-    for (Ptr = Str, Idx = 0; *Ptr; ++Idx) {
-        Len = (ULONG)strlen(Ptr);
-        XenIfaceDebugPrint(INFO, "|%s: [%d]=(%d)->\"%s\"\n", Caller, Idx, Len, Ptr);
-        Ptr += (Len + 1);
+
+    Status = STATUS_NO_MEMORY;
+    TempBuffer = ExAllocatePoolWithTag(NonPagedPool, Length, XENIFACE_POOL_TAG);
+    if (TempBuffer == NULL)
+        return STATUS_INSUFFICIENT_RESOURCES;
+
+    Status = STATUS_SUCCESS;
+
+#pragma prefast(suppress: 6320) // we want to catch all exceptions
+    try {
+        ProbeForRead(Buffer, Length, 1);
+        RtlCopyMemory(TempBuffer, Buffer, Length);
+    } except(EXCEPTION_EXECUTE_HANDLER) {
+        XenIfaceDebugPrint(ERROR, "Exception while probing/reading buffer at %p, size 0x%lx\n", Buffer, Length);
+        ExFreePoolWithTag(TempBuffer, XENIFACE_POOL_TAG);
+        TempBuffer = NULL;
+        Status = GetExceptionCode();
     }
-}
 
+    *CapturedBuffer = TempBuffer;
 
-static DECLSPEC_NOINLINE NTSTATUS
-IoctlRead(
-    __in  PXENIFACE_FDO         Fdo,
-    __in  PCHAR             Buffer,
-    __in  ULONG             InLen,
-    __in  ULONG             OutLen,
-    __out PULONG_PTR        Info
-    )
-{
-    NTSTATUS    status;
-    PCHAR       Value;
-    ULONG       Length;
-
-    status = STATUS_INVALID_BUFFER_SIZE;
-    if (InLen == 0)
-        goto fail1;
-
-    status = STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
-        goto fail2;
-
-    status = XENBUS_STORE(Read, &Fdo->StoreInterface, NULL, NULL, Buffer, &Value);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
-    Length = (ULONG)strlen(Value) + 1;
-
-    status = STATUS_BUFFER_OVERFLOW;
-    if (OutLen == 0) {
-        XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)\n", __FUNCTION__, Buffer, Length);
-        goto done;
-    } 
-    
-    status = STATUS_INVALID_PARAMETER;
-    if (OutLen < Length)
-        goto fail4;
-
-    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)->\"%s\"\n", __FUNCTION__, Buffer, Length, Value);
-
-    RtlCopyMemory(Buffer, Value, Length);
-    Buffer[Length - 1] = 0;
-    status = STATUS_SUCCESS;
-
-done:
-    *Info = (ULONG_PTR)Length;
-    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
-    return status;
-
-fail4:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")=(%d < %d)\n", __FUNCTION__, Buffer, OutLen, Length);
-    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
-fail3:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__, Buffer);
-fail2:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
-fail1:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__, status);
-    return status;
+    return Status;
 }
 
-static DECLSPEC_NOINLINE NTSTATUS
-IoctlWrite(
-    __in  PXENIFACE_FDO         Fdo,
-    __in  PCHAR             Buffer,
-    __in  ULONG             InLen,
-    __in  ULONG             OutLen
+VOID
+__FreeCapturedBuffer(
+    __in  PVOID CapturedBuffer
     )
 {
-    NTSTATUS    status;
-    PCHAR       Value;
-    ULONG       Length;
-
-    status = STATUS_INVALID_BUFFER_SIZE;
-    if (InLen == 0 || OutLen != 0)
-        goto fail1;
-
-    status = STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
-        goto fail2;
-
-    Length = (ULONG)strlen(Buffer) + 1;
-    Value = Buffer + Length;
-
-    if (!__IsValidStr(Value, InLen - Length))
-        goto fail3;
-
-    status = XENBUS_STORE(Printf, &Fdo->StoreInterface, NULL, NULL, Buffer, Value);
-    if (!NT_SUCCESS(status))
-        goto fail4;
-
-    XenIfaceDebugPrint(INFO, "|%s: (\"%s\"=\"%s\")\n", __FUNCTION__, Buffer, Value);
-    return status;
-
-fail4:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")\n", __FUNCTION__, Value);
-fail3:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__, Buffer);
-fail2:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
-fail1:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__, status);
-    return status;
+    if (CapturedBuffer != NULL) {
+        ExFreePoolWithTag(CapturedBuffer, XENIFACE_POOL_TAG);
+    }
 }
 
-static DECLSPEC_NOINLINE NTSTATUS
-IoctlDirectory(
-    __in  PXENIFACE_FDO         Fdo,
-    __in  PCHAR             Buffer,
-    __in  ULONG             InLen,
-    __in  ULONG             OutLen,
-    __out PULONG_PTR        Info
+// Cleanup store watches and event channels, called on file object close.
+_IRQL_requires_(PASSIVE_LEVEL) // EvtchnFree calls KeFlushQueuedDpcs
+VOID
+XenIfaceCleanup(
+    __in  PXENIFACE_FDO Fdo,
+    __in  PFILE_OBJECT  FileObject
     )
 {
-    NTSTATUS    status;
-    PCHAR       Value;
-    ULONG       Length;
-    ULONG       Count;
-
-    status = STATUS_INVALID_BUFFER_SIZE;
-    if (InLen == 0)
-        goto fail1;
-
-    status = STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
-        goto fail2;
-
-    status = XENBUS_STORE(Directory, &Fdo->StoreInterface, NULL, NULL, Buffer, &Value);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
-    Length = __MultiSzLen(Value, &Count) + 1;
-
-    status = STATUS_BUFFER_OVERFLOW;
-    if (OutLen == 0) {
-        XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)(%d)\n", __FUNCTION__, Buffer, Length, Count);
-        goto done;
-    } 
-
-    status = STATUS_INVALID_PARAMETER;
-    if (OutLen < Length)
-        goto fail4;
-
-    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)(%d)\n", __FUNCTION__, Buffer, Length, Count);
-#if DBG
-    __DisplayMultiSz(__FUNCTION__, Value);
-#endif
-
-    RtlCopyMemory(Buffer, Value, Length);
-    Buffer[Length - 2] = 0;
-    Buffer[Length - 1] = 0;
-    status = STATUS_SUCCESS;
-
-done:
-    *Info = (ULONG_PTR)Length;
-    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
-    return status;
-
-fail4:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")=(%d < %d)\n", __FUNCTION__, Buffer, OutLen, Length);
-    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
-fail3:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__, Buffer);
-fail2:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
-fail1:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__, status);
-    return status;
-}
+    PLIST_ENTRY Node;
+    PXENIFACE_STORE_CONTEXT StoreContext;
+    PXENIFACE_EVTCHN_CONTEXT EvtchnContext;
+    KIRQL Irql;
+    LIST_ENTRY ToFree;
+
+    XenIfaceDebugPrint(TRACE, "FO %p, IRQL %d, Cpu %lu\n", FileObject, KeGetCurrentIrql(), KeGetCurrentProcessorNumber());
+
+    // store watches
+    KeAcquireSpinLock(&Fdo->StoreWatchLock, &Irql);
+    Node = Fdo->StoreWatchList.Flink;
+    while (Node->Flink != Fdo->StoreWatchList.Flink) {
+        StoreContext = CONTAINING_RECORD(Node, XENIFACE_STORE_CONTEXT, Entry);
+
+        Node = Node->Flink;
+        if (StoreContext->FileObject != FileObject)
+            continue;
+
+        XenIfaceDebugPrint(TRACE, "Store context %p\n", StoreContext);
+        RemoveEntryList(&StoreContext->Entry);
+        StoreFreeWatch(Fdo, StoreContext);
+    }
+    KeReleaseSpinLock(&Fdo->StoreWatchLock, Irql);
+
+    // event channels
+    InitializeListHead(&ToFree);
+    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
+    Node = Fdo->EvtchnList.Flink;
+    while (Node->Flink != Fdo->EvtchnList.Flink) {
+        EvtchnContext = CONTAINING_RECORD(Node, XENIFACE_EVTCHN_CONTEXT, Entry);
+
+        Node = Node->Flink;
+        if (EvtchnContext->FileObject != FileObject)
+            continue;
+
+        XenIfaceDebugPrint(TRACE, "Evtchn context %p\n", EvtchnContext);
+        RemoveEntryList(&EvtchnContext->Entry);
+        // EvtchnFree requires PASSIVE_LEVEL and we're inside a lock
+        InsertTailList(&ToFree, &EvtchnContext->Entry);
+    }
+    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
 
-static DECLSPEC_NOINLINE NTSTATUS
-IoctlRemove(
-    __in  PXENIFACE_FDO         Fdo,
-    __in  PCHAR             Buffer,
-    __in  ULONG             InLen,
-    __in  ULONG             OutLen
-    )
-{
-    NTSTATUS    status;
-
-    status = STATUS_INVALID_BUFFER_SIZE;
-    if (InLen == 0 || OutLen != 0)
-        goto fail1;
-
-    status = STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
-        goto fail2;
-
-    status = XENBUS_STORE(Remove, &Fdo->StoreInterface, NULL, NULL, Buffer);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
-    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")\n", __FUNCTION__, Buffer);
-    return status;
-
-fail3:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__, Buffer);
-fail2:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
-fail1:
-    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__, status);
-    return status;
+    Node = ToFree.Flink;
+    while (Node->Flink != ToFree.Flink) {
+        EvtchnContext = CONTAINING_RECORD(Node, XENIFACE_EVTCHN_CONTEXT, Entry);
+        Node = Node->Flink;
+
+        RemoveEntryList(&EvtchnContext->Entry);
+        EvtchnFree(Fdo, EvtchnContext);
+    }
 }
 
 NTSTATUS
-XenIFaceIoctl(
-    __in  PXENIFACE_FDO         Fdo,
-    __in  PIRP              Irp
+XenIfaceIoctl(
+    __in     PXENIFACE_FDO     Fdo,
+    __inout  PIRP              Irp
     )
 {
     NTSTATUS            status;
@@ -302,20 +160,71 @@ XenIFaceIoctl(
         goto done;
 
     switch (Stack->Parameters.DeviceIoControl.IoControlCode) {
+        // store
     case IOCTL_XENIFACE_STORE_READ:
-        status = IoctlRead(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp->IoStatus.Information);
+        status = IoctlStoreRead(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp->IoStatus.Information);
         break;
 
     case IOCTL_XENIFACE_STORE_WRITE:
-        status = IoctlWrite(Fdo, (PCHAR)Buffer, InLen, OutLen);
+        status = IoctlStoreWrite(Fdo, (PCHAR)Buffer, InLen, OutLen);
         break;
 
     case IOCTL_XENIFACE_STORE_DIRECTORY:
-        status = IoctlDirectory(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp->IoStatus.Information);
+        status = IoctlStoreDirectory(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp->IoStatus.Information);
         break;
 
     case IOCTL_XENIFACE_STORE_REMOVE:
-        status = IoctlRemove(Fdo, (PCHAR)Buffer, InLen, OutLen);
+        status = IoctlStoreRemove(Fdo, (PCHAR)Buffer, InLen, OutLen);
+        break;
+
+    case IOCTL_XENIFACE_STORE_SET_PERMISSIONS:
+        status = IoctlStoreSetPermissions(Fdo, Buffer, InLen, OutLen);
+        break;
+
+    case IOCTL_XENIFACE_STORE_ADD_WATCH:
+        status = IoctlStoreAddWatch(Fdo, Buffer, InLen, OutLen, Stack->FileObject, &Irp->IoStatus.Information);
+        break;
+
+    case IOCTL_XENIFACE_STORE_REMOVE_WATCH:
+        status = IoctlStoreRemoveWatch(Fdo, Buffer, InLen, OutLen, Stack->FileObject);
+        break;
+
+        // evtchn
+    case IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND:
+        status = IoctlEvtchnBindUnbound(Fdo, Buffer, InLen, OutLen, Stack->FileObject, &Irp->IoStatus.Information);
+        break;
+
+    case IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN:
+        status = IoctlEvtchnBindInterdomain(Fdo, Buffer, InLen, OutLen, Stack->FileObject, &Irp->IoStatus.Information);
+        break;
+
+    case IOCTL_XENIFACE_EVTCHN_CLOSE:
+        status = IoctlEvtchnClose(Fdo, Buffer, InLen, OutLen, Stack->FileObject);
+        break;
+
+    case IOCTL_XENIFACE_EVTCHN_NOTIFY:
+        status = IoctlEvtchnNotify(Fdo, Buffer, InLen, OutLen, Stack->FileObject);
+        break;
+
+    case IOCTL_XENIFACE_EVTCHN_UNMASK:
+        status = IoctlEvtchnUnmask(Fdo, Buffer, InLen, OutLen, Stack->FileObject);
+        break;
+
+        // gnttab
+    case IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS: // this is a METHOD_NEITHER IOCTL
+        status = IoctlGnttabPermitForeignAccess(Fdo, Stack->Parameters.DeviceIoControl.Type3InputBuffer, InLen, OutLen, Irp);
+        break;
+
+    case IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS:
+        status = IoctlGnttabRevokeForeignAccess(Fdo, Buffer, InLen, OutLen);
+        break;
+
+    case IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES: // this is a METHOD_NEITHER IOCTL
+        status = IoctlGnttabMapForeignPages(Fdo, Stack->Parameters.DeviceIoControl.Type3InputBuffer, InLen, OutLen, Irp);
+        break;
+
+    case IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES:
+        status = IoctlGnttabUnmapForeignPages(Fdo, Buffer, InLen, OutLen);
         break;
 
     default:
@@ -327,7 +236,8 @@ done:
 
     Irp->IoStatus.Status = status;
 
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    if (status != STATUS_PENDING)
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
     return status;
 }
diff --git a/src/xeniface/ioctls.h b/src/xeniface/ioctls.h
index 63de9eb..225ed7f 100644
--- a/src/xeniface/ioctls.h
+++ b/src/xeniface/ioctls.h
@@ -1,4 +1,5 @@
 /* Copyright (c) Citrix Systems Inc.
+ * Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, 
@@ -32,10 +33,333 @@
 #ifndef _IOCTLS_H_
 #define _IOCTLS_H_
 
+#include "xeniface_ioctls.h"
+
+typedef enum _XENIFACE_CONTEXT_TYPE {
+    XENIFACE_CONTEXT_GRANT = 1,
+    XENIFACE_CONTEXT_MAP
+} XENIFACE_CONTEXT_TYPE;
+
+typedef struct _XENIFACE_CONTEXT_ID {
+    XENIFACE_CONTEXT_TYPE  Type;
+    ULONG                  RequestId;
+    PEPROCESS              Process;
+} XENIFACE_CONTEXT_ID, *PXENIFACE_CONTEXT_ID;
+
+typedef struct _XENIFACE_STORE_CONTEXT {
+    LIST_ENTRY             Entry;
+    PXENBUS_STORE_WATCH    Watch;
+    PKEVENT                Event;
+    PVOID                  FileObject;
+} XENIFACE_STORE_CONTEXT, *PXENIFACE_STORE_CONTEXT;
+
+typedef struct _XENIFACE_EVTCHN_CONTEXT {
+    LIST_ENTRY             Entry;
+    PXENBUS_EVTCHN_CHANNEL Channel;
+    ULONG                  LocalPort;
+    PKEVENT                Event;
+    PXENIFACE_FDO          Fdo;
+    PVOID                  FileObject;
+} XENIFACE_EVTCHN_CONTEXT, *PXENIFACE_EVTCHN_CONTEXT;
+
+typedef struct _XENIFACE_GRANT_CONTEXT {
+    XENIFACE_CONTEXT_ID        Id;
+    LIST_ENTRY                 Entry;
+    PXENBUS_GNTTAB_ENTRY       *Grants;
+    USHORT                     RemoteDomain;
+    ULONG                      NumberPages;
+    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
+    ULONG                      NotifyOffset;
+    ULONG                      NotifyPort;
+    PVOID                      KernelVa;
+    PVOID                      UserVa;
+    PMDL                       Mdl;
+} XENIFACE_GRANT_CONTEXT, *PXENIFACE_GRANT_CONTEXT;
+
+typedef struct _XENIFACE_MAP_CONTEXT {
+    XENIFACE_CONTEXT_ID        Id;
+    LIST_ENTRY                 Entry;
+    USHORT                     RemoteDomain;
+    ULONG                      NumberPages;
+    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
+    ULONG                      NotifyOffset;
+    ULONG                      NotifyPort;
+    PHYSICAL_ADDRESS           Address;
+    PVOID                      KernelVa;
+    PVOID                      UserVa;
+    PMDL                       Mdl;
+} XENIFACE_MAP_CONTEXT, *PXENIFACE_MAP_CONTEXT;
+
 NTSTATUS
-XenIFaceIoctl(
-    __in  PXENIFACE_FDO         Fdo,
-    __in  PIRP              Irp
+__CaptureUserBuffer(
+    __in  PVOID Buffer,
+    __in  ULONG Length,
+    __out PVOID *CapturedBuffer
+    );
+
+VOID
+__FreeCapturedBuffer(
+    __in  PVOID CapturedBuffer
+    );
+
+NTSTATUS
+XenIfaceIoctl(
+    __in     PXENIFACE_FDO     Fdo,
+    __inout  PIRP              Irp
+    );
+
+_IRQL_requires_(PASSIVE_LEVEL)
+VOID
+XenIfaceCleanup(
+    __in  PXENIFACE_FDO Fdo,
+    __in  PFILE_OBJECT  FileObject
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRead(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreWrite(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreDirectory(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRemove(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PCHAR             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreSetPermissions(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreAddWatch(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlStoreRemoveWatch(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    );
+
+_IRQL_requires_max_(DISPATCH_LEVEL)
+VOID
+StoreFreeWatch(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_STORE_CONTEXT Context
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnBindUnbound(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnBindInterdomain(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnClose(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnNotify(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlEvtchnUnmask(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __in  PFILE_OBJECT      FileObject
+    );
+
+_Requires_lock_not_held_(Fdo->EvtchnLock)
+DECLSPEC_NOINLINE
+NTSTATUS
+EvtchnNotify(
+    __in      PXENIFACE_FDO Fdo,
+    __in      ULONG         LocalPort,
+    __in_opt  PFILE_OBJECT  FileObject
+    );
+
+_Function_class_(KDEFERRED_ROUTINE)
+_IRQL_requires_(DISPATCH_LEVEL)
+_IRQL_requires_same_
+VOID
+EvtchnNotificationDpc(
+    __in      PKDPC Dpc,
+    __in_opt  PVOID Context,
+    __in_opt  PVOID Argument1,
+    __in_opt  PVOID Argument2
+    );
+
+_IRQL_requires_(PASSIVE_LEVEL)
+VOID
+EvtchnFree(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_EVTCHN_CONTEXT Context
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabPermitForeignAccess(
+    __in     PXENIFACE_FDO  Fdo,
+    __in     PVOID          Buffer,
+    __in     ULONG          InLen,
+    __in     ULONG          OutLen,
+    __inout  PIRP           Irp
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabGetGrantResult(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabRevokeForeignAccess(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabMapForeignPages(
+    __in     PXENIFACE_FDO     Fdo,
+    __in     PVOID             Buffer,
+    __in     ULONG             InLen,
+    __in     ULONG             OutLen,
+    __inout  PIRP              Irp
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabGetMapResult(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen,
+    __out PULONG_PTR        Info
+    );
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlGnttabUnmapForeignPages(
+    __in  PXENIFACE_FDO     Fdo,
+    __in  PVOID             Buffer,
+    __in  ULONG             InLen,
+    __in  ULONG             OutLen
+    );
+
+_Acquires_exclusive_lock_(((PXENIFACE_FDO)Argument)->GnttabCacheLock)
+_IRQL_requires_(DISPATCH_LEVEL)
+VOID
+GnttabAcquireLock(
+    __in  PVOID Argument
+    );
+
+_Releases_exclusive_lock_(((PXENIFACE_FDO)Argument)->GnttabCacheLock)
+_IRQL_requires_(DISPATCH_LEVEL)
+VOID
+GnttabReleaseLock(
+    __in  PVOID Argument
+    );
+
+_Function_class_(IO_WORKITEM_ROUTINE)
+VOID
+CompleteGnttabIrp(
+    __in      PDEVICE_OBJECT DeviceObject,
+    __in_opt  PVOID          Context
+    );
+
+_IRQL_requires_max_(APC_LEVEL)
+VOID
+GnttabFreeGrant(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_GRANT_CONTEXT Context
+    );
+
+_IRQL_requires_max_(APC_LEVEL)
+VOID
+GnttabFreeMap(
+    __in     PXENIFACE_FDO Fdo,
+    __inout  PXENIFACE_MAP_CONTEXT Context
     );
 
 #endif // _IOCTLS_H_
diff --git a/src/xeniface/irp_queue.c b/src/xeniface/irp_queue.c
new file mode 100644
index 0000000..5184726
--- /dev/null
+++ b/src/xeniface/irp_queue.c
@@ -0,0 +1,162 @@
+/* Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
+ * 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 "driver.h"
+#include "irp_queue.h"
+#include "log.h"
+#include "ioctls.h"
+
+// Cancel-safe IRP queue implementation
+
+NTSTATUS
+CsqInsertIrpEx(
+    _In_  PIO_CSQ Csq,
+    _In_  PIRP    Irp,
+    _In_  PVOID   InsertContext // PXENIFACE_CONTEXT_ID
+    )
+{
+    PXENIFACE_FDO Fdo;
+
+    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
+
+    // Fail if a request with the same ID already exists.
+    if (CsqPeekNextIrp(Csq, NULL, InsertContext) != NULL)
+        return STATUS_INVALID_PARAMETER;
+
+    InsertTailList(&Fdo->IrpList, &Irp->Tail.Overlay.ListEntry);
+    return STATUS_SUCCESS;
+}
+
+VOID
+CsqRemoveIrp(
+    _In_  PIO_CSQ Csq,
+    _In_  PIRP    Irp
+    )
+{
+    UNREFERENCED_PARAMETER(Csq);
+
+    RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
+}
+
+PIRP
+CsqPeekNextIrp(
+    _In_      PIO_CSQ Csq,
+    _In_opt_  PIRP    Irp,
+    _In_opt_  PVOID   PeekContext // PXENIFACE_CONTEXT_ID
+    )
+{
+    PXENIFACE_FDO        Fdo;
+    PIRP                 NextIrp = NULL;
+    PLIST_ENTRY          Head, NextEntry;
+    PXENIFACE_CONTEXT_ID Id, TargetId;
+
+    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
+    TargetId = PeekContext;
+    Head = &Fdo->IrpList;
+
+    // If the IRP is NULL, we will start peeking from the list head,
+    // else we will start from that IRP onwards. This is done under the
+    // assumption that new IRPs are always inserted at the tail.
+
+    if (Irp == NULL) {
+        NextEntry = Head->Flink;
+    } else {
+        NextEntry = Irp->Tail.Overlay.ListEntry.Flink;
+    }
+
+    while (NextEntry != Head) {
+        NextIrp = CONTAINING_RECORD(NextEntry, IRP, Tail.Overlay.ListEntry);
+
+        if (PeekContext) {
+            Id = NextIrp->Tail.Overlay.DriverContext[0];
+            if (Id->RequestId == TargetId->RequestId && Id->Process == TargetId->Process)
+                break;
+        } else {
+            break;
+        }
+        NextIrp = NULL;
+        NextEntry = NextEntry->Flink;
+    }
+
+    return NextIrp;
+}
+
+_IRQL_raises_(DISPATCH_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_Acquires_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)->IrpQueueLock)
+VOID
+CsqAcquireLock(
+    _In_                                       PIO_CSQ Csq,
+    _Out_ _At_(*Irql, _Post_ _IRQL_saves_)     PKIRQL  Irql
+    )
+{
+    PXENIFACE_FDO Fdo;
+
+    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
+
+    KeAcquireSpinLock(&Fdo->IrpQueueLock, Irql);
+}
+
+_IRQL_requires_(DISPATCH_LEVEL)
+_Releases_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)->IrpQueueLock)
+VOID
+CsqReleaseLock(
+    _In_                    PIO_CSQ Csq,
+    _In_ _IRQL_restores_    KIRQL   Irql
+    )
+{
+    PXENIFACE_FDO Fdo;
+
+    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
+
+    KeReleaseSpinLock(&Fdo->IrpQueueLock, Irql);
+}
+
+_IRQL_requires_max_(DISPATCH_LEVEL)
+VOID
+CsqCompleteCanceledIrp(
+    _In_  PIO_CSQ Csq,
+    _In_  PIRP    Irp
+    )
+{
+    PXENIFACE_FDO Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
+    PIO_WORKITEM WorkItem;
+
+    XenIfaceDebugPrint(TRACE, "Irp %p, IRQL %d\n",
+                       Irp, KeGetCurrentIrql());
+
+    // This is not guaranteed to run at PASSIVE_LEVEL, so queue a work item
+    // to perform actual cleanup/IRP completion.
+
+    WorkItem = IoAllocateWorkItem(Fdo->Dx->DeviceObject);
+    Irp->Tail.Overlay.DriverContext[1] = WorkItem; // store so the work item can free it
+    IoQueueWorkItem(WorkItem, CompleteGnttabIrp, DelayedWorkQueue, Irp);
+}
diff --git a/src/xeniface/irp_queue.h b/src/xeniface/irp_queue.h
new file mode 100644
index 0000000..47c36dc
--- /dev/null
+++ b/src/xeniface/irp_queue.h
@@ -0,0 +1,81 @@
+/* Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
+ * 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 _IRP_QUEUE_H_
+#define _IRP_QUEUE_H_
+
+#include <ntddk.h>
+
+NTSTATUS
+CsqInsertIrpEx(
+    _In_  PIO_CSQ Csq,
+    _In_  PIRP    Irp,
+    _In_  PVOID   InsertContext
+    );
+
+VOID
+CsqRemoveIrp(
+    _In_  PIO_CSQ Csq,
+    _In_  PIRP    Irp
+    );
+
+PIRP
+CsqPeekNextIrp(
+    _In_      PIO_CSQ Csq,
+    _In_opt_  PIRP    Irp,
+    _In_opt_  PVOID   PeekContext // PXENIFACE_CONTEXT_ID
+    );
+
+_IRQL_raises_(DISPATCH_LEVEL)
+_IRQL_requires_max_(DISPATCH_LEVEL)
+_Acquires_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)->IrpQueueLock)
+VOID
+CsqAcquireLock(
+    _In_                                       PIO_CSQ Csq,
+    _Out_ _At_(*Irql, _Post_ _IRQL_saves_)     PKIRQL  Irql
+    );
+
+_IRQL_requires_(DISPATCH_LEVEL)
+_Releases_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)->IrpQueueLock)
+VOID
+CsqReleaseLock(
+    _In_                    PIO_CSQ Csq,
+    _In_ _IRQL_restores_    KIRQL   Irql
+    );
+
+_IRQL_requires_max_(DISPATCH_LEVEL)
+VOID
+CsqCompleteCanceledIrp(
+    _In_  PIO_CSQ             Csq,
+    _In_  PIRP                Irp
+    );
+
+#endif
diff --git a/vs2012/xeniface/xeniface.vcxproj b/vs2012/xeniface/xeniface.vcxproj
index a3472ba..fadc1d1 100644
--- a/vs2012/xeniface/xeniface.vcxproj
+++ b/vs2012/xeniface/xeniface.vcxproj
@@ -73,12 +73,16 @@
 		<FilesToPackage Include="@(Inf->'%(CopyOutput)')" Condition="'@(Inf)'!=''" />
 	</ItemGroup>
 	<ItemGroup>
-	        <ClCompile Include="../../src/xeniface/ioctls.c" />
-                <ClCompile Include="../../src/xeniface/wmi.c" />
-                <ClCompile Include="../../src/xeniface/driver.c" />
-                <ClCompile Include="../../src/xeniface/fdo.c" />
-                <ClCompile Include="../../src/xeniface/registry.c" />
-                <ClCompile Include="../../src\xeniface/thread.c" />
+		<ClCompile Include="..\..\src\xeniface\ioctls.c" />
+		<ClCompile Include="..\..\src\xeniface\wmi.c" />
+		<ClCompile Include="..\..\src\xeniface\driver.c" />
+		<ClCompile Include="..\..\src\xeniface\fdo.c" />
+		<ClCompile Include="..\..\src\xeniface\registry.c" />
+		<ClCompile Include="..\..\src\xeniface\thread.c" />
+		<ClCompile Include="..\..\src\xeniface\ioctl_evtchn.c" />
+		<ClCompile Include="..\..\src\xeniface\ioctl_gnttab.c" />
+		<ClCompile Include="..\..\src\xeniface\ioctl_store.c" />
+		<ClCompile Include="..\..\src\xeniface\irp_queue.c" />
 	</ItemGroup>
         <ItemGroup>
                 <Mofcomp Include="../../src/xeniface/wmi.mof">
@@ -96,5 +100,19 @@
 	<ItemGroup>
 		<Inf Include="..\xeniface.inf" />
 	</ItemGroup>
+	<ItemGroup>
+		<ClInclude Include="..\..\src\xeniface\assert.h" />
+		<ClInclude Include="..\..\src\xeniface\driver.h" />
+		<ClInclude Include="..\..\src\xeniface\fdo.h" />
+		<ClInclude Include="..\..\src\xeniface\ioctls.h" />
+		<ClInclude Include="..\..\src\xeniface\irp_queue.h" />
+		<ClInclude Include="..\..\src\xeniface\log.h" />
+		<ClInclude Include="..\..\src\xeniface\mutex.h" />
+		<ClInclude Include="..\..\src\xeniface\names.h" />
+		<ClInclude Include="..\..\src\xeniface\registry.h" />
+		<ClInclude Include="..\..\src\xeniface\thread.h" />
+		<ClInclude Include="..\..\src\xeniface\types.h" />
+		<ClInclude Include="..\..\src\xeniface\wmi.h" />
+	</ItemGroup>
 	<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 </Project>
diff --git a/vs2013/xeniface/xeniface.vcxproj b/vs2013/xeniface/xeniface.vcxproj
index fea2ad1..44a1cdf 100644
--- a/vs2013/xeniface/xeniface.vcxproj
+++ b/vs2013/xeniface/xeniface.vcxproj
@@ -125,12 +125,16 @@
     <FilesToPackage Include="@(Inf->'%(CopyOutput)')" Condition="'@(Inf)'!=''" />
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="../../src/xeniface/ioctls.c" />
-    <ClCompile Include="../../src/xeniface/wmi.c" />
-    <ClCompile Include="../../src/xeniface/driver.c" />
-    <ClCompile Include="../../src/xeniface/fdo.c" />
-    <ClCompile Include="../../src/xeniface/registry.c" />
-    <ClCompile Include="../../src\xeniface/thread.c" />
+    <ClCompile Include="..\..\src\xeniface\ioctls.c" />
+    <ClCompile Include="..\..\src\xeniface\wmi.c" />
+    <ClCompile Include="..\..\src\xeniface\driver.c" />
+    <ClCompile Include="..\..\src\xeniface\fdo.c" />
+    <ClCompile Include="..\..\src\xeniface\registry.c" />
+    <ClCompile Include="..\..\src\xeniface\thread.c" />
+    <ClCompile Include="..\..\src\xeniface\ioctl_evtchn.c" />
+    <ClCompile Include="..\..\src\xeniface\ioctl_gnttab.c" />
+    <ClCompile Include="..\..\src\xeniface\ioctl_store.c" />
+    <ClCompile Include="..\..\src\xeniface\irp_queue.c" />
   </ItemGroup>
   <ItemGroup>
     <Mofcomp Include="../../src/xeniface/wmi.mof">
@@ -148,5 +152,19 @@
   <ItemGroup>
     <Inf Include="..\xeniface.inf" />
   </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\..\src\xeniface\assert.h" />
+    <ClInclude Include="..\..\src\xeniface\driver.h" />
+    <ClInclude Include="..\..\src\xeniface\fdo.h" />
+    <ClInclude Include="..\..\src\xeniface\ioctls.h" />
+    <ClInclude Include="..\..\src\xeniface\irp_queue.h" />
+    <ClInclude Include="..\..\src\xeniface\log.h" />
+    <ClInclude Include="..\..\src\xeniface\mutex.h" />
+    <ClInclude Include="..\..\src\xeniface\names.h" />
+    <ClInclude Include="..\..\src\xeniface\registry.h" />
+    <ClInclude Include="..\..\src\xeniface\thread.h" />
+    <ClInclude Include="..\..\src\xeniface\types.h" />
+    <ClInclude Include="..\..\src\xeniface\wmi.h" />
+  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 </Project>
-- 
1.8.1.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 Wed Oct 21 05:26:47 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 21 Oct 2015 05:26: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 1ZolvC-0008F3-LS; Wed, 21 Oct 2015 05:26:46 +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 1ZolvC-0008DV-5K
	for win-pv-devel@lists.xenproject.org; Wed, 21 Oct 2015 05:26:46 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	8C/D0-10678-51227265; Wed, 21 Oct 2015 05:26:45 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-8.tower-31.messagelabs.com!1445405204!55126812!1
X-Originating-IP: [66.111.4.27]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjcgPT4gODQ2Mw==\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3543 invoked from network); 21 Oct 2015 05:26:45 -0000
Received: from out3-smtp.messagingengine.com (HELO
	out3-smtp.messagingengine.com) (66.111.4.27)
	by server-8.tower-31.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2015 05:26:45 -0000
Received: from compute6.internal (compute6.nyi.internal [10.202.2.46])
	by mailout.nyi.internal (Postfix) with ESMTP id 3CB962084C
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:26:44 -0400 (EDT)
Received: from frontend1 ([10.202.2.160])
	by compute6.internal (MEProxy); Wed, 21 Oct 2015 01:26:44 -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=Z4ieUVR609YG/wu9Vk1oPCwxYCc=; b=UC3C6N
	FpzwGQa1m3o084c4M4xoVRYdR6x4F7BdEHPSCPYBfw9dTJpGT9ZuKcxWWyg6swfV
	/6jIJ1iRFN+BjjJPLegIvpnEms6D9J4ycEyy/kVBd37w46Lo7eJQFkpTXe8f5b2s
	482ad2WQnpjyWbU4uFElM8/0PhvaIfGkoqRDQ=
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=Z4ieUVR609YG/wu9Vk1oPCwxYCc=; b=rSkwJ
	PjToC/7SDRTdLIf7qh3IfWxxU/cm/PKpxZC4A6BrJkb6R1MfmDoy3GDE64B/NuL/
	huD6ZZpvW6ZmD5AK436Egt1a059/xGJC8UYLUKE8OLL8KeyGdcYTmgFNeo4qymIF
	tEX3GHsUifBgBD4VSUAlqnMRknEEqz1yZq5RxE=
X-Sasl-enc: +0MYIANbN7ScZYXN00DhcmHke/pnyGdlFb8tD3plCy5W 1445405203
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id B12F3C0001A
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:26:43 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <56272214.8020006@invisiblethingslab.com>
Date: Wed, 21 Oct 2015 07:26:44 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 6/6] Bind to the latest XENBUS revision
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

Revision 0x0800000B or later is needed for STORE interface version 2 and
GNTTAB interface version 2.

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 src/xeniface.inf | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/xeniface.inf b/src/xeniface.inf
index b3112b9..df0abf3 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_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_IFACE&REV_08000009
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_IFACE&REV_08000009
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_IFACE&REV_08000009
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_IFACE&REV_0800000B
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_IFACE&REV_0800000B
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_IFACE&REV_0800000B
 
 [XenIface_Device.NT$ARCH$]
 CopyFiles=XenIface_Device.NT.Copy, ServiceDestDir.NT.Copy
-- 
1.8.1.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 Wed Oct 21 05:26:47 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 21 Oct 2015 05:26: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 1ZolvC-0008F3-LS; Wed, 21 Oct 2015 05:26:46 +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 1ZolvC-0008DV-5K
	for win-pv-devel@lists.xenproject.org; Wed, 21 Oct 2015 05:26:46 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	8C/D0-10678-51227265; Wed, 21 Oct 2015 05:26:45 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-8.tower-31.messagelabs.com!1445405204!55126812!1
X-Originating-IP: [66.111.4.27]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjcgPT4gODQ2Mw==\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3543 invoked from network); 21 Oct 2015 05:26:45 -0000
Received: from out3-smtp.messagingengine.com (HELO
	out3-smtp.messagingengine.com) (66.111.4.27)
	by server-8.tower-31.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2015 05:26:45 -0000
Received: from compute6.internal (compute6.nyi.internal [10.202.2.46])
	by mailout.nyi.internal (Postfix) with ESMTP id 3CB962084C
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:26:44 -0400 (EDT)
Received: from frontend1 ([10.202.2.160])
	by compute6.internal (MEProxy); Wed, 21 Oct 2015 01:26:44 -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=Z4ieUVR609YG/wu9Vk1oPCwxYCc=; b=UC3C6N
	FpzwGQa1m3o084c4M4xoVRYdR6x4F7BdEHPSCPYBfw9dTJpGT9ZuKcxWWyg6swfV
	/6jIJ1iRFN+BjjJPLegIvpnEms6D9J4ycEyy/kVBd37w46Lo7eJQFkpTXe8f5b2s
	482ad2WQnpjyWbU4uFElM8/0PhvaIfGkoqRDQ=
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=Z4ieUVR609YG/wu9Vk1oPCwxYCc=; b=rSkwJ
	PjToC/7SDRTdLIf7qh3IfWxxU/cm/PKpxZC4A6BrJkb6R1MfmDoy3GDE64B/NuL/
	huD6ZZpvW6ZmD5AK436Egt1a059/xGJC8UYLUKE8OLL8KeyGdcYTmgFNeo4qymIF
	tEX3GHsUifBgBD4VSUAlqnMRknEEqz1yZq5RxE=
X-Sasl-enc: +0MYIANbN7ScZYXN00DhcmHke/pnyGdlFb8tD3plCy5W 1445405203
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id B12F3C0001A
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:26:43 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <56272214.8020006@invisiblethingslab.com>
Date: Wed, 21 Oct 2015 07:26:44 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] [PATCH 6/6] Bind to the latest XENBUS revision
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

Revision 0x0800000B or later is needed for STORE interface version 2 and
GNTTAB interface version 2.

Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 src/xeniface.inf | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/xeniface.inf b/src/xeniface.inf
index b3112b9..df0abf3 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_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_IFACE&REV_08000009
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_IFACE&REV_08000009
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_IFACE&REV_08000009
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_IFACE&REV_0800000B
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_IFACE&REV_0800000B
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_IFACE&REV_0800000B
 
 [XenIface_Device.NT$ARCH$]
 CopyFiles=XenIface_Device.NT.Copy, ServiceDestDir.NT.Copy
-- 
1.8.1.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 Wed Oct 21 05:34:25 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 21 Oct 2015 05:34:25 +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 1Zom2Z-0008Fu-77; Wed, 21 Oct 2015 05:34:23 +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 1Zom2Y-0008Fp-Ex
	for win-pv-devel@lists.xenproject.org; Wed, 21 Oct 2015 05:34:22 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	17/E0-12889-DD327265; Wed, 21 Oct 2015 05:34:21 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1445405660!60061555!1
X-Originating-IP: [66.111.4.27]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjcgPT4gODQ2Mw==\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16913 invoked from network); 21 Oct 2015 05:34:21 -0000
Received: from out3-smtp.messagingengine.com (HELO
	out3-smtp.messagingengine.com) (66.111.4.27)
	by server-10.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2015 05:34:21 -0000
Received: from compute3.internal (compute3.nyi.internal [10.202.2.43])
	by mailout.nyi.internal (Postfix) with ESMTP id 20B1C20403
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:34:20 -0400 (EDT)
Received: from frontend1 ([10.202.2.160])
	by compute3.internal (MEProxy); Wed, 21 Oct 2015 01:34:20 -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=8jyPFp1xrePlqfGzPvIXAReSCpY=; b=Kqq/6z
	PXhrXoSn3EMI3KNDCbDw54mk0Q2qDjh8f6GOYVPrxSkPMFQtb3anbgYqXc7x/kGK
	Wg++ZhMUXHINIYx7dZEYMQXerRJtOqRWq9jm+U2zoN0lNIW6pB4kRBhtq4wtW3+f
	/eBFntUI8BwP3vZXk5V2ahddNcDxXxtUAqWT0=
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=8jyPFp1xrePlqfGzPvIXAReSCpY=; b=jWwuW
	YwVO44uM0DwzzkrL/+3ceuJqMAyypEyKDay5Aox7rNFa7SnlPBJPMnoQvzvya56/
	arNUkLo5VVNMu91e9rpk31ElpVWyjxj2tHM9YDtUDpnnfp8Q0HdZNI8915+gW9hO
	+gzjOe3HajVJi16H8yRFUNtQjDCEYsCXFNfucg=
X-Sasl-enc: JSeRSMBgLA3bZNcusQNv6EHMPSzbu/4No3qVzCRRrRNw 1445405659
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 90968C00018
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:34:19 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <562723DC.9040805@invisiblethingslab.com>
Date: Wed, 21 Oct 2015 07:34:20 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Content-Length: 783
Subject: [win-pv-devel] Xeniface IOCTLs
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

QWxyaWdodCwgSSBwb3N0ZWQgdGhlIHVwZGF0ZWQgcGF0Y2ggc2VyaWVzIGZvciB0aGUgSU9DVExz
IGltcGxlbWVudGF0aW9uCmluIHhlbmlmYWNlLiBUaGUgbWFpbiBjaGFuZ2UgaXMgdGhhdCBncmFu
dC9tYXAgSU9DVExzIG5vdyB1c2UKTUVUSE9EX05FSVRIRVIgYXMgc3VnZ2VzdGVkIHdoaWNoIHNp
bXBsaWZpZXMgcGFzc2luZyByZXR1cm4gdmFsdWVzIGJhY2sKdG8gdXNlciBtb2RlLiBJZiBJIG1p
c3NlZCBhbnkgb2YgdGhlIHN0eWxpc3RpYyBvciBmb3JtYXR0aW5nCmNvcnJlY3Rpb25zLCBmZWVs
IGZyZWUgdG8gY2hhbmdlIHdoZXJlIGFwcHJvcHJpYXRlIDopCgotLSAKUmFmYcWCIFdvamR5xYJh
ClF1YmVzIFRvb2xzIGZvciBXaW5kb3dzIGRldmVsb3BlcgpodHRwczovL3d3dy5xdWJlcy1vcy5v
cmcvCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4t
cHYtZGV2ZWwgbWFpbGluZyBsaXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpo
dHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1w
di1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Wed Oct 21 05:34:25 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 21 Oct 2015 05:34:25 +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 1Zom2Z-0008Fu-77; Wed, 21 Oct 2015 05:34:23 +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 1Zom2Y-0008Fp-Ex
	for win-pv-devel@lists.xenproject.org; Wed, 21 Oct 2015 05:34:22 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	17/E0-12889-DD327265; Wed, 21 Oct 2015 05:34:21 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1445405660!60061555!1
X-Originating-IP: [66.111.4.27]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjcgPT4gODQ2Mw==\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16913 invoked from network); 21 Oct 2015 05:34:21 -0000
Received: from out3-smtp.messagingengine.com (HELO
	out3-smtp.messagingengine.com) (66.111.4.27)
	by server-10.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2015 05:34:21 -0000
Received: from compute3.internal (compute3.nyi.internal [10.202.2.43])
	by mailout.nyi.internal (Postfix) with ESMTP id 20B1C20403
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:34:20 -0400 (EDT)
Received: from frontend1 ([10.202.2.160])
	by compute3.internal (MEProxy); Wed, 21 Oct 2015 01:34:20 -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=8jyPFp1xrePlqfGzPvIXAReSCpY=; b=Kqq/6z
	PXhrXoSn3EMI3KNDCbDw54mk0Q2qDjh8f6GOYVPrxSkPMFQtb3anbgYqXc7x/kGK
	Wg++ZhMUXHINIYx7dZEYMQXerRJtOqRWq9jm+U2zoN0lNIW6pB4kRBhtq4wtW3+f
	/eBFntUI8BwP3vZXk5V2ahddNcDxXxtUAqWT0=
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=8jyPFp1xrePlqfGzPvIXAReSCpY=; b=jWwuW
	YwVO44uM0DwzzkrL/+3ceuJqMAyypEyKDay5Aox7rNFa7SnlPBJPMnoQvzvya56/
	arNUkLo5VVNMu91e9rpk31ElpVWyjxj2tHM9YDtUDpnnfp8Q0HdZNI8915+gW9hO
	+gzjOe3HajVJi16H8yRFUNtQjDCEYsCXFNfucg=
X-Sasl-enc: JSeRSMBgLA3bZNcusQNv6EHMPSzbu/4No3qVzCRRrRNw 1445405659
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 90968C00018
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 21 Oct 2015 01:34:19 -0400 (EDT)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <562723DC.9040805@invisiblethingslab.com>
Date: Wed, 21 Oct 2015 07:34:20 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Content-Length: 783
Subject: [win-pv-devel] Xeniface IOCTLs
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

QWxyaWdodCwgSSBwb3N0ZWQgdGhlIHVwZGF0ZWQgcGF0Y2ggc2VyaWVzIGZvciB0aGUgSU9DVExz
IGltcGxlbWVudGF0aW9uCmluIHhlbmlmYWNlLiBUaGUgbWFpbiBjaGFuZ2UgaXMgdGhhdCBncmFu
dC9tYXAgSU9DVExzIG5vdyB1c2UKTUVUSE9EX05FSVRIRVIgYXMgc3VnZ2VzdGVkIHdoaWNoIHNp
bXBsaWZpZXMgcGFzc2luZyByZXR1cm4gdmFsdWVzIGJhY2sKdG8gdXNlciBtb2RlLiBJZiBJIG1p
c3NlZCBhbnkgb2YgdGhlIHN0eWxpc3RpYyBvciBmb3JtYXR0aW5nCmNvcnJlY3Rpb25zLCBmZWVs
IGZyZWUgdG8gY2hhbmdlIHdoZXJlIGFwcHJvcHJpYXRlIDopCgotLSAKUmFmYcWCIFdvamR5xYJh
ClF1YmVzIFRvb2xzIGZvciBXaW5kb3dzIGRldmVsb3BlcgpodHRwczovL3d3dy5xdWJlcy1vcy5v
cmcvCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4t
cHYtZGV2ZWwgbWFpbGluZyBsaXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpo
dHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1w
di1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Wed Oct 21 08:49:19 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 21 Oct 2015 08:49:19 +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 1Zop5C-0002FM-9J; Wed, 21 Oct 2015 08:49:18 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72942f4b7=Paul.Durrant@citrix.com>)
	id 1Zop5B-0002FF-5S
	for win-pv-devel@lists.xenproject.org; Wed, 21 Oct 2015 08:49:17 +0000
Received: from [85.158.139.211] by server-13.bemta-5.messagelabs.com id
	4F/04-02324-C8157265; Wed, 21 Oct 2015 08:49:16 +0000
X-Env-Sender: prvs=72942f4b7=Paul.Durrant@citrix.com
X-Msg-Ref: server-12.tower-206.messagelabs.com!1445417355!43863376!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 8331 invoked from network); 21 Oct 2015 08:49:15 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-12.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	21 Oct 2015 08:49:15 -0000
X-IronPort-AV: E=Sophos;i="5.17,711,1437436800"; 
   d="scan'208";a="5775352"
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] Xeniface IOCTLs
Thread-Index: AQHRC8Iq/cwkmd5CnUe8TMbSDx8HNJ51oumw
Date: Wed, 21 Oct 2015 08:49:10 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F61D6D6@AMSPEX01CL01.citrite.net>
References: <562723DC.9040805@invisiblethingslab.com>
In-Reply-To: <562723DC.9040805@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] Xeniface IOCTLs
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
MjEgT2N0b2JlciAyMDE1IDA2OjM0DQo+IFRvOiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVj
dC5vcmcNCj4gU3ViamVjdDogW3dpbi1wdi1kZXZlbF0gWGVuaWZhY2UgSU9DVExzDQo+IA0KPiBB
bHJpZ2h0LCBJIHBvc3RlZCB0aGUgdXBkYXRlZCBwYXRjaCBzZXJpZXMgZm9yIHRoZSBJT0NUTHMg
aW1wbGVtZW50YXRpb24NCj4gaW4geGVuaWZhY2UuIFRoZSBtYWluIGNoYW5nZSBpcyB0aGF0IGdy
YW50L21hcCBJT0NUTHMgbm93IHVzZQ0KPiBNRVRIT0RfTkVJVEhFUiBhcyBzdWdnZXN0ZWQgd2hp
Y2ggc2ltcGxpZmllcyBwYXNzaW5nIHJldHVybiB2YWx1ZXMgYmFjaw0KPiB0byB1c2VyIG1vZGUu
IElmIEkgbWlzc2VkIGFueSBvZiB0aGUgc3R5bGlzdGljIG9yIGZvcm1hdHRpbmcNCj4gY29ycmVj
dGlvbnMsIGZlZWwgZnJlZSB0byBjaGFuZ2Ugd2hlcmUgYXBwcm9wcmlhdGUgOikNCj4NCg0KQ29v
bC4gSSdsbCB0YWtlIGEgbG9vayBhcyBzb29uIGFzIEkgY2FuLiBJJ2xsIGJlIG9uIHZhY2F0aW9u
IGZyb20gTW9uIDI2dGggT2N0IHRocnUgVGh1IDMwdGggYnV0IEknbGwgdHJ5IHRvIHRha2UgYSBs
b29rIGJlZm9yZSB0aGVuLg0KDQogIFBhdWwNCiANCj4gLS0NCj4gUmFmYcWCIFdvamR5xYJhDQo+
IFF1YmVzIFRvb2xzIGZvciBXaW5kb3dzIGRldmVsb3Blcg0KPiBodHRwczovL3d3dy5xdWJlcy1v
cy5vcmcvDQo+IA0KPiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fXw0KPiB3aW4tcHYtZGV2ZWwgbWFpbGluZyBsaXN0DQo+IHdpbi1wdi1kZXZlbEBsaXN0cy54
ZW5wcm9qZWN0Lm9yZw0KPiBodHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWls
bWFuL2xpc3RpbmZvL3dpbi1wdi1kZXZlbA0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX18Kd2luLXB2LWRldmVsIG1haWxpbmcgbGlzdAp3aW4tcHYtZGV2ZWxA
bGlzdHMueGVucHJvamVjdC5vcmcKaHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4v
bWFpbG1hbi9saXN0aW5mby93aW4tcHYtZGV2ZWw=

From win-pv-devel-bounces@lists.xenproject.org Wed Oct 21 08:49:19 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 21 Oct 2015 08:49:19 +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 1Zop5C-0002FM-9J; Wed, 21 Oct 2015 08:49:18 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=72942f4b7=Paul.Durrant@citrix.com>)
	id 1Zop5B-0002FF-5S
	for win-pv-devel@lists.xenproject.org; Wed, 21 Oct 2015 08:49:17 +0000
Received: from [85.158.139.211] by server-13.bemta-5.messagelabs.com id
	4F/04-02324-C8157265; Wed, 21 Oct 2015 08:49:16 +0000
X-Env-Sender: prvs=72942f4b7=Paul.Durrant@citrix.com
X-Msg-Ref: server-12.tower-206.messagelabs.com!1445417355!43863376!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 8331 invoked from network); 21 Oct 2015 08:49:15 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-12.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	21 Oct 2015 08:49:15 -0000
X-IronPort-AV: E=Sophos;i="5.17,711,1437436800"; 
   d="scan'208";a="5775352"
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] Xeniface IOCTLs
Thread-Index: AQHRC8Iq/cwkmd5CnUe8TMbSDx8HNJ51oumw
Date: Wed, 21 Oct 2015 08:49:10 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F61D6D6@AMSPEX01CL01.citrite.net>
References: <562723DC.9040805@invisiblethingslab.com>
In-Reply-To: <562723DC.9040805@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] Xeniface IOCTLs
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
MjEgT2N0b2JlciAyMDE1IDA2OjM0DQo+IFRvOiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVj
dC5vcmcNCj4gU3ViamVjdDogW3dpbi1wdi1kZXZlbF0gWGVuaWZhY2UgSU9DVExzDQo+IA0KPiBB
bHJpZ2h0LCBJIHBvc3RlZCB0aGUgdXBkYXRlZCBwYXRjaCBzZXJpZXMgZm9yIHRoZSBJT0NUTHMg
aW1wbGVtZW50YXRpb24NCj4gaW4geGVuaWZhY2UuIFRoZSBtYWluIGNoYW5nZSBpcyB0aGF0IGdy
YW50L21hcCBJT0NUTHMgbm93IHVzZQ0KPiBNRVRIT0RfTkVJVEhFUiBhcyBzdWdnZXN0ZWQgd2hp
Y2ggc2ltcGxpZmllcyBwYXNzaW5nIHJldHVybiB2YWx1ZXMgYmFjaw0KPiB0byB1c2VyIG1vZGUu
IElmIEkgbWlzc2VkIGFueSBvZiB0aGUgc3R5bGlzdGljIG9yIGZvcm1hdHRpbmcNCj4gY29ycmVj
dGlvbnMsIGZlZWwgZnJlZSB0byBjaGFuZ2Ugd2hlcmUgYXBwcm9wcmlhdGUgOikNCj4NCg0KQ29v
bC4gSSdsbCB0YWtlIGEgbG9vayBhcyBzb29uIGFzIEkgY2FuLiBJJ2xsIGJlIG9uIHZhY2F0aW9u
IGZyb20gTW9uIDI2dGggT2N0IHRocnUgVGh1IDMwdGggYnV0IEknbGwgdHJ5IHRvIHRha2UgYSBs
b29rIGJlZm9yZSB0aGVuLg0KDQogIFBhdWwNCiANCj4gLS0NCj4gUmFmYcWCIFdvamR5xYJhDQo+
IFF1YmVzIFRvb2xzIGZvciBXaW5kb3dzIGRldmVsb3Blcg0KPiBodHRwczovL3d3dy5xdWJlcy1v
cy5vcmcvDQo+IA0KPiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fXw0KPiB3aW4tcHYtZGV2ZWwgbWFpbGluZyBsaXN0DQo+IHdpbi1wdi1kZXZlbEBsaXN0cy54
ZW5wcm9qZWN0Lm9yZw0KPiBodHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWls
bWFuL2xpc3RpbmZvL3dpbi1wdi1kZXZlbA0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX18Kd2luLXB2LWRldmVsIG1haWxpbmcgbGlzdAp3aW4tcHYtZGV2ZWxA
bGlzdHMueGVucHJvamVjdC5vcmcKaHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4v
bWFpbG1hbi9saXN0aW5mby93aW4tcHYtZGV2ZWw=

From win-pv-devel-bounces@lists.xenproject.org Thu Oct 22 11:26:16 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 11:26:16 +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 1ZpE0d-0003LF-En; Thu, 22 Oct 2015 11:26:15 +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 1ZpE0b-0003L9-OS
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 11:26:13 +0000
Received: from [85.158.137.68] by server-12.bemta-3.messagelabs.com id
	DE/9E-05269-5D7C8265; Thu, 22 Oct 2015 11:26:13 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-10.tower-31.messagelabs.com!1445513172!55673140!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 13719 invoked from network); 22 Oct 2015 11:26:12 -0000
Received: from mail-wi0-f173.google.com (HELO mail-wi0-f173.google.com)
	(209.85.212.173)
	by server-10.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 11:26:12 -0000
Received: by wikq8 with SMTP id q8so26981154wik.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 04:26: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;
	bh=WeXPcEWesEHCTYaMwCenAXGspkJo6JS+moNFGvkPYy0=;
	b=wnXG5wOSfybSXNWirDU7/jBBe7EqtCRwcWU+mHF8V57xLz4xyfp2Vc6kV/7HLitUZq
	IUh5vBCo+loczWERO0Ge8eUF2iqHI0paxhrIrtDxz8/z2aGCLopKZ/jmgWTqO+bfLPOu
	f61f3p+AxDBP38iBLwxT5mxcBQ6uRxNHTIRN+KSrNMlG5kmmZe57HQZePmb2jlMDItAa
	Ji5IBXHtJpqBA/wGdO9eJOkJ1uNDk4Ny+gMkgoFkTIEp3jaz/Hz8hng2QLShvvaMult9
	kcBixlSObDGIL9ixVfiOiZ2U/3Zv1Zm8zCV9gnnA9R3jY9fUVCymiPHXPrKlEh2Wh2md
	m2Cg==
X-Received: by 10.194.9.97 with SMTP id y1mr19404008wja.84.1445513171775;
	Thu, 22 Oct 2015 04:26:11 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	bd4sm16257948wjb.15.2015.10.22.04.26.10
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 04:26: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: Thu, 22 Oct 2015 12:26:22 +0100
Message-Id: <1445513182-3160-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] Add missing parameterization of vendor device
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 vendor device check in XENFILT was incorrectly hard-coded to C000 rather
than the prevailing vendor device id set at build time.

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

diff --git a/src/xenfilt/pvdevice.c b/src/xenfilt/pvdevice.c
index 04d8193..179dc3d 100644
--- a/src/xenfilt/pvdevice.c
+++ b/src/xenfilt/pvdevice.c
@@ -72,6 +72,7 @@ __PvdeviceFree(
 static const CHAR *PvdeviceLegacyPrefix[] = {
     "PCI\\VEN_5853&DEV_0001",
     "PCI\\VEN_5853&DEV_0002",
+    NULL
 };
 
 static BOOLEAN
@@ -84,7 +85,7 @@ PvdeviceIsLegacy(
 
     UNREFERENCED_PARAMETER(Context);
 
-    for (Index = 0; Index < ARRAYSIZE(PvdeviceLegacyPrefix); Index++) {
+    for (Index = 0; PvdeviceLegacyPrefix[Index] != NULL; Index++) {
         const CHAR  *Prefix = PvdeviceLegacyPrefix[Index];
 
         if (_strnicmp(DeviceID, Prefix, strlen(Prefix)) == 0)
@@ -95,7 +96,10 @@ PvdeviceIsLegacy(
 }
 
 static const CHAR *PvdeviceVendorDeviceID[] = {
-    "PCI\\VEN_5853&DEV_C000&SUBSYS_C0005853&REV_01", // XenServer
+#ifdef VENDOR_DEVICE_ID_STR
+    "PCI\\VEN_5853&DEV_" VENDOR_DEVICE_ID_STR "&SUBSYS_C0005853&REV_01",
+#endif
+    NULL
 };
 
 static BOOLEAN
@@ -105,7 +109,7 @@ PvdeviceIsVendorPresent(
 {
     ULONG                           Index;
 
-    for (Index = 0; Index < ARRAYSIZE(PvdeviceVendorDeviceID); Index++) {
+    for (Index = 0; PvdeviceVendorDeviceID[Index] != NULL; Index++) {
         const CHAR  *DeviceID = PvdeviceVendorDeviceID[Index];
 
         if (XENFILT_EMULATED(IsDevicePresent,
-- 
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 Oct 22 11:26:16 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 11:26:16 +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 1ZpE0d-0003LF-En; Thu, 22 Oct 2015 11:26:15 +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 1ZpE0b-0003L9-OS
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 11:26:13 +0000
Received: from [85.158.137.68] by server-12.bemta-3.messagelabs.com id
	DE/9E-05269-5D7C8265; Thu, 22 Oct 2015 11:26:13 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-10.tower-31.messagelabs.com!1445513172!55673140!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 13719 invoked from network); 22 Oct 2015 11:26:12 -0000
Received: from mail-wi0-f173.google.com (HELO mail-wi0-f173.google.com)
	(209.85.212.173)
	by server-10.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 11:26:12 -0000
Received: by wikq8 with SMTP id q8so26981154wik.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 04:26: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;
	bh=WeXPcEWesEHCTYaMwCenAXGspkJo6JS+moNFGvkPYy0=;
	b=wnXG5wOSfybSXNWirDU7/jBBe7EqtCRwcWU+mHF8V57xLz4xyfp2Vc6kV/7HLitUZq
	IUh5vBCo+loczWERO0Ge8eUF2iqHI0paxhrIrtDxz8/z2aGCLopKZ/jmgWTqO+bfLPOu
	f61f3p+AxDBP38iBLwxT5mxcBQ6uRxNHTIRN+KSrNMlG5kmmZe57HQZePmb2jlMDItAa
	Ji5IBXHtJpqBA/wGdO9eJOkJ1uNDk4Ny+gMkgoFkTIEp3jaz/Hz8hng2QLShvvaMult9
	kcBixlSObDGIL9ixVfiOiZ2U/3Zv1Zm8zCV9gnnA9R3jY9fUVCymiPHXPrKlEh2Wh2md
	m2Cg==
X-Received: by 10.194.9.97 with SMTP id y1mr19404008wja.84.1445513171775;
	Thu, 22 Oct 2015 04:26:11 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	bd4sm16257948wjb.15.2015.10.22.04.26.10
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 04:26: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: Thu, 22 Oct 2015 12:26:22 +0100
Message-Id: <1445513182-3160-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] Add missing parameterization of vendor device
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 vendor device check in XENFILT was incorrectly hard-coded to C000 rather
than the prevailing vendor device id set at build time.

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

diff --git a/src/xenfilt/pvdevice.c b/src/xenfilt/pvdevice.c
index 04d8193..179dc3d 100644
--- a/src/xenfilt/pvdevice.c
+++ b/src/xenfilt/pvdevice.c
@@ -72,6 +72,7 @@ __PvdeviceFree(
 static const CHAR *PvdeviceLegacyPrefix[] = {
     "PCI\\VEN_5853&DEV_0001",
     "PCI\\VEN_5853&DEV_0002",
+    NULL
 };
 
 static BOOLEAN
@@ -84,7 +85,7 @@ PvdeviceIsLegacy(
 
     UNREFERENCED_PARAMETER(Context);
 
-    for (Index = 0; Index < ARRAYSIZE(PvdeviceLegacyPrefix); Index++) {
+    for (Index = 0; PvdeviceLegacyPrefix[Index] != NULL; Index++) {
         const CHAR  *Prefix = PvdeviceLegacyPrefix[Index];
 
         if (_strnicmp(DeviceID, Prefix, strlen(Prefix)) == 0)
@@ -95,7 +96,10 @@ PvdeviceIsLegacy(
 }
 
 static const CHAR *PvdeviceVendorDeviceID[] = {
-    "PCI\\VEN_5853&DEV_C000&SUBSYS_C0005853&REV_01", // XenServer
+#ifdef VENDOR_DEVICE_ID_STR
+    "PCI\\VEN_5853&DEV_" VENDOR_DEVICE_ID_STR "&SUBSYS_C0005853&REV_01",
+#endif
+    NULL
 };
 
 static BOOLEAN
@@ -105,7 +109,7 @@ PvdeviceIsVendorPresent(
 {
     ULONG                           Index;
 
-    for (Index = 0; Index < ARRAYSIZE(PvdeviceVendorDeviceID); Index++) {
+    for (Index = 0; PvdeviceVendorDeviceID[Index] != NULL; Index++) {
         const CHAR  *DeviceID = PvdeviceVendorDeviceID[Index];
 
         if (XENFILT_EMULATED(IsDevicePresent,
-- 
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 Oct 22 13:14:11 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 13:14:11 +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 1ZpFh4-00024v-Jp; Thu, 22 Oct 2015 13:14:10 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=73015fc8d=owen.smith@citrix.com>)
	id 1ZpFh3-00024n-ST
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 13:14:09 +0000
Received: from [85.158.139.211] by server-12.bemta-5.messagelabs.com id
	E7/25-19220-121E8265; Thu, 22 Oct 2015 13:14:09 +0000
X-Env-Sender: prvs=73015fc8d=owen.smith@citrix.com
X-Msg-Ref: server-3.tower-206.messagelabs.com!1445519647!12177226!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 20873 invoked from network); 22 Oct 2015 13:14:08 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-3.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 13:14:08 -0000
X-IronPort-AV: E=Sophos;i="5.20,182,1444694400"; d="scan'208";a="312161392"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Thu, 22 Oct 2015 14:13:48 +0100
Message-ID: <1445519628-22124-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] Kick notifier DPC directly.
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

EVTCHN(Trigger, ...) was changed with the FiFo event channel
implementation, which led to a performance regression. Kicking
the notifier does not require triggering the local end of the
event channel, so shortcut this process by queueing the notifier
DPC directly.

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/notifier.c | 12 ++++++++++++
 src/xenvbd/notifier.h |  5 +++++
 src/xenvbd/pdo.c      |  8 ++++----
 3 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/src/xenvbd/notifier.c b/src/xenvbd/notifier.c
index b812d69..e9943fa 100644
--- a/src/xenvbd/notifier.c
+++ b/src/xenvbd/notifier.c
@@ -312,6 +312,18 @@ NotifierDebugCallback(
 }
 
 VOID
+NotifierKick(
+    IN  PXENVBD_NOTIFIER            Notifier
+    )
+{
+    if (Notifier->Enabled) {
+		if (KeInsertQueueDpc(&Notifier->Dpc, NULL, NULL)) {
+			++Notifier->NumDpcs;
+        }
+    }
+}
+
+VOID
 NotifierTrigger(
     IN  PXENVBD_NOTIFIER            Notifier
     )
diff --git a/src/xenvbd/notifier.h b/src/xenvbd/notifier.h
index 1c368e6..4cf35e7 100644
--- a/src/xenvbd/notifier.h
+++ b/src/xenvbd/notifier.h
@@ -84,6 +84,11 @@ NotifierDebugCallback(
     );
 
 extern VOID
+NotifierKick(
+    IN  PXENVBD_NOTIFIER            Notifier
+    );
+
+extern VOID
 NotifierTrigger(
     IN  PXENVBD_NOTIFIER            Notifier
     );
diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index e00729e..198c4d3 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -1860,7 +1860,7 @@ PdoReadWrite(
     }
 
     QueueAppend(&Pdo->FreshSrbs, &SrbExt->Entry);
-    NotifierTrigger(Notifier);
+    NotifierKick(Notifier);
 
     return FALSE;
 }
@@ -1889,7 +1889,7 @@ PdoSyncCache(
     }
 
     QueueAppend(&Pdo->FreshSrbs, &SrbExt->Entry);
-    NotifierTrigger(Notifier);
+    NotifierKick(Notifier);
 
     return FALSE;
 }
@@ -1918,7 +1918,7 @@ PdoUnmap(
     }
 
     QueueAppend(&Pdo->FreshSrbs, &SrbExt->Entry);
-    NotifierTrigger(Notifier);
+    NotifierKick(Notifier);
 
     return FALSE;
 }
@@ -2252,7 +2252,7 @@ __PdoQueueShutdown(
     PXENVBD_NOTIFIER    Notifier = FrontendGetNotifier(Pdo->Frontend);
 
     QueueAppend(&Pdo->ShutdownSrbs, &SrbExt->Entry);
-    NotifierTrigger(Notifier);
+    NotifierKick(Notifier);
 }
 
 static FORCEINLINE VOID
-- 
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 Thu Oct 22 13:14:11 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 13:14:11 +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 1ZpFh4-00024v-Jp; Thu, 22 Oct 2015 13:14:10 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=73015fc8d=owen.smith@citrix.com>)
	id 1ZpFh3-00024n-ST
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 13:14:09 +0000
Received: from [85.158.139.211] by server-12.bemta-5.messagelabs.com id
	E7/25-19220-121E8265; Thu, 22 Oct 2015 13:14:09 +0000
X-Env-Sender: prvs=73015fc8d=owen.smith@citrix.com
X-Msg-Ref: server-3.tower-206.messagelabs.com!1445519647!12177226!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 20873 invoked from network); 22 Oct 2015 13:14:08 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-3.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 13:14:08 -0000
X-IronPort-AV: E=Sophos;i="5.20,182,1444694400"; d="scan'208";a="312161392"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Thu, 22 Oct 2015 14:13:48 +0100
Message-ID: <1445519628-22124-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] Kick notifier DPC directly.
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

EVTCHN(Trigger, ...) was changed with the FiFo event channel
implementation, which led to a performance regression. Kicking
the notifier does not require triggering the local end of the
event channel, so shortcut this process by queueing the notifier
DPC directly.

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/notifier.c | 12 ++++++++++++
 src/xenvbd/notifier.h |  5 +++++
 src/xenvbd/pdo.c      |  8 ++++----
 3 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/src/xenvbd/notifier.c b/src/xenvbd/notifier.c
index b812d69..e9943fa 100644
--- a/src/xenvbd/notifier.c
+++ b/src/xenvbd/notifier.c
@@ -312,6 +312,18 @@ NotifierDebugCallback(
 }
 
 VOID
+NotifierKick(
+    IN  PXENVBD_NOTIFIER            Notifier
+    )
+{
+    if (Notifier->Enabled) {
+		if (KeInsertQueueDpc(&Notifier->Dpc, NULL, NULL)) {
+			++Notifier->NumDpcs;
+        }
+    }
+}
+
+VOID
 NotifierTrigger(
     IN  PXENVBD_NOTIFIER            Notifier
     )
diff --git a/src/xenvbd/notifier.h b/src/xenvbd/notifier.h
index 1c368e6..4cf35e7 100644
--- a/src/xenvbd/notifier.h
+++ b/src/xenvbd/notifier.h
@@ -84,6 +84,11 @@ NotifierDebugCallback(
     );
 
 extern VOID
+NotifierKick(
+    IN  PXENVBD_NOTIFIER            Notifier
+    );
+
+extern VOID
 NotifierTrigger(
     IN  PXENVBD_NOTIFIER            Notifier
     );
diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index e00729e..198c4d3 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -1860,7 +1860,7 @@ PdoReadWrite(
     }
 
     QueueAppend(&Pdo->FreshSrbs, &SrbExt->Entry);
-    NotifierTrigger(Notifier);
+    NotifierKick(Notifier);
 
     return FALSE;
 }
@@ -1889,7 +1889,7 @@ PdoSyncCache(
     }
 
     QueueAppend(&Pdo->FreshSrbs, &SrbExt->Entry);
-    NotifierTrigger(Notifier);
+    NotifierKick(Notifier);
 
     return FALSE;
 }
@@ -1918,7 +1918,7 @@ PdoUnmap(
     }
 
     QueueAppend(&Pdo->FreshSrbs, &SrbExt->Entry);
-    NotifierTrigger(Notifier);
+    NotifierKick(Notifier);
 
     return FALSE;
 }
@@ -2252,7 +2252,7 @@ __PdoQueueShutdown(
     PXENVBD_NOTIFIER    Notifier = FrontendGetNotifier(Pdo->Frontend);
 
     QueueAppend(&Pdo->ShutdownSrbs, &SrbExt->Entry);
-    NotifierTrigger(Notifier);
+    NotifierKick(Notifier);
 }
 
 static FORCEINLINE VOID
-- 
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 Thu Oct 22 14:37:24 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 14:37: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 1ZpGzb-0007PF-Cx; Thu, 22 Oct 2015 14:37:23 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=730c85f02=Paul.Durrant@citrix.com>)
	id 1ZpGza-0007PA-6J
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 14:37:22 +0000
Received: from [85.158.139.211] by server-1.bemta-5.messagelabs.com id
	FE/B8-32615-1A4F8265; Thu, 22 Oct 2015 14:37:21 +0000
X-Env-Sender: prvs=730c85f02=Paul.Durrant@citrix.com
X-Msg-Ref: server-4.tower-206.messagelabs.com!1445524640!44344972!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 29282 invoked from network); 22 Oct 2015 14:37:20 -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;
	22 Oct 2015 14:37:20 -0000
X-IronPort-AV: E=Sophos;i="5.20,182,1444694400"; 
   d="scan'208";a="5901152"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH] Kick notifier DPC directly.
Thread-Index: AQHRDMue3L3sAb3VS0+z9yJWvgZIBp53lKRg
Date: Thu, 22 Oct 2015 14:37:15 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F620BF0@AMSPEX01CL01.citrite.net>
References: <1445519628-22124-1-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1445519628-22124-1-git-send-email-owen.smith@citrix.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
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH] Kick notifier DPC directly.
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 Owen Smith
> Sent: 22 October 2015 14:14
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH] Kick notifier DPC directly.
> 
> EVTCHN(Trigger, ...) was changed with the FiFo event channel
> implementation, which led to a performance regression. Kicking
> the notifier does not require triggering the local end of the
> event channel, so shortcut this process by queueing the notifier
> DPC directly.
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xenvbd/notifier.c | 12 ++++++++++++
>  src/xenvbd/notifier.h |  5 +++++
>  src/xenvbd/pdo.c      |  8 ++++----
>  3 files changed, 21 insertions(+), 4 deletions(-)
> 
> diff --git a/src/xenvbd/notifier.c b/src/xenvbd/notifier.c
> index b812d69..e9943fa 100644
> --- a/src/xenvbd/notifier.c
> +++ b/src/xenvbd/notifier.c
> @@ -312,6 +312,18 @@ NotifierDebugCallback(
>  }
> 
>  VOID
> +NotifierKick(
> +    IN  PXENVBD_NOTIFIER            Notifier
> +    )
> +{
> +    if (Notifier->Enabled) {
> +		if (KeInsertQueueDpc(&Notifier->Dpc, NULL, NULL)) {
> +			++Notifier->NumDpcs;
> +        }
> +    }
> +}
> +
> +VOID
>  NotifierTrigger(
>      IN  PXENVBD_NOTIFIER            Notifier
>      )
> diff --git a/src/xenvbd/notifier.h b/src/xenvbd/notifier.h
> index 1c368e6..4cf35e7 100644
> --- a/src/xenvbd/notifier.h
> +++ b/src/xenvbd/notifier.h
> @@ -84,6 +84,11 @@ NotifierDebugCallback(
>      );
> 
>  extern VOID
> +NotifierKick(
> +    IN  PXENVBD_NOTIFIER            Notifier
> +    );
> +
> +extern VOID
>  NotifierTrigger(
>      IN  PXENVBD_NOTIFIER            Notifier
>      );
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index e00729e..198c4d3 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -1860,7 +1860,7 @@ PdoReadWrite(
>      }
> 
>      QueueAppend(&Pdo->FreshSrbs, &SrbExt->Entry);
> -    NotifierTrigger(Notifier);
> +    NotifierKick(Notifier);
> 
>      return FALSE;
>  }
> @@ -1889,7 +1889,7 @@ PdoSyncCache(
>      }
> 
>      QueueAppend(&Pdo->FreshSrbs, &SrbExt->Entry);
> -    NotifierTrigger(Notifier);
> +    NotifierKick(Notifier);
> 
>      return FALSE;
>  }
> @@ -1918,7 +1918,7 @@ PdoUnmap(
>      }
> 
>      QueueAppend(&Pdo->FreshSrbs, &SrbExt->Entry);
> -    NotifierTrigger(Notifier);
> +    NotifierKick(Notifier);
> 
>      return FALSE;
>  }
> @@ -2252,7 +2252,7 @@ __PdoQueueShutdown(
>      PXENVBD_NOTIFIER    Notifier = FrontendGetNotifier(Pdo->Frontend);
> 
>      QueueAppend(&Pdo->ShutdownSrbs, &SrbExt->Entry);
> -    NotifierTrigger(Notifier);
> +    NotifierKick(Notifier);
>  }
> 
>  static FORCEINLINE VOID
> --
> 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

_______________________________________________
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 Oct 22 14:37:24 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 14:37: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 1ZpGzb-0007PF-Cx; Thu, 22 Oct 2015 14:37:23 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=730c85f02=Paul.Durrant@citrix.com>)
	id 1ZpGza-0007PA-6J
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 14:37:22 +0000
Received: from [85.158.139.211] by server-1.bemta-5.messagelabs.com id
	FE/B8-32615-1A4F8265; Thu, 22 Oct 2015 14:37:21 +0000
X-Env-Sender: prvs=730c85f02=Paul.Durrant@citrix.com
X-Msg-Ref: server-4.tower-206.messagelabs.com!1445524640!44344972!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 29282 invoked from network); 22 Oct 2015 14:37:20 -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;
	22 Oct 2015 14:37:20 -0000
X-IronPort-AV: E=Sophos;i="5.20,182,1444694400"; 
   d="scan'208";a="5901152"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH] Kick notifier DPC directly.
Thread-Index: AQHRDMue3L3sAb3VS0+z9yJWvgZIBp53lKRg
Date: Thu, 22 Oct 2015 14:37:15 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F620BF0@AMSPEX01CL01.citrite.net>
References: <1445519628-22124-1-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1445519628-22124-1-git-send-email-owen.smith@citrix.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
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH] Kick notifier DPC directly.
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 Owen Smith
> Sent: 22 October 2015 14:14
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH] Kick notifier DPC directly.
> 
> EVTCHN(Trigger, ...) was changed with the FiFo event channel
> implementation, which led to a performance regression. Kicking
> the notifier does not require triggering the local end of the
> event channel, so shortcut this process by queueing the notifier
> DPC directly.
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xenvbd/notifier.c | 12 ++++++++++++
>  src/xenvbd/notifier.h |  5 +++++
>  src/xenvbd/pdo.c      |  8 ++++----
>  3 files changed, 21 insertions(+), 4 deletions(-)
> 
> diff --git a/src/xenvbd/notifier.c b/src/xenvbd/notifier.c
> index b812d69..e9943fa 100644
> --- a/src/xenvbd/notifier.c
> +++ b/src/xenvbd/notifier.c
> @@ -312,6 +312,18 @@ NotifierDebugCallback(
>  }
> 
>  VOID
> +NotifierKick(
> +    IN  PXENVBD_NOTIFIER            Notifier
> +    )
> +{
> +    if (Notifier->Enabled) {
> +		if (KeInsertQueueDpc(&Notifier->Dpc, NULL, NULL)) {
> +			++Notifier->NumDpcs;
> +        }
> +    }
> +}
> +
> +VOID
>  NotifierTrigger(
>      IN  PXENVBD_NOTIFIER            Notifier
>      )
> diff --git a/src/xenvbd/notifier.h b/src/xenvbd/notifier.h
> index 1c368e6..4cf35e7 100644
> --- a/src/xenvbd/notifier.h
> +++ b/src/xenvbd/notifier.h
> @@ -84,6 +84,11 @@ NotifierDebugCallback(
>      );
> 
>  extern VOID
> +NotifierKick(
> +    IN  PXENVBD_NOTIFIER            Notifier
> +    );
> +
> +extern VOID
>  NotifierTrigger(
>      IN  PXENVBD_NOTIFIER            Notifier
>      );
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index e00729e..198c4d3 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -1860,7 +1860,7 @@ PdoReadWrite(
>      }
> 
>      QueueAppend(&Pdo->FreshSrbs, &SrbExt->Entry);
> -    NotifierTrigger(Notifier);
> +    NotifierKick(Notifier);
> 
>      return FALSE;
>  }
> @@ -1889,7 +1889,7 @@ PdoSyncCache(
>      }
> 
>      QueueAppend(&Pdo->FreshSrbs, &SrbExt->Entry);
> -    NotifierTrigger(Notifier);
> +    NotifierKick(Notifier);
> 
>      return FALSE;
>  }
> @@ -1918,7 +1918,7 @@ PdoUnmap(
>      }
> 
>      QueueAppend(&Pdo->FreshSrbs, &SrbExt->Entry);
> -    NotifierTrigger(Notifier);
> +    NotifierKick(Notifier);
> 
>      return FALSE;
>  }
> @@ -2252,7 +2252,7 @@ __PdoQueueShutdown(
>      PXENVBD_NOTIFIER    Notifier = FrontendGetNotifier(Pdo->Frontend);
> 
>      QueueAppend(&Pdo->ShutdownSrbs, &SrbExt->Entry);
> -    NotifierTrigger(Notifier);
> +    NotifierKick(Notifier);
>  }
> 
>  static FORCEINLINE VOID
> --
> 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

_______________________________________________
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 Oct 22 15:22:50 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 15:22: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 1ZpHha-0002kP-4W; Thu, 22 Oct 2015 15:22: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 1ZpHhY-0002k5-21
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 15:22:48 +0000
Received: from [85.158.139.211] by server-7.bemta-5.messagelabs.com id
	E3/BA-13905-74FF8265; Thu, 22 Oct 2015 15:22:47 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-16.tower-206.messagelabs.com!1445527366!41465647!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 14171 invoked from network); 22 Oct 2015 15:22:46 -0000
Received: from mail-wi0-f181.google.com (HELO mail-wi0-f181.google.com)
	(209.85.212.181)
	by server-16.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 15:22:46 -0000
Received: by wicfx6 with SMTP id fx6so140859488wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 08:22:46 -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=PbZZbsWCmfiU6XrmKUofZKgUofFr05kbgG/HG4ubDBI=;
	b=xktYBoffM713c/uqbXQ38az0R50VBMYI6Beb3UESJUDfE6txVzNQIBPECub0pXfiYE
	MjEVFwt+XwOMaGfwCG0xeXBr5txb5nh+xjzTzP7Cjy4lpv6eBcXVTmiJwEgrgVhmjGqf
	5HTeXUjbgS6a4PAGNpMdriexkf1Tkcf8cPapkdw4PrIscYEDi5yMyN0JQ/e5Hu7WwK+3
	clNKFb7rvMMAWJxIOJ62yQ+XGcGUrterLO1qjidUxXXzWPbZIs6j7uy3MJbBIvYMLVD1
	YZ0Z69q2LcVCGJIU9s3su1HypMjN2v3j7+5+11wh6n2bIs7lwv46f9A8uVk9xFLrrNLF
	pJpg==
X-Received: by 10.180.206.8 with SMTP id lk8mr38868683wic.44.1445527366162;
	Thu, 22 Oct 2015 08:22:46 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	jj3sm11158591wid.21.2015.10.22.08.22.45
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 08:22:45 -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, 22 Oct 2015 16:22:54 +0100
Message-Id: <1445527375-4296-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] Change coinstaller log level to
	TXTLOG_WARNING
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 10 does not enable logging of TXTLOG_DETAILS in setupapi.dev.log by
default, so use TXTLOG_WARNING to make sure the messages appear.

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 e30631e..800e40f 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -78,7 +78,7 @@ __Log(
 
     LogToken = SetupGetThreadLogToken();
     Category = TXTLOG_VENDOR;
-    Flags = TXTLOG_DETAILS;
+    Flags = TXTLOG_WARNING;
 
     SetupWriteTextLog(LogToken, Category, Flags, Buffer);
     Length = __min(MAXIMUM_BUFFER_SIZE - 1, Length + 2);
-- 
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 Oct 22 15:22:50 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 15:22: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 1ZpHha-0002kP-4W; Thu, 22 Oct 2015 15:22: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 1ZpHhY-0002k5-21
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 15:22:48 +0000
Received: from [85.158.139.211] by server-7.bemta-5.messagelabs.com id
	E3/BA-13905-74FF8265; Thu, 22 Oct 2015 15:22:47 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-16.tower-206.messagelabs.com!1445527366!41465647!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 14171 invoked from network); 22 Oct 2015 15:22:46 -0000
Received: from mail-wi0-f181.google.com (HELO mail-wi0-f181.google.com)
	(209.85.212.181)
	by server-16.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 15:22:46 -0000
Received: by wicfx6 with SMTP id fx6so140859488wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 08:22:46 -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=PbZZbsWCmfiU6XrmKUofZKgUofFr05kbgG/HG4ubDBI=;
	b=xktYBoffM713c/uqbXQ38az0R50VBMYI6Beb3UESJUDfE6txVzNQIBPECub0pXfiYE
	MjEVFwt+XwOMaGfwCG0xeXBr5txb5nh+xjzTzP7Cjy4lpv6eBcXVTmiJwEgrgVhmjGqf
	5HTeXUjbgS6a4PAGNpMdriexkf1Tkcf8cPapkdw4PrIscYEDi5yMyN0JQ/e5Hu7WwK+3
	clNKFb7rvMMAWJxIOJ62yQ+XGcGUrterLO1qjidUxXXzWPbZIs6j7uy3MJbBIvYMLVD1
	YZ0Z69q2LcVCGJIU9s3su1HypMjN2v3j7+5+11wh6n2bIs7lwv46f9A8uVk9xFLrrNLF
	pJpg==
X-Received: by 10.180.206.8 with SMTP id lk8mr38868683wic.44.1445527366162;
	Thu, 22 Oct 2015 08:22:46 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	jj3sm11158591wid.21.2015.10.22.08.22.45
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 08:22:45 -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, 22 Oct 2015 16:22:54 +0100
Message-Id: <1445527375-4296-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] Change coinstaller log level to
	TXTLOG_WARNING
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 10 does not enable logging of TXTLOG_DETAILS in setupapi.dev.log by
default, so use TXTLOG_WARNING to make sure the messages appear.

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 e30631e..800e40f 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -78,7 +78,7 @@ __Log(
 
     LogToken = SetupGetThreadLogToken();
     Category = TXTLOG_VENDOR;
-    Flags = TXTLOG_DETAILS;
+    Flags = TXTLOG_WARNING;
 
     SetupWriteTextLog(LogToken, Category, Flags, Buffer);
     Length = __min(MAXIMUM_BUFFER_SIZE - 1, Length + 2);
-- 
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 Oct 22 15:22:52 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 15:22:52 +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 1ZpHhc-0002lF-5j; Thu, 22 Oct 2015 15:22:52 +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 1ZpHha-0002kI-2e
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 15:22:50 +0000
Received: from [193.109.254.147] by server-7.bemta-14.messagelabs.com id
	D2/89-28221-84FF8265; Thu, 22 Oct 2015 15:22:48 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1445527367!27780039!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 16028 invoked from network); 22 Oct 2015 15:22:48 -0000
Received: from mail-wi0-f171.google.com (HELO mail-wi0-f171.google.com)
	(209.85.212.171)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 15:22:48 -0000
Received: by wicll6 with SMTP id ll6so140525908wic.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 08:22: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:in-reply-to:references;
	bh=KXFGsIL9VxwiGPkkL2c0M7rE3aTI5ive9aTAErerNwY=;
	b=OcpN3M8ljVBPmDuhIArbtR+oPr7+71Of6OL6+yGyn3py2jr7vMVRK0833+tBmK35Or
	dNMHeW79xOWOEHyblPUWEyAej9PnfxJ3uc7l7oEyvIGyDLZDxHgHDLmpIXrK90/SI72+
	1++tnsQuvA16VRqSCP6klix4UVRb5LO9Co/ZV1KB45ORGVH4foVlnUt5ssT57l8tBc+C
	YjsfEA0Ewhmtioma/1XJBZ6OjYvPIXJw3punq71vlZ7Rfb64vhBegTd/HLCOGy7KmcdW
	4Ee2tWQ5J4LH3fkjOlhwNV30x2dNlgHJOgImBmjQqOREzMwn7nnJv8ZI81UUjLwjOxll
	S4dw==
X-Received: by 10.194.47.244 with SMTP id g20mr20383446wjn.124.1445527367028; 
	Thu, 22 Oct 2015 08:22:47 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	jj3sm11158591wid.21.2015.10.22.08.22.46
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 08:22:46 -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, 22 Oct 2015 16:22:55 +0100
Message-Id: <1445527375-4296-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1445527375-4296-1-git-send-email-paul.durrant@citrix.com>
References: <1445527375-4296-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Add a registry override to veto driver
	installations
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 certain cases where a local installer package may wish to
prevent Windows Update installations of drivers. This can be achieved by
having the co-installer check for a registry value and fail it's pre-install
phase if the value is present.

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

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 800e40f..ef646e8 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -50,6 +50,11 @@ __user_code;
 
 #define MAXIMUM_BUFFER_SIZE 1024
 
+#define SERVICES_KEY "SYSTEM\\CurrentControlSet\\Services"
+
+#define SERVICE_KEY(_Driver)    \
+        SERVICES_KEY ## "\\" ## #_Driver
+
 static VOID
 #pragma prefast(suppress:6262) // Function uses '1036' bytes of stack: exceeds /analyze:stacksize'1024'
 __Log(
@@ -178,6 +183,130 @@ FunctionName(
 #undef  _NAME
 }
 
+static BOOLEAN
+AllowUpdate(
+    IN  PTCHAR      DriverName,
+    OUT PBOOLEAN    Allow
+    )
+{
+    TCHAR           ServiceKeyName[MAX_PATH];
+    HKEY            ServiceKey;
+    HRESULT         Error;
+    DWORD           ValueLength;
+    DWORD           Value;
+    DWORD           Type;
+
+    Log("====> (%s)", DriverName);
+
+    (VOID) StringCbPrintf(ServiceKeyName,
+                          MAX_PATH,
+                          SERVICES_KEY "\\%s",
+                          DriverName);
+
+    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+                         ServiceKeyName,
+                         0,
+                         KEY_READ,
+                         &ServiceKey);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Value = 1;
+            goto done;
+        }
+
+        SetLastError(Error);
+        goto fail1;
+    }
+
+    ValueLength = sizeof (Value);
+
+    Error = RegQueryValueEx(ServiceKey,
+                            "AllowUpdate",
+                            NULL,
+                            &Type,
+                            (LPBYTE)&Value,
+                            &ValueLength);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Type = REG_DWORD;
+            Value = 1;
+        } else {
+            SetLastError(Error);
+            goto fail2;
+        }
+    }
+
+    if (Type != REG_DWORD) {
+        SetLastError(ERROR_BAD_FORMAT);
+        goto fail3;
+    }
+
+done:
+    if (Value == 0) {
+        Log("DISALLOWED");
+        *Allow = FALSE;
+    }
+
+    RegCloseKey(ServiceKey);
+
+    Log("<====");
+
+    return TRUE;
+
+fail3:
+    Log("fail3");
+
+fail2:
+    Log("fail2");
+
+    RegCloseKey(ServiceKey);
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
+AllowInstall(
+    OUT PBOOLEAN    Allow
+    )
+{
+    BOOLEAN         Success;
+    HRESULT         Error;
+
+    Log("====>");
+
+    *Allow = TRUE;
+
+    Success = AllowUpdate("XENIFACE", Allow);
+    if (!Success)
+        goto fail1;
+
+    Log("<====");
+
+    return TRUE;
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
 static HRESULT
 DifInstallPreProcess(
     IN  HDEVINFO                    DeviceInfoSet,
@@ -185,13 +314,44 @@ DifInstallPreProcess(
     IN  PCOINSTALLER_CONTEXT_DATA   Context
     )
 {
+    HRESULT                         Error;
+    BOOLEAN                         Success;
+    BOOLEAN                         Allow;
+
     UNREFERENCED_PARAMETER(DeviceInfoSet);
     UNREFERENCED_PARAMETER(DeviceInfoData);
     UNREFERENCED_PARAMETER(Context);
 
-    Log("<===>");
+    Log("====>");
+
+    Success = AllowInstall(&Allow);
+    if (!Success)
+        goto fail1;
+
+    if (!Allow) {
+        SetLastError(ERROR_ACCESS_DENIED);
+        goto fail2;
+    }
+
+    Log("<====");
 
     return NO_ERROR;
+
+fail2:
+    Log("fail2");
+
+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 Oct 22 15:22:52 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 15:22:52 +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 1ZpHhc-0002lF-5j; Thu, 22 Oct 2015 15:22:52 +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 1ZpHha-0002kI-2e
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 15:22:50 +0000
Received: from [193.109.254.147] by server-7.bemta-14.messagelabs.com id
	D2/89-28221-84FF8265; Thu, 22 Oct 2015 15:22:48 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1445527367!27780039!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 16028 invoked from network); 22 Oct 2015 15:22:48 -0000
Received: from mail-wi0-f171.google.com (HELO mail-wi0-f171.google.com)
	(209.85.212.171)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 15:22:48 -0000
Received: by wicll6 with SMTP id ll6so140525908wic.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 08:22: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:in-reply-to:references;
	bh=KXFGsIL9VxwiGPkkL2c0M7rE3aTI5ive9aTAErerNwY=;
	b=OcpN3M8ljVBPmDuhIArbtR+oPr7+71Of6OL6+yGyn3py2jr7vMVRK0833+tBmK35Or
	dNMHeW79xOWOEHyblPUWEyAej9PnfxJ3uc7l7oEyvIGyDLZDxHgHDLmpIXrK90/SI72+
	1++tnsQuvA16VRqSCP6klix4UVRb5LO9Co/ZV1KB45ORGVH4foVlnUt5ssT57l8tBc+C
	YjsfEA0Ewhmtioma/1XJBZ6OjYvPIXJw3punq71vlZ7Rfb64vhBegTd/HLCOGy7KmcdW
	4Ee2tWQ5J4LH3fkjOlhwNV30x2dNlgHJOgImBmjQqOREzMwn7nnJv8ZI81UUjLwjOxll
	S4dw==
X-Received: by 10.194.47.244 with SMTP id g20mr20383446wjn.124.1445527367028; 
	Thu, 22 Oct 2015 08:22:47 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	jj3sm11158591wid.21.2015.10.22.08.22.46
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 08:22:46 -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, 22 Oct 2015 16:22:55 +0100
Message-Id: <1445527375-4296-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1445527375-4296-1-git-send-email-paul.durrant@citrix.com>
References: <1445527375-4296-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Add a registry override to veto driver
	installations
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 certain cases where a local installer package may wish to
prevent Windows Update installations of drivers. This can be achieved by
having the co-installer check for a registry value and fail it's pre-install
phase if the value is present.

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

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 800e40f..ef646e8 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -50,6 +50,11 @@ __user_code;
 
 #define MAXIMUM_BUFFER_SIZE 1024
 
+#define SERVICES_KEY "SYSTEM\\CurrentControlSet\\Services"
+
+#define SERVICE_KEY(_Driver)    \
+        SERVICES_KEY ## "\\" ## #_Driver
+
 static VOID
 #pragma prefast(suppress:6262) // Function uses '1036' bytes of stack: exceeds /analyze:stacksize'1024'
 __Log(
@@ -178,6 +183,130 @@ FunctionName(
 #undef  _NAME
 }
 
+static BOOLEAN
+AllowUpdate(
+    IN  PTCHAR      DriverName,
+    OUT PBOOLEAN    Allow
+    )
+{
+    TCHAR           ServiceKeyName[MAX_PATH];
+    HKEY            ServiceKey;
+    HRESULT         Error;
+    DWORD           ValueLength;
+    DWORD           Value;
+    DWORD           Type;
+
+    Log("====> (%s)", DriverName);
+
+    (VOID) StringCbPrintf(ServiceKeyName,
+                          MAX_PATH,
+                          SERVICES_KEY "\\%s",
+                          DriverName);
+
+    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+                         ServiceKeyName,
+                         0,
+                         KEY_READ,
+                         &ServiceKey);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Value = 1;
+            goto done;
+        }
+
+        SetLastError(Error);
+        goto fail1;
+    }
+
+    ValueLength = sizeof (Value);
+
+    Error = RegQueryValueEx(ServiceKey,
+                            "AllowUpdate",
+                            NULL,
+                            &Type,
+                            (LPBYTE)&Value,
+                            &ValueLength);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Type = REG_DWORD;
+            Value = 1;
+        } else {
+            SetLastError(Error);
+            goto fail2;
+        }
+    }
+
+    if (Type != REG_DWORD) {
+        SetLastError(ERROR_BAD_FORMAT);
+        goto fail3;
+    }
+
+done:
+    if (Value == 0) {
+        Log("DISALLOWED");
+        *Allow = FALSE;
+    }
+
+    RegCloseKey(ServiceKey);
+
+    Log("<====");
+
+    return TRUE;
+
+fail3:
+    Log("fail3");
+
+fail2:
+    Log("fail2");
+
+    RegCloseKey(ServiceKey);
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
+AllowInstall(
+    OUT PBOOLEAN    Allow
+    )
+{
+    BOOLEAN         Success;
+    HRESULT         Error;
+
+    Log("====>");
+
+    *Allow = TRUE;
+
+    Success = AllowUpdate("XENIFACE", Allow);
+    if (!Success)
+        goto fail1;
+
+    Log("<====");
+
+    return TRUE;
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
 static HRESULT
 DifInstallPreProcess(
     IN  HDEVINFO                    DeviceInfoSet,
@@ -185,13 +314,44 @@ DifInstallPreProcess(
     IN  PCOINSTALLER_CONTEXT_DATA   Context
     )
 {
+    HRESULT                         Error;
+    BOOLEAN                         Success;
+    BOOLEAN                         Allow;
+
     UNREFERENCED_PARAMETER(DeviceInfoSet);
     UNREFERENCED_PARAMETER(DeviceInfoData);
     UNREFERENCED_PARAMETER(Context);
 
-    Log("<===>");
+    Log("====>");
+
+    Success = AllowInstall(&Allow);
+    if (!Success)
+        goto fail1;
+
+    if (!Allow) {
+        SetLastError(ERROR_ACCESS_DENIED);
+        goto fail2;
+    }
+
+    Log("<====");
 
     return NO_ERROR;
+
+fail2:
+    Log("fail2");
+
+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 Oct 22 15:23:26 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 15:23: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 1ZpHiA-0002xu-8G; Thu, 22 Oct 2015 15:23:26 +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 1ZpHi8-0002vh-Gy
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 15:23:24 +0000
Received: from [85.158.137.68] by server-13.bemta-3.messagelabs.com id
	1A/6C-00536-B6FF8265; Thu, 22 Oct 2015 15:23:23 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-4.tower-31.messagelabs.com!1445527402!54539417!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 16457 invoked from network); 22 Oct 2015 15:23:23 -0000
Received: from mail-wi0-f181.google.com (HELO mail-wi0-f181.google.com)
	(209.85.212.181)
	by server-4.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 15:23:23 -0000
Received: by wikq8 with SMTP id q8so37176892wik.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 08:23:22 -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=xFcSCkBsfrMqnU8+0BLYsypu5Pam0hOZMlFQHZn52iI=;
	b=FBAXbgcRzzNGzoJkzdJttpIsukKorfUA7/NEGPVoJ6czQH6/VnFms0gbmNNFAqsQ1H
	hlqdz1u2yXaqZ/SvKHp+/TkBsn+BZtDi1VkgcncxmrBluRfArwXOdQfm3z8WmOD3fpsa
	xzupDKw/H/J9cZHhkDgVF/uMMmkd8uagLijzBqWRr1cFqZwwsENTKdJ4CUZYmQdkjve0
	Q7nXfaf/aQMFc9ZGnY7sI3uD3xAQds/t4XDGisQ5VDOVWqVHJlKaESByrP1RUQMTqpCr
	RjX1My4CYoKNcpH/tQMzLHSvWpvW+n37ik3Unly1iwmBIsJiRAD0/JBj+br9T2aIrKTu
	1I1Q==
X-Received: by 10.180.207.242 with SMTP id lz18mr33689558wic.62.1445527401921; 
	Thu, 22 Oct 2015 08:23:21 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	ew2sm12044372wic.20.2015.10.22.08.23.21
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 08:23:21 -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, 22 Oct 2015 16:23:32 +0100
Message-Id: <1445527413-13436-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] Change coinstaller log level to
	TXTLOG_WARNING
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 10 does not enable logging of TXTLOG_DETAILS in setupapi.dev.log by
default, so use TXTLOG_WARNING to make sure the messages appear.

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 7f421c9..c955894 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -85,7 +85,7 @@ __Log(
 
     LogToken = SetupGetThreadLogToken();
     Category = TXTLOG_VENDOR;
-    Flags = TXTLOG_DETAILS;
+    Flags = TXTLOG_WARNING;
 
     SetupWriteTextLog(LogToken, Category, Flags, Buffer);
     Length = __min(MAXIMUM_BUFFER_SIZE - 1, Length + 2);
-- 
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 Oct 22 15:23:26 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 15:23: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 1ZpHiA-0002xy-9K; Thu, 22 Oct 2015 15:23:26 +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 1ZpHi8-0002vX-Rw
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 15:23:25 +0000
Received: from [193.109.254.147] by server-7.bemta-14.messagelabs.com id
	B0/BA-28221-B6FF8265; Thu, 22 Oct 2015 15:23:23 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1445527402!60678758!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 25284 invoked from network); 22 Oct 2015 15:23:22 -0000
Received: from mail-wi0-f172.google.com (HELO mail-wi0-f172.google.com)
	(209.85.212.172)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 15:23:22 -0000
Received: by wicll6 with SMTP id ll6so124391418wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 08:23:22 -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=MWK7qMeR4AECG9f0rCZArH5zDCtKj4VhHoEGWWhYmiA=;
	b=ea2OjKofamDwi5QaHxR6PSEQxsecK/Dwkn+Udr/0jA/au+huzDQw/LxwIHSZRSY82y
	EonFydtKf2KfOkk87rLqUyscleuIWtBQxyeMq0a1SggZqVL4Um76Izk87q8k+iuzA+Rh
	T6urg5yk34RFvfDxKz+/4sd1OGjAkgFPXSOjvt2ZwwPsdDPiqOUCPc51WUC2F6ZRwVn3
	4DKWEb0lfu9FOfRcQ4YAwyDF7pNMF5MdZngwi79av0+ioPHBH6L6v0HuJT7shKQ2dcgY
	qxJxFg+26v2C+jErXrhy8h6otCyWcZb7VPf2E+7Nx3trbJRnnExF4cpK2kweBzX5ojuv
	BtKw==
X-Received: by 10.180.90.13 with SMTP id bs13mr15610645wib.86.1445527402569;
	Thu, 22 Oct 2015 08:23:22 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	ew2sm12044372wic.20.2015.10.22.08.23.21
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 08:23:22 -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, 22 Oct 2015 16:23:33 +0100
Message-Id: <1445527413-13436-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1445527413-13436-1-git-send-email-paul.durrant@citrix.com>
References: <1445527413-13436-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Add a registry override to veto driver
	installations
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 certain cases where a local installer package may wish to
prevent Windows Update installations of drivers. This can be achieved by
having the co-installer check for a registry value and fail it's pre-install
phase if the value is present.

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

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index c955894..04b676a 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -388,6 +388,130 @@ fail1:
 }
 
 static BOOLEAN
+AllowUpdate(
+    IN  PTCHAR      DriverName,
+    OUT PBOOLEAN    Allow
+    )
+{
+    TCHAR           ServiceKeyName[MAX_PATH];
+    HKEY            ServiceKey;
+    HRESULT         Error;
+    DWORD           ValueLength;
+    DWORD           Value;
+    DWORD           Type;
+
+    Log("====> (%s)", DriverName);
+
+    (VOID) StringCbPrintf(ServiceKeyName,
+                          MAX_PATH,
+                          SERVICES_KEY "\\%s",
+                          DriverName);
+
+    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+                         ServiceKeyName,
+                         0,
+                         KEY_READ,
+                         &ServiceKey);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Value = 1;
+            goto done;
+        }
+
+        SetLastError(Error);
+        goto fail1;
+    }
+
+    ValueLength = sizeof (Value);
+
+    Error = RegQueryValueEx(ServiceKey,
+                            "AllowUpdate",
+                            NULL,
+                            &Type,
+                            (LPBYTE)&Value,
+                            &ValueLength);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Type = REG_DWORD;
+            Value = 1;
+        } else {
+            SetLastError(Error);
+            goto fail2;
+        }
+    }
+
+    if (Type != REG_DWORD) {
+        SetLastError(ERROR_BAD_FORMAT);
+        goto fail3;
+    }
+
+done:
+    if (Value == 0) {
+        Log("DISALLOWED");
+        *Allow = FALSE;
+    }
+
+    RegCloseKey(ServiceKey);
+
+    Log("<====");
+
+    return TRUE;
+
+fail3:
+    Log("fail3");
+
+fail2:
+    Log("fail2");
+
+    RegCloseKey(ServiceKey);
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = __GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
+AllowInstall(
+    OUT PBOOLEAN    Allow
+    )
+{
+    BOOLEAN         Success;
+    HRESULT         Error;
+
+    Log("====>");
+
+    *Allow = TRUE;
+
+    Success = AllowUpdate("XENVBD", Allow);
+    if (!Success)
+        goto fail1;
+
+    Log("<====");
+
+    return TRUE;
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = __GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
 CheckStatus(
     OUT PBOOLEAN    NeedReboot
     )
@@ -512,13 +636,44 @@ __DifInstallPreProcess(
     IN  PCOINSTALLER_CONTEXT_DATA   Context
     )
 {
+    HRESULT                         Error;
+    BOOLEAN                         Success;
+    BOOLEAN                         Allow;
+
     UNREFERENCED_PARAMETER(DeviceInfoSet);
     UNREFERENCED_PARAMETER(DeviceInfoData);
     UNREFERENCED_PARAMETER(Context);
 
-    Log("<===>");
+    Log("====>");
+
+    Success = AllowInstall(&Allow);
+    if (!Success)
+        goto fail1;
+
+    if (!Allow) {
+        SetLastError(ERROR_ACCESS_DENIED);
+        goto fail2;
+    }
+
+    Log("<====");
 
     return NO_ERROR;
+
+fail2:
+    Log("fail2");
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+
+        Message = __GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return Error;
 }
 
 static FORCEINLINE 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 Oct 22 15:23:26 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 15:23: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 1ZpHiA-0002xu-8G; Thu, 22 Oct 2015 15:23:26 +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 1ZpHi8-0002vh-Gy
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 15:23:24 +0000
Received: from [85.158.137.68] by server-13.bemta-3.messagelabs.com id
	1A/6C-00536-B6FF8265; Thu, 22 Oct 2015 15:23:23 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-4.tower-31.messagelabs.com!1445527402!54539417!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 16457 invoked from network); 22 Oct 2015 15:23:23 -0000
Received: from mail-wi0-f181.google.com (HELO mail-wi0-f181.google.com)
	(209.85.212.181)
	by server-4.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 15:23:23 -0000
Received: by wikq8 with SMTP id q8so37176892wik.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 08:23:22 -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=xFcSCkBsfrMqnU8+0BLYsypu5Pam0hOZMlFQHZn52iI=;
	b=FBAXbgcRzzNGzoJkzdJttpIsukKorfUA7/NEGPVoJ6czQH6/VnFms0gbmNNFAqsQ1H
	hlqdz1u2yXaqZ/SvKHp+/TkBsn+BZtDi1VkgcncxmrBluRfArwXOdQfm3z8WmOD3fpsa
	xzupDKw/H/J9cZHhkDgVF/uMMmkd8uagLijzBqWRr1cFqZwwsENTKdJ4CUZYmQdkjve0
	Q7nXfaf/aQMFc9ZGnY7sI3uD3xAQds/t4XDGisQ5VDOVWqVHJlKaESByrP1RUQMTqpCr
	RjX1My4CYoKNcpH/tQMzLHSvWpvW+n37ik3Unly1iwmBIsJiRAD0/JBj+br9T2aIrKTu
	1I1Q==
X-Received: by 10.180.207.242 with SMTP id lz18mr33689558wic.62.1445527401921; 
	Thu, 22 Oct 2015 08:23:21 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	ew2sm12044372wic.20.2015.10.22.08.23.21
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 08:23:21 -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, 22 Oct 2015 16:23:32 +0100
Message-Id: <1445527413-13436-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] Change coinstaller log level to
	TXTLOG_WARNING
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 10 does not enable logging of TXTLOG_DETAILS in setupapi.dev.log by
default, so use TXTLOG_WARNING to make sure the messages appear.

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 7f421c9..c955894 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -85,7 +85,7 @@ __Log(
 
     LogToken = SetupGetThreadLogToken();
     Category = TXTLOG_VENDOR;
-    Flags = TXTLOG_DETAILS;
+    Flags = TXTLOG_WARNING;
 
     SetupWriteTextLog(LogToken, Category, Flags, Buffer);
     Length = __min(MAXIMUM_BUFFER_SIZE - 1, Length + 2);
-- 
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 Oct 22 15:23:26 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 15:23: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 1ZpHiA-0002xy-9K; Thu, 22 Oct 2015 15:23:26 +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 1ZpHi8-0002vX-Rw
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 15:23:25 +0000
Received: from [193.109.254.147] by server-7.bemta-14.messagelabs.com id
	B0/BA-28221-B6FF8265; Thu, 22 Oct 2015 15:23:23 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1445527402!60678758!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 25284 invoked from network); 22 Oct 2015 15:23:22 -0000
Received: from mail-wi0-f172.google.com (HELO mail-wi0-f172.google.com)
	(209.85.212.172)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 15:23:22 -0000
Received: by wicll6 with SMTP id ll6so124391418wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 08:23:22 -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=MWK7qMeR4AECG9f0rCZArH5zDCtKj4VhHoEGWWhYmiA=;
	b=ea2OjKofamDwi5QaHxR6PSEQxsecK/Dwkn+Udr/0jA/au+huzDQw/LxwIHSZRSY82y
	EonFydtKf2KfOkk87rLqUyscleuIWtBQxyeMq0a1SggZqVL4Um76Izk87q8k+iuzA+Rh
	T6urg5yk34RFvfDxKz+/4sd1OGjAkgFPXSOjvt2ZwwPsdDPiqOUCPc51WUC2F6ZRwVn3
	4DKWEb0lfu9FOfRcQ4YAwyDF7pNMF5MdZngwi79av0+ioPHBH6L6v0HuJT7shKQ2dcgY
	qxJxFg+26v2C+jErXrhy8h6otCyWcZb7VPf2E+7Nx3trbJRnnExF4cpK2kweBzX5ojuv
	BtKw==
X-Received: by 10.180.90.13 with SMTP id bs13mr15610645wib.86.1445527402569;
	Thu, 22 Oct 2015 08:23:22 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	ew2sm12044372wic.20.2015.10.22.08.23.21
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 08:23:22 -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, 22 Oct 2015 16:23:33 +0100
Message-Id: <1445527413-13436-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1445527413-13436-1-git-send-email-paul.durrant@citrix.com>
References: <1445527413-13436-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Add a registry override to veto driver
	installations
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 certain cases where a local installer package may wish to
prevent Windows Update installations of drivers. This can be achieved by
having the co-installer check for a registry value and fail it's pre-install
phase if the value is present.

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

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index c955894..04b676a 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -388,6 +388,130 @@ fail1:
 }
 
 static BOOLEAN
+AllowUpdate(
+    IN  PTCHAR      DriverName,
+    OUT PBOOLEAN    Allow
+    )
+{
+    TCHAR           ServiceKeyName[MAX_PATH];
+    HKEY            ServiceKey;
+    HRESULT         Error;
+    DWORD           ValueLength;
+    DWORD           Value;
+    DWORD           Type;
+
+    Log("====> (%s)", DriverName);
+
+    (VOID) StringCbPrintf(ServiceKeyName,
+                          MAX_PATH,
+                          SERVICES_KEY "\\%s",
+                          DriverName);
+
+    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+                         ServiceKeyName,
+                         0,
+                         KEY_READ,
+                         &ServiceKey);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Value = 1;
+            goto done;
+        }
+
+        SetLastError(Error);
+        goto fail1;
+    }
+
+    ValueLength = sizeof (Value);
+
+    Error = RegQueryValueEx(ServiceKey,
+                            "AllowUpdate",
+                            NULL,
+                            &Type,
+                            (LPBYTE)&Value,
+                            &ValueLength);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Type = REG_DWORD;
+            Value = 1;
+        } else {
+            SetLastError(Error);
+            goto fail2;
+        }
+    }
+
+    if (Type != REG_DWORD) {
+        SetLastError(ERROR_BAD_FORMAT);
+        goto fail3;
+    }
+
+done:
+    if (Value == 0) {
+        Log("DISALLOWED");
+        *Allow = FALSE;
+    }
+
+    RegCloseKey(ServiceKey);
+
+    Log("<====");
+
+    return TRUE;
+
+fail3:
+    Log("fail3");
+
+fail2:
+    Log("fail2");
+
+    RegCloseKey(ServiceKey);
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = __GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
+AllowInstall(
+    OUT PBOOLEAN    Allow
+    )
+{
+    BOOLEAN         Success;
+    HRESULT         Error;
+
+    Log("====>");
+
+    *Allow = TRUE;
+
+    Success = AllowUpdate("XENVBD", Allow);
+    if (!Success)
+        goto fail1;
+
+    Log("<====");
+
+    return TRUE;
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = __GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
 CheckStatus(
     OUT PBOOLEAN    NeedReboot
     )
@@ -512,13 +636,44 @@ __DifInstallPreProcess(
     IN  PCOINSTALLER_CONTEXT_DATA   Context
     )
 {
+    HRESULT                         Error;
+    BOOLEAN                         Success;
+    BOOLEAN                         Allow;
+
     UNREFERENCED_PARAMETER(DeviceInfoSet);
     UNREFERENCED_PARAMETER(DeviceInfoData);
     UNREFERENCED_PARAMETER(Context);
 
-    Log("<===>");
+    Log("====>");
+
+    Success = AllowInstall(&Allow);
+    if (!Success)
+        goto fail1;
+
+    if (!Allow) {
+        SetLastError(ERROR_ACCESS_DENIED);
+        goto fail2;
+    }
+
+    Log("<====");
 
     return NO_ERROR;
+
+fail2:
+    Log("fail2");
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+
+        Message = __GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return Error;
 }
 
 static FORCEINLINE 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 Oct 22 15:24:11 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 15:24:11 +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 1ZpHit-00038a-Fy; Thu, 22 Oct 2015 15:24:11 +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 1ZpHis-00038M-UV
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 15:24:11 +0000
Received: from [85.158.137.68] by server-3.bemta-3.messagelabs.com id
	20/84-01753-A9FF8265; Thu, 22 Oct 2015 15:24:10 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-4.tower-31.messagelabs.com!1445527449!54539694!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 23448 invoked from network); 22 Oct 2015 15:24:09 -0000
Received: from mail-wi0-f169.google.com (HELO mail-wi0-f169.google.com)
	(209.85.212.169)
	by server-4.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 15:24:09 -0000
Received: by wicll6 with SMTP id ll6so140585345wic.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 08:24:09 -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=Kdl2oK4SoPnO14s/iHGYX9/MlhKft4z0MUIeoi/BqVs=;
	b=EPAc5C7QT0FvQJiQREh00I6Z+wk5syzMAnOCLqBvSEnw9DqgdIi1S8UdDbFApI7UDT
	VA9f/4IbqA8P9G9x1dDMSvjFgmov0Ba7QL+D6Q8BpWB51gGFuk6PLeeukZN7TFUfIip8
	rM1RA5LVNY9yfT8/0OFK9sV3grtVlWjMT2U1pI8X8gRYTFk7sTGuBwCHip1gF5lKkFh1
	ENAXq49YVywvFQ5XbHX9r/3WKBu+yfiNOnHC9x5arSOgLcrrXUz2jXetDWri0VpzfX8q
	LGanE/dE446fqA0ggJRzHOEHryKdh/wVe1Y4X5hKi662qE3yXq0IGhPC+NpQtpZKijd5
	cV4A==
X-Received: by 10.194.222.227 with SMTP id qp3mr20976224wjc.36.1445527449070; 
	Thu, 22 Oct 2015 08:24:09 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	it4sm17470135wjb.0.2015.10.22.08.24.07
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 08:24: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, 22 Oct 2015 16:24:16 +0100
Message-Id: <1445527457-7752-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] Change coinstaller log level to
	TXTLOG_WARNING
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 10 does not enable logging of TXTLOG_DETAILS in setupapi.dev.log by
default, so use TXTLOG_WARNING to make sure the messages appear.

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 c04b7e8..d1222df 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -90,7 +90,7 @@ __Log(
 
     LogToken = SetupGetThreadLogToken();
     Category = TXTLOG_VENDOR;
-    Flags = TXTLOG_DETAILS;
+    Flags = TXTLOG_WARNING;
 
     SetupWriteTextLog(LogToken, Category, Flags, Buffer);
     Length = __min(MAXIMUM_BUFFER_SIZE - 1, Length + 2);
-- 
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 Oct 22 15:24:11 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 15:24:11 +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 1ZpHit-00038a-Fy; Thu, 22 Oct 2015 15:24:11 +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 1ZpHis-00038M-UV
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 15:24:11 +0000
Received: from [85.158.137.68] by server-3.bemta-3.messagelabs.com id
	20/84-01753-A9FF8265; Thu, 22 Oct 2015 15:24:10 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-4.tower-31.messagelabs.com!1445527449!54539694!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 23448 invoked from network); 22 Oct 2015 15:24:09 -0000
Received: from mail-wi0-f169.google.com (HELO mail-wi0-f169.google.com)
	(209.85.212.169)
	by server-4.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 15:24:09 -0000
Received: by wicll6 with SMTP id ll6so140585345wic.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 08:24:09 -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=Kdl2oK4SoPnO14s/iHGYX9/MlhKft4z0MUIeoi/BqVs=;
	b=EPAc5C7QT0FvQJiQREh00I6Z+wk5syzMAnOCLqBvSEnw9DqgdIi1S8UdDbFApI7UDT
	VA9f/4IbqA8P9G9x1dDMSvjFgmov0Ba7QL+D6Q8BpWB51gGFuk6PLeeukZN7TFUfIip8
	rM1RA5LVNY9yfT8/0OFK9sV3grtVlWjMT2U1pI8X8gRYTFk7sTGuBwCHip1gF5lKkFh1
	ENAXq49YVywvFQ5XbHX9r/3WKBu+yfiNOnHC9x5arSOgLcrrXUz2jXetDWri0VpzfX8q
	LGanE/dE446fqA0ggJRzHOEHryKdh/wVe1Y4X5hKi662qE3yXq0IGhPC+NpQtpZKijd5
	cV4A==
X-Received: by 10.194.222.227 with SMTP id qp3mr20976224wjc.36.1445527449070; 
	Thu, 22 Oct 2015 08:24:09 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	it4sm17470135wjb.0.2015.10.22.08.24.07
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 08:24: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, 22 Oct 2015 16:24:16 +0100
Message-Id: <1445527457-7752-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] Change coinstaller log level to
	TXTLOG_WARNING
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 10 does not enable logging of TXTLOG_DETAILS in setupapi.dev.log by
default, so use TXTLOG_WARNING to make sure the messages appear.

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 c04b7e8..d1222df 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -90,7 +90,7 @@ __Log(
 
     LogToken = SetupGetThreadLogToken();
     Category = TXTLOG_VENDOR;
-    Flags = TXTLOG_DETAILS;
+    Flags = TXTLOG_WARNING;
 
     SetupWriteTextLog(LogToken, Category, Flags, Buffer);
     Length = __min(MAXIMUM_BUFFER_SIZE - 1, Length + 2);
-- 
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 Oct 22 15:24:12 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 15:24: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 1ZpHiu-000394-HI; Thu, 22 Oct 2015 15:24:12 +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 1ZpHit-00038Y-JK
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 15:24:11 +0000
Received: from [85.158.137.68] by server-2.bemta-3.messagelabs.com id
	EB/04-21201-A9FF8265; Thu, 22 Oct 2015 15:24:10 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-12.tower-31.messagelabs.com!1445527449!18893440!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 25977 invoked from network); 22 Oct 2015 15:24:10 -0000
Received: from mail-wi0-f175.google.com (HELO mail-wi0-f175.google.com)
	(209.85.212.175)
	by server-12.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 15:24:10 -0000
Received: by wikq8 with SMTP id q8so37211639wik.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 08:24:09 -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=O/GBYIdX0EQuMDGCr2bvD1a3fPyRnOLwSilujgA6ZZ0=;
	b=Jac6lCXSGWPP/QjR0ITCeUIwRC3QvHKInpYCFpkLOMtObSJ8rRy5FSdiIjro3XzbYO
	+9/d7LQAscxDY2n3YTvXuCCxPScZfurwOADUrkLSs+ztB1gYJ4KOQZCJE8AiY1slkq5k
	/Rd3nBmxklN9pleGjUIUAhNlArZMn7YX4o1+vzz6N0vxZOUblmOmr/CTwVUcq2Tvifzt
	1WSCEQGfVn+gIVd3TXSdR06ooaOROm7A8BtGcM9aTjP/EgjDk8pq4xuzfgJf7JX6jIGz
	+t+TynjCVOZz9i56DX1joyTKARp/7WpRKvAvFuMtKS3VN9F9DahImimZYzgqgznGKStT
	8ftw==
X-Received: by 10.194.156.195 with SMTP id wg3mr20589860wjb.2.1445527449719;
	Thu, 22 Oct 2015 08:24:09 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	it4sm17470135wjb.0.2015.10.22.08.24.09
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 08:24: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: Thu, 22 Oct 2015 16:24:17 +0100
Message-Id: <1445527457-7752-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1445527457-7752-1-git-send-email-paul.durrant@citrix.com>
References: <1445527457-7752-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Add a registry override to veto driver
	installations
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 certain cases where a local installer package may wish to
prevent Windows Update installations of drivers. This can be achieved by
having the co-installer check for a registry value and fail it's pre-install
phase if the value is present.

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

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index d1222df..f60aa43 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -191,6 +191,132 @@ __FunctionName(
 }
 
 static BOOLEAN
+AllowUpdate(
+    IN  PTCHAR      DriverName,
+    OUT PBOOLEAN    Allow
+    )
+{
+    TCHAR           ServiceKeyName[MAX_PATH];
+    HKEY            ServiceKey;
+    HRESULT         Result;
+    HRESULT         Error;
+    DWORD           ValueLength;
+    DWORD           Value;
+    DWORD           Type;
+
+    Log("====> (%s)", DriverName);
+
+    Result = StringCbPrintf(ServiceKeyName,
+                            MAX_PATH,
+                            SERVICES_KEY "\\%s",
+                            DriverName);
+    assert(SUCCEEDED(Result));
+
+    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+                         ServiceKeyName,
+                         0,
+                         KEY_READ,
+                         &ServiceKey);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Value = 1;
+            goto done;
+        }
+
+        SetLastError(Error);
+        goto fail1;
+    }
+
+    ValueLength = sizeof (Value);
+
+    Error = RegQueryValueEx(ServiceKey,
+                            "AllowUpdate",
+                            NULL,
+                            &Type,
+                            (LPBYTE)&Value,
+                            &ValueLength);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Type = REG_DWORD;
+            Value = 1;
+        } else {
+            SetLastError(Error);
+            goto fail2;
+        }
+    }
+
+    if (Type != REG_DWORD) {
+        SetLastError(ERROR_BAD_FORMAT);
+        goto fail3;
+    }
+
+done:
+    if (Value == 0) {
+        Log("DISALLOWED");
+        *Allow = FALSE;
+    }
+
+    RegCloseKey(ServiceKey);
+
+    Log("<====");
+
+    return TRUE;
+
+fail3:
+    Log("fail3");
+
+fail2:
+    Log("fail2");
+
+    RegCloseKey(ServiceKey);
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = __GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
+AllowInstall(
+    OUT PBOOLEAN    Allow
+    )
+{
+    BOOLEAN         Success;
+    HRESULT         Error;
+
+    Log("====>");
+
+    *Allow = TRUE;
+
+    Success = AllowUpdate("XENNET", Allow);
+    if (!Success)
+        goto fail1;
+
+    Log("<====");
+
+    return TRUE;
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = __GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
 CheckStatus(
     OUT PBOOLEAN    NeedReboot
     )
@@ -315,13 +441,44 @@ __DifInstallPreProcess(
     IN  PCOINSTALLER_CONTEXT_DATA   Context
     )
 {
+    HRESULT                         Error;
+    BOOLEAN                         Success;
+    BOOLEAN                         Allow;
+
     UNREFERENCED_PARAMETER(DeviceInfoSet);
     UNREFERENCED_PARAMETER(DeviceInfoData);
     UNREFERENCED_PARAMETER(Context);
 
-    Log("<===>");
+    Log("====>");
+
+    Success = AllowInstall(&Allow);
+    if (!Success)
+        goto fail1;
+
+    if (!Allow) {
+        SetLastError(ERROR_ACCESS_DENIED);
+        goto fail2;
+    }
+
+    Log("<====");
 
     return NO_ERROR; 
+
+fail2:
+    Log("fail2");
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+
+        Message = __GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return Error;
 }
 
 static FORCEINLINE 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 Oct 22 15:24:12 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 15:24: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 1ZpHiu-000394-HI; Thu, 22 Oct 2015 15:24:12 +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 1ZpHit-00038Y-JK
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 15:24:11 +0000
Received: from [85.158.137.68] by server-2.bemta-3.messagelabs.com id
	EB/04-21201-A9FF8265; Thu, 22 Oct 2015 15:24:10 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-12.tower-31.messagelabs.com!1445527449!18893440!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 25977 invoked from network); 22 Oct 2015 15:24:10 -0000
Received: from mail-wi0-f175.google.com (HELO mail-wi0-f175.google.com)
	(209.85.212.175)
	by server-12.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 15:24:10 -0000
Received: by wikq8 with SMTP id q8so37211639wik.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 08:24:09 -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=O/GBYIdX0EQuMDGCr2bvD1a3fPyRnOLwSilujgA6ZZ0=;
	b=Jac6lCXSGWPP/QjR0ITCeUIwRC3QvHKInpYCFpkLOMtObSJ8rRy5FSdiIjro3XzbYO
	+9/d7LQAscxDY2n3YTvXuCCxPScZfurwOADUrkLSs+ztB1gYJ4KOQZCJE8AiY1slkq5k
	/Rd3nBmxklN9pleGjUIUAhNlArZMn7YX4o1+vzz6N0vxZOUblmOmr/CTwVUcq2Tvifzt
	1WSCEQGfVn+gIVd3TXSdR06ooaOROm7A8BtGcM9aTjP/EgjDk8pq4xuzfgJf7JX6jIGz
	+t+TynjCVOZz9i56DX1joyTKARp/7WpRKvAvFuMtKS3VN9F9DahImimZYzgqgznGKStT
	8ftw==
X-Received: by 10.194.156.195 with SMTP id wg3mr20589860wjb.2.1445527449719;
	Thu, 22 Oct 2015 08:24:09 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	it4sm17470135wjb.0.2015.10.22.08.24.09
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 08:24: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: Thu, 22 Oct 2015 16:24:17 +0100
Message-Id: <1445527457-7752-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1445527457-7752-1-git-send-email-paul.durrant@citrix.com>
References: <1445527457-7752-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Add a registry override to veto driver
	installations
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 certain cases where a local installer package may wish to
prevent Windows Update installations of drivers. This can be achieved by
having the co-installer check for a registry value and fail it's pre-install
phase if the value is present.

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

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index d1222df..f60aa43 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -191,6 +191,132 @@ __FunctionName(
 }
 
 static BOOLEAN
+AllowUpdate(
+    IN  PTCHAR      DriverName,
+    OUT PBOOLEAN    Allow
+    )
+{
+    TCHAR           ServiceKeyName[MAX_PATH];
+    HKEY            ServiceKey;
+    HRESULT         Result;
+    HRESULT         Error;
+    DWORD           ValueLength;
+    DWORD           Value;
+    DWORD           Type;
+
+    Log("====> (%s)", DriverName);
+
+    Result = StringCbPrintf(ServiceKeyName,
+                            MAX_PATH,
+                            SERVICES_KEY "\\%s",
+                            DriverName);
+    assert(SUCCEEDED(Result));
+
+    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+                         ServiceKeyName,
+                         0,
+                         KEY_READ,
+                         &ServiceKey);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Value = 1;
+            goto done;
+        }
+
+        SetLastError(Error);
+        goto fail1;
+    }
+
+    ValueLength = sizeof (Value);
+
+    Error = RegQueryValueEx(ServiceKey,
+                            "AllowUpdate",
+                            NULL,
+                            &Type,
+                            (LPBYTE)&Value,
+                            &ValueLength);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Type = REG_DWORD;
+            Value = 1;
+        } else {
+            SetLastError(Error);
+            goto fail2;
+        }
+    }
+
+    if (Type != REG_DWORD) {
+        SetLastError(ERROR_BAD_FORMAT);
+        goto fail3;
+    }
+
+done:
+    if (Value == 0) {
+        Log("DISALLOWED");
+        *Allow = FALSE;
+    }
+
+    RegCloseKey(ServiceKey);
+
+    Log("<====");
+
+    return TRUE;
+
+fail3:
+    Log("fail3");
+
+fail2:
+    Log("fail2");
+
+    RegCloseKey(ServiceKey);
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = __GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
+AllowInstall(
+    OUT PBOOLEAN    Allow
+    )
+{
+    BOOLEAN         Success;
+    HRESULT         Error;
+
+    Log("====>");
+
+    *Allow = TRUE;
+
+    Success = AllowUpdate("XENNET", Allow);
+    if (!Success)
+        goto fail1;
+
+    Log("<====");
+
+    return TRUE;
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = __GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
 CheckStatus(
     OUT PBOOLEAN    NeedReboot
     )
@@ -315,13 +441,44 @@ __DifInstallPreProcess(
     IN  PCOINSTALLER_CONTEXT_DATA   Context
     )
 {
+    HRESULT                         Error;
+    BOOLEAN                         Success;
+    BOOLEAN                         Allow;
+
     UNREFERENCED_PARAMETER(DeviceInfoSet);
     UNREFERENCED_PARAMETER(DeviceInfoData);
     UNREFERENCED_PARAMETER(Context);
 
-    Log("<===>");
+    Log("====>");
+
+    Success = AllowInstall(&Allow);
+    if (!Success)
+        goto fail1;
+
+    if (!Allow) {
+        SetLastError(ERROR_ACCESS_DENIED);
+        goto fail2;
+    }
+
+    Log("<====");
 
     return NO_ERROR; 
+
+fail2:
+    Log("fail2");
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+
+        Message = __GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return Error;
 }
 
 static FORCEINLINE 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 Oct 22 15:24:46 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 15:24:46 +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 1ZpHjS-0003Bg-Jd; Thu, 22 Oct 2015 15:24:46 +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 1ZpHjR-0003BV-JM
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 15:24:45 +0000
Received: from [193.109.254.147] by server-6.bemta-14.messagelabs.com id
	17/05-16618-CBFF8265; Thu, 22 Oct 2015 15:24:44 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1445527483!60679205!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 6569 invoked from network); 22 Oct 2015 15:24:43 -0000
Received: from mail-wi0-f177.google.com (HELO mail-wi0-f177.google.com)
	(209.85.212.177)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 15:24:43 -0000
Received: by wicll6 with SMTP id ll6so124451563wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 08:24: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;
	bh=m3uK3kOG+7U6Kz4HKTTN0Fiu2FaVGga70uV2CeEHjGw=;
	b=fn8Yf4WuUkBWokutkN3dRowUYsAAHJ5npflNKtbqLPApPAMu1DoZ5NJuhbwUBBBqA1
	s662MgZpVuj1Hf7g678VU8hB7mAzOSTwaMFtSIlRnytge3Jcld2/ReQm5ceJ6xGBiSyS
	qJ84M7LEZgqgEJ/y8AHCvTvAZEjLXgNrZJhylN4wc8YSwQ2aXKUD/KyqptbWnUwlryOo
	h+M9iVds6FQWsQHykNGjgia5GlbNj2nfC4lT2uHcvulB6/byUjC5eY/ZLSmvuiW0ddoa
	zabCI/F8jOGTWnAojeGam4Aj+7Ie4TgHlQ752MvSzHvgU4/wycjrec4pEjgf9rrWBBh0
	MaQA==
X-Received: by 10.194.156.195 with SMTP id wg3mr20593825wjb.2.1445527483756;
	Thu, 22 Oct 2015 08:24:43 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	lv4sm17455827wjb.43.2015.10.22.08.24.43
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 08:24:43 -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, 22 Oct 2015 16:24:53 +0100
Message-Id: <1445527494-11840-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] Change coinstaller log level to
	TXTLOG_WARNING
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 10 does not enable logging of TXTLOG_DETAILS in setupapi.dev.log by
default, so use TXTLOG_WARNING to make sure the messages appear.

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 825ba38..e35c5d3 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -87,7 +87,7 @@ __Log(
 
     LogToken = SetupGetThreadLogToken();
     Category = TXTLOG_VENDOR;
-    Flags = TXTLOG_DETAILS;
+    Flags = TXTLOG_WARNING;
 
     SetupWriteTextLog(LogToken, Category, Flags, Buffer);
     Length = __min(MAXIMUM_BUFFER_SIZE - 1, Length + 2);
-- 
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 Oct 22 15:24:46 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 15:24:46 +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 1ZpHjS-0003Bg-Jd; Thu, 22 Oct 2015 15:24:46 +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 1ZpHjR-0003BV-JM
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 15:24:45 +0000
Received: from [193.109.254.147] by server-6.bemta-14.messagelabs.com id
	17/05-16618-CBFF8265; Thu, 22 Oct 2015 15:24:44 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1445527483!60679205!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 6569 invoked from network); 22 Oct 2015 15:24:43 -0000
Received: from mail-wi0-f177.google.com (HELO mail-wi0-f177.google.com)
	(209.85.212.177)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 15:24:43 -0000
Received: by wicll6 with SMTP id ll6so124451563wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 08:24: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;
	bh=m3uK3kOG+7U6Kz4HKTTN0Fiu2FaVGga70uV2CeEHjGw=;
	b=fn8Yf4WuUkBWokutkN3dRowUYsAAHJ5npflNKtbqLPApPAMu1DoZ5NJuhbwUBBBqA1
	s662MgZpVuj1Hf7g678VU8hB7mAzOSTwaMFtSIlRnytge3Jcld2/ReQm5ceJ6xGBiSyS
	qJ84M7LEZgqgEJ/y8AHCvTvAZEjLXgNrZJhylN4wc8YSwQ2aXKUD/KyqptbWnUwlryOo
	h+M9iVds6FQWsQHykNGjgia5GlbNj2nfC4lT2uHcvulB6/byUjC5eY/ZLSmvuiW0ddoa
	zabCI/F8jOGTWnAojeGam4Aj+7Ie4TgHlQ752MvSzHvgU4/wycjrec4pEjgf9rrWBBh0
	MaQA==
X-Received: by 10.194.156.195 with SMTP id wg3mr20593825wjb.2.1445527483756;
	Thu, 22 Oct 2015 08:24:43 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	lv4sm17455827wjb.43.2015.10.22.08.24.43
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 08:24:43 -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, 22 Oct 2015 16:24:53 +0100
Message-Id: <1445527494-11840-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] Change coinstaller log level to
	TXTLOG_WARNING
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 10 does not enable logging of TXTLOG_DETAILS in setupapi.dev.log by
default, so use TXTLOG_WARNING to make sure the messages appear.

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 825ba38..e35c5d3 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -87,7 +87,7 @@ __Log(
 
     LogToken = SetupGetThreadLogToken();
     Category = TXTLOG_VENDOR;
-    Flags = TXTLOG_DETAILS;
+    Flags = TXTLOG_WARNING;
 
     SetupWriteTextLog(LogToken, Category, Flags, Buffer);
     Length = __min(MAXIMUM_BUFFER_SIZE - 1, Length + 2);
-- 
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 Oct 22 15:24:51 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 15:24: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 1ZpHjX-0003CN-Ku; Thu, 22 Oct 2015 15:24:51 +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 1ZpHjW-0003CB-Cy
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 15:24:50 +0000
Received: from [193.109.254.147] by server-13.bemta-14.messagelabs.com id
	5D/22-12371-1CFF8265; Thu, 22 Oct 2015 15:24:49 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1445527484!60654560!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 23330 invoked from network); 22 Oct 2015 15:24:44 -0000
Received: from mail-wi0-f172.google.com (HELO mail-wi0-f172.google.com)
	(209.85.212.172)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 15:24:44 -0000
Received: by wicll6 with SMTP id ll6so140611019wic.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 08:24:44 -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=81XpnFJoSd3n4B8RGc6eTB3h6wbiDdpzSNjsGqexDTU=;
	b=sclyBbe7KAh0WDBsuwSbLD6R4+COwi+iLlPdyOdfEqEc+yevTlkQGm+giIdBAuBI+0
	83puiZi6Zc7eb+m3Xme+ZcUvpVuHoPqw31Tx9iGq1Zb0wrwZjbQBzRgnBMV+vjF26U8l
	fW1my2zhokTefHGiTAaM+jfBgGRqZ/cuquCMXUvSvIyROC3zE2Qn24i2fEQHEia0DeNZ
	7Sc5DPSGVNnDaGL1g0wvtdbpnIV4Nw++XC5FBRsx3BIl9WEPTALTv0w4HvqQ54qHjj7c
	doLXd/MwBUlP4knHxhtqfaVb/uc/zpKaAhnRR7xKbAuwEzk6m/1wjf2aQGdF921gS5t2
	Qfww==
X-Received: by 10.194.192.6 with SMTP id hc6mr17817356wjc.33.1445527484504;
	Thu, 22 Oct 2015 08:24:44 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	lv4sm17455827wjb.43.2015.10.22.08.24.43
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 08:24: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, 22 Oct 2015 16:24:54 +0100
Message-Id: <1445527494-11840-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1445527494-11840-1-git-send-email-paul.durrant@citrix.com>
References: <1445527494-11840-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Add a registry override to veto driver
	installations
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 certain cases where a local installer package may wish to
prevent Windows Update installations of drivers. This can be achieved by
having the co-installer check for a registry value and fail it's pre-install
phase if the value is present.

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

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index e35c5d3..156a6a3 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -235,6 +235,132 @@ fail1:
 }
 
 static BOOLEAN
+AllowUpdate(
+    IN  PTCHAR      DriverName,
+    OUT PBOOLEAN    Allow
+    )
+{
+    TCHAR           ServiceKeyName[MAX_PATH];
+    HKEY            ServiceKey;
+    HRESULT         Result;
+    HRESULT         Error;
+    DWORD           ValueLength;
+    DWORD           Value;
+    DWORD           Type;
+
+    Log("====> (%s)", DriverName);
+
+    Result = StringCbPrintf(ServiceKeyName,
+                            MAX_PATH,
+                            SERVICES_KEY "\\%s",
+                            DriverName);
+    assert(SUCCEEDED(Result));
+
+    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+                         ServiceKeyName,
+                         0,
+                         KEY_READ,
+                         &ServiceKey);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Value = 1;
+            goto done;
+        }
+
+        SetLastError(Error);
+        goto fail1;
+    }
+
+    ValueLength = sizeof (Value);
+
+    Error = RegQueryValueEx(ServiceKey,
+                            "AllowUpdate",
+                            NULL,
+                            &Type,
+                            (LPBYTE)&Value,
+                            &ValueLength);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Type = REG_DWORD;
+            Value = 1;
+        } else {
+            SetLastError(Error);
+            goto fail2;
+        }
+    }
+
+    if (Type != REG_DWORD) {
+        SetLastError(ERROR_BAD_FORMAT);
+        goto fail3;
+    }
+
+done:
+    if (Value == 0) {
+        Log("DISALLOWED");
+        *Allow = FALSE;
+    }
+
+    RegCloseKey(ServiceKey);
+
+    Log("<====");
+
+    return TRUE;
+
+fail3:
+    Log("fail3");
+
+fail2:
+    Log("fail2");
+
+    RegCloseKey(ServiceKey);
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
+AllowInstall(
+    OUT PBOOLEAN    Allow
+    )
+{
+    BOOLEAN         Success;
+    HRESULT         Error;
+
+    Log("====>");
+
+    *Allow = TRUE;
+
+    Success = AllowUpdate("XENVIF", Allow);
+    if (!Success)
+        goto fail1;
+
+    Log("<====");
+
+    return TRUE;
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
 OpenEnumKey(
     OUT PHKEY   EnumKey
     )
@@ -903,6 +1029,7 @@ DifInstallPreProcess(
 {
     HRESULT                         Error;
     BOOLEAN                         Success;
+    BOOLEAN                         Allow;
 
     UNREFERENCED_PARAMETER(DeviceInfoSet);
     UNREFERENCED_PARAMETER(DeviceInfoData);
@@ -910,14 +1037,29 @@ DifInstallPreProcess(
 
     Log("====>");
 
-    Success = SupportChildDrivers();
+    Success = AllowInstall(&Allow);
     if (!Success)
         goto fail1;
 
+    if (!Allow) {
+        SetLastError(ERROR_ACCESS_DENIED);
+        goto fail2;
+    }
+
+    Success = SupportChildDrivers();
+    if (!Success)
+        goto fail3;
+
     Log("<====");
 
     return NO_ERROR;
 
+fail3:
+    Log("fail3");
+
+fail2:
+    Log("fail2");
+
 fail1:
     Error = GetLastError();
 
-- 
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 Oct 22 15:24:51 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 15:24: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 1ZpHjX-0003CN-Ku; Thu, 22 Oct 2015 15:24:51 +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 1ZpHjW-0003CB-Cy
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 15:24:50 +0000
Received: from [193.109.254.147] by server-13.bemta-14.messagelabs.com id
	5D/22-12371-1CFF8265; Thu, 22 Oct 2015 15:24:49 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1445527484!60654560!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 23330 invoked from network); 22 Oct 2015 15:24:44 -0000
Received: from mail-wi0-f172.google.com (HELO mail-wi0-f172.google.com)
	(209.85.212.172)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 15:24:44 -0000
Received: by wicll6 with SMTP id ll6so140611019wic.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 08:24:44 -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=81XpnFJoSd3n4B8RGc6eTB3h6wbiDdpzSNjsGqexDTU=;
	b=sclyBbe7KAh0WDBsuwSbLD6R4+COwi+iLlPdyOdfEqEc+yevTlkQGm+giIdBAuBI+0
	83puiZi6Zc7eb+m3Xme+ZcUvpVuHoPqw31Tx9iGq1Zb0wrwZjbQBzRgnBMV+vjF26U8l
	fW1my2zhokTefHGiTAaM+jfBgGRqZ/cuquCMXUvSvIyROC3zE2Qn24i2fEQHEia0DeNZ
	7Sc5DPSGVNnDaGL1g0wvtdbpnIV4Nw++XC5FBRsx3BIl9WEPTALTv0w4HvqQ54qHjj7c
	doLXd/MwBUlP4knHxhtqfaVb/uc/zpKaAhnRR7xKbAuwEzk6m/1wjf2aQGdF921gS5t2
	Qfww==
X-Received: by 10.194.192.6 with SMTP id hc6mr17817356wjc.33.1445527484504;
	Thu, 22 Oct 2015 08:24:44 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	lv4sm17455827wjb.43.2015.10.22.08.24.43
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 08:24: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, 22 Oct 2015 16:24:54 +0100
Message-Id: <1445527494-11840-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1445527494-11840-1-git-send-email-paul.durrant@citrix.com>
References: <1445527494-11840-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Add a registry override to veto driver
	installations
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 certain cases where a local installer package may wish to
prevent Windows Update installations of drivers. This can be achieved by
having the co-installer check for a registry value and fail it's pre-install
phase if the value is present.

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

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index e35c5d3..156a6a3 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -235,6 +235,132 @@ fail1:
 }
 
 static BOOLEAN
+AllowUpdate(
+    IN  PTCHAR      DriverName,
+    OUT PBOOLEAN    Allow
+    )
+{
+    TCHAR           ServiceKeyName[MAX_PATH];
+    HKEY            ServiceKey;
+    HRESULT         Result;
+    HRESULT         Error;
+    DWORD           ValueLength;
+    DWORD           Value;
+    DWORD           Type;
+
+    Log("====> (%s)", DriverName);
+
+    Result = StringCbPrintf(ServiceKeyName,
+                            MAX_PATH,
+                            SERVICES_KEY "\\%s",
+                            DriverName);
+    assert(SUCCEEDED(Result));
+
+    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+                         ServiceKeyName,
+                         0,
+                         KEY_READ,
+                         &ServiceKey);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Value = 1;
+            goto done;
+        }
+
+        SetLastError(Error);
+        goto fail1;
+    }
+
+    ValueLength = sizeof (Value);
+
+    Error = RegQueryValueEx(ServiceKey,
+                            "AllowUpdate",
+                            NULL,
+                            &Type,
+                            (LPBYTE)&Value,
+                            &ValueLength);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Type = REG_DWORD;
+            Value = 1;
+        } else {
+            SetLastError(Error);
+            goto fail2;
+        }
+    }
+
+    if (Type != REG_DWORD) {
+        SetLastError(ERROR_BAD_FORMAT);
+        goto fail3;
+    }
+
+done:
+    if (Value == 0) {
+        Log("DISALLOWED");
+        *Allow = FALSE;
+    }
+
+    RegCloseKey(ServiceKey);
+
+    Log("<====");
+
+    return TRUE;
+
+fail3:
+    Log("fail3");
+
+fail2:
+    Log("fail2");
+
+    RegCloseKey(ServiceKey);
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
+AllowInstall(
+    OUT PBOOLEAN    Allow
+    )
+{
+    BOOLEAN         Success;
+    HRESULT         Error;
+
+    Log("====>");
+
+    *Allow = TRUE;
+
+    Success = AllowUpdate("XENVIF", Allow);
+    if (!Success)
+        goto fail1;
+
+    Log("<====");
+
+    return TRUE;
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
 OpenEnumKey(
     OUT PHKEY   EnumKey
     )
@@ -903,6 +1029,7 @@ DifInstallPreProcess(
 {
     HRESULT                         Error;
     BOOLEAN                         Success;
+    BOOLEAN                         Allow;
 
     UNREFERENCED_PARAMETER(DeviceInfoSet);
     UNREFERENCED_PARAMETER(DeviceInfoData);
@@ -910,14 +1037,29 @@ DifInstallPreProcess(
 
     Log("====>");
 
-    Success = SupportChildDrivers();
+    Success = AllowInstall(&Allow);
     if (!Success)
         goto fail1;
 
+    if (!Allow) {
+        SetLastError(ERROR_ACCESS_DENIED);
+        goto fail2;
+    }
+
+    Success = SupportChildDrivers();
+    if (!Success)
+        goto fail3;
+
     Log("<====");
 
     return NO_ERROR;
 
+fail3:
+    Log("fail3");
+
+fail2:
+    Log("fail2");
+
 fail1:
     Error = GetLastError();
 
-- 
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 Oct 22 15:26:20 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 15:26: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 1ZpHkx-0003En-PE; Thu, 22 Oct 2015 15:26: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 1ZpHkx-0003Eg-3I
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 15:26:19 +0000
Received: from [193.109.254.147] by server-9.bemta-14.messagelabs.com id
	A1/18-26043-A1009265; Thu, 22 Oct 2015 15:26:18 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1445527577!24650023!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 24276 invoked from network); 22 Oct 2015 15:26:17 -0000
Received: from mail-wi0-f176.google.com (HELO mail-wi0-f176.google.com)
	(209.85.212.176)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 15:26:17 -0000
Received: by wicfx6 with SMTP id fx6so141016334wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 08:26: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=nF03VQo60uBLeqj5tsjyAnlD+5kEHJaJzvqD64pf2QY=;
	b=mW4uF17Lkgibbihe3TFGG528xtE4iNN/mesatrVSW99mask9+Q8/70zWWKVc8arFtc
	U4e/HQiIvU9fihTqwjnkhBYeqSBczsBI/bIKhxMn3EdHyXaNFn8Ux/0HfNUxA7XlsE8J
	lW3HsXuXKkFS9ubPSqmXyBo9ABC6pZU1AmIF4uJLDtI7BfWpQxBi0aWOmCYgeuw0NQxo
	P4tG5WgDozQ/DAlZAdI+tWN0cje+QTAqpGZDugB5MRLBdTv0i7rqe8wvPg3fSfzAq/02
	7RkaEIxj+zix+2DVgRzVVaicreJyQyuTX5Gj7cmEE7wg8pS+HC9jzoe/fBkDKQyLtF0U
	IOqg==
X-Received: by 10.180.240.169 with SMTP id wb9mr43036865wic.88.1445527576985; 
	Thu, 22 Oct 2015 08:26:16 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	en2sm12063102wib.5.2015.10.22.08.26.16
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 08:26: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: Thu, 22 Oct 2015 16:26:22 +0100
Message-Id: <1445527583-3252-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] Change coinstaller log level to
	TXTLOG_WARNING
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 10 does not enable logging of TXTLOG_DETAILS in setupapi.dev.log by
default, so use TXTLOG_WARNING to make sure the messages appear.

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 5cdd060..75d3f28 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -84,7 +84,7 @@ __Log(
 
     LogToken = SetupGetThreadLogToken();
     Category = TXTLOG_VENDOR;
-    Flags = TXTLOG_DETAILS;
+    Flags = TXTLOG_WARNING;
 
     SetupWriteTextLog(LogToken, Category, Flags, Buffer);
     Length = __min(MAXIMUM_BUFFER_SIZE - 1, Length + 2);
-- 
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 Oct 22 15:26:20 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 15:26: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 1ZpHkx-0003En-PE; Thu, 22 Oct 2015 15:26: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 1ZpHkx-0003Eg-3I
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 15:26:19 +0000
Received: from [193.109.254.147] by server-9.bemta-14.messagelabs.com id
	A1/18-26043-A1009265; Thu, 22 Oct 2015 15:26:18 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1445527577!24650023!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 24276 invoked from network); 22 Oct 2015 15:26:17 -0000
Received: from mail-wi0-f176.google.com (HELO mail-wi0-f176.google.com)
	(209.85.212.176)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 15:26:17 -0000
Received: by wicfx6 with SMTP id fx6so141016334wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 08:26: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=nF03VQo60uBLeqj5tsjyAnlD+5kEHJaJzvqD64pf2QY=;
	b=mW4uF17Lkgibbihe3TFGG528xtE4iNN/mesatrVSW99mask9+Q8/70zWWKVc8arFtc
	U4e/HQiIvU9fihTqwjnkhBYeqSBczsBI/bIKhxMn3EdHyXaNFn8Ux/0HfNUxA7XlsE8J
	lW3HsXuXKkFS9ubPSqmXyBo9ABC6pZU1AmIF4uJLDtI7BfWpQxBi0aWOmCYgeuw0NQxo
	P4tG5WgDozQ/DAlZAdI+tWN0cje+QTAqpGZDugB5MRLBdTv0i7rqe8wvPg3fSfzAq/02
	7RkaEIxj+zix+2DVgRzVVaicreJyQyuTX5Gj7cmEE7wg8pS+HC9jzoe/fBkDKQyLtF0U
	IOqg==
X-Received: by 10.180.240.169 with SMTP id wb9mr43036865wic.88.1445527576985; 
	Thu, 22 Oct 2015 08:26:16 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	en2sm12063102wib.5.2015.10.22.08.26.16
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 08:26: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: Thu, 22 Oct 2015 16:26:22 +0100
Message-Id: <1445527583-3252-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] Change coinstaller log level to
	TXTLOG_WARNING
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 10 does not enable logging of TXTLOG_DETAILS in setupapi.dev.log by
default, so use TXTLOG_WARNING to make sure the messages appear.

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 5cdd060..75d3f28 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -84,7 +84,7 @@ __Log(
 
     LogToken = SetupGetThreadLogToken();
     Category = TXTLOG_VENDOR;
-    Flags = TXTLOG_DETAILS;
+    Flags = TXTLOG_WARNING;
 
     SetupWriteTextLog(LogToken, Category, Flags, Buffer);
     Length = __min(MAXIMUM_BUFFER_SIZE - 1, Length + 2);
-- 
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 Oct 22 15:26:20 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 15:26: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 1ZpHky-0003FC-QN; Thu, 22 Oct 2015 15:26:20 +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 1ZpHkx-0003Ei-KB
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 15:26:19 +0000
Received: from [193.109.254.147] by server-13.bemta-14.messagelabs.com id
	C5/44-12371-A1009265; Thu, 22 Oct 2015 15:26:18 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1445527577!60624543!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 19285 invoked from network); 22 Oct 2015 15:26:17 -0000
Received: from mail-wi0-f169.google.com (HELO mail-wi0-f169.google.com)
	(209.85.212.169)
	by server-10.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 15:26:17 -0000
Received: by wikq8 with SMTP id q8so37306546wik.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 08:26: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=g9ZslAU9F2BHUoeq3OtdUwp15H2BGmDWzyhLjTO37+s=;
	b=w6AtcKgqEFcxDNKnCSM83BxYl92rrnjf3kr5hyIKW8UmqRK7/tXf9uowEvzdBd9EWQ
	4y+gjmocEXAhHc3H+UzehMM71a1bFaUxTIyOJx0Q/+QRB8DqCsJPn2RtRjSK7ac1uA/U
	h/pZ3dKr6c14ZpdJwylUWajnSsMMZAUxb7ZGXAsWrVBpsB9/sF1MlVgFIoVjAputPyMH
	Cd9OzUOAdVGA2hf85H57OrkMCyX3wObZgQDHneG8XE2JGS6w3bHJPsXf4w6CC19j8XDo
	968luvh9vme6vr+IMQFuwzcUMhRJgzqLbmKHOvefsGji6DgIK2U/wq3pIn8ZhdHiD86a
	sGrw==
X-Received: by 10.194.172.1 with SMTP id ay1mr18267964wjc.101.1445527577668;
	Thu, 22 Oct 2015 08:26:17 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	en2sm12063102wib.5.2015.10.22.08.26.17
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 08:26: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: Thu, 22 Oct 2015 16:26:23 +0100
Message-Id: <1445527583-3252-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1445527583-3252-1-git-send-email-paul.durrant@citrix.com>
References: <1445527583-3252-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Add a registry override to veto driver
	installations
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 certain cases where a local installer package may wish to
prevent Windows Update installations of drivers. This can be achieved by
having the co-installer check for a registry value and fail it's pre-install
phase if the value is present.

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

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 75d3f28..d6700c0 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -185,6 +185,146 @@ __FunctionName(
 }
 
 static BOOLEAN
+AllowUpdate(
+    IN  PTCHAR      DriverName,
+    OUT PBOOLEAN    Allow
+    )
+{
+    TCHAR           ServiceKeyName[MAX_PATH];
+    HKEY            ServiceKey;
+    HRESULT         Result;
+    HRESULT         Error;
+    DWORD           ValueLength;
+    DWORD           Value;
+    DWORD           Type;
+
+    Log("====> (%s)", DriverName);
+
+    Result = StringCbPrintf(ServiceKeyName,
+                            MAX_PATH,
+                            SERVICES_KEY "\\%s",
+                            DriverName);
+    assert(SUCCEEDED(Result));
+
+    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+                         ServiceKeyName,
+                         0,
+                         KEY_READ,
+                         &ServiceKey);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Value = 1;
+            goto done;
+        }
+
+        SetLastError(Error);
+        goto fail1;
+    }
+
+    ValueLength = sizeof (Value);
+
+    Error = RegQueryValueEx(ServiceKey,
+                            "AllowUpdate",
+                            NULL,
+                            &Type,
+                            (LPBYTE)&Value,
+                            &ValueLength);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Type = REG_DWORD;
+            Value = 1;
+        } else {
+            SetLastError(Error);
+            goto fail2;
+        }
+    }
+
+    if (Type != REG_DWORD) {
+        SetLastError(ERROR_BAD_FORMAT);
+        goto fail3;
+    }
+
+done:
+    if (Value == 0) {
+        Log("DISALLOWED");
+        *Allow = FALSE;
+    }
+
+    RegCloseKey(ServiceKey);
+
+    Log("<====");
+
+    return TRUE;
+
+fail3:
+    Log("fail3");
+
+fail2:
+    Log("fail2");
+
+    RegCloseKey(ServiceKey);
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
+AllowInstall(
+    OUT PBOOLEAN    Allow
+    )
+{
+    BOOLEAN         Success;
+    HRESULT         Error;
+
+    Log("====>");
+
+    *Allow = TRUE;
+
+    Success = AllowUpdate("XEN", Allow);
+    if (!Success)
+        goto fail1;
+
+    Success = AllowUpdate("XENBUS", Allow);
+    if (!Success)
+        goto fail2;
+
+    Success = AllowUpdate("XENFILT", Allow);
+    if (!Success)
+        goto fail3;
+
+    Log("<====");
+
+    return TRUE;
+
+fail3:
+    Log("fail3");
+
+fail2:
+    Log("fail2");
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
 OpenEnumKey(
     OUT PHKEY   EnumKey
     )
@@ -1271,6 +1411,7 @@ DifInstallPreProcess(
 {
     BOOLEAN                         Success;
     HRESULT                         Error;
+    BOOLEAN                         Allow;
 
     UNREFERENCED_PARAMETER(DeviceInfoSet);
     UNREFERENCED_PARAMETER(DeviceInfoData);
@@ -1278,18 +1419,33 @@ DifInstallPreProcess(
 
     Log("====>");
 
-    Success = MatchExistingDriver();
+    Success = AllowInstall(&Allow);
     if (!Success)
         goto fail1;
 
+    if (!Allow) {
+        SetLastError(ERROR_ACCESS_DENIED);
+        goto fail2;
+    }
+
+    Success = MatchExistingDriver();
+    if (!Success)
+        goto fail3;
+
     Success = SupportChildDrivers();
     if (!Success)
-        goto fail2;
+        goto fail4;
 
     Log("<====");
     
     return NO_ERROR;
 
+fail4:
+    Log("fail4");
+
+fail3:
+    Log("fail3");
+
 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 Thu Oct 22 15:26:20 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 22 Oct 2015 15:26: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 1ZpHky-0003FC-QN; Thu, 22 Oct 2015 15:26:20 +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 1ZpHkx-0003Ei-KB
	for win-pv-devel@lists.xenproject.org; Thu, 22 Oct 2015 15:26:19 +0000
Received: from [193.109.254.147] by server-13.bemta-14.messagelabs.com id
	C5/44-12371-A1009265; Thu, 22 Oct 2015 15:26:18 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1445527577!60624543!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 19285 invoked from network); 22 Oct 2015 15:26:17 -0000
Received: from mail-wi0-f169.google.com (HELO mail-wi0-f169.google.com)
	(209.85.212.169)
	by server-10.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2015 15:26:17 -0000
Received: by wikq8 with SMTP id q8so37306546wik.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 22 Oct 2015 08:26: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=g9ZslAU9F2BHUoeq3OtdUwp15H2BGmDWzyhLjTO37+s=;
	b=w6AtcKgqEFcxDNKnCSM83BxYl92rrnjf3kr5hyIKW8UmqRK7/tXf9uowEvzdBd9EWQ
	4y+gjmocEXAhHc3H+UzehMM71a1bFaUxTIyOJx0Q/+QRB8DqCsJPn2RtRjSK7ac1uA/U
	h/pZ3dKr6c14ZpdJwylUWajnSsMMZAUxb7ZGXAsWrVBpsB9/sF1MlVgFIoVjAputPyMH
	Cd9OzUOAdVGA2hf85H57OrkMCyX3wObZgQDHneG8XE2JGS6w3bHJPsXf4w6CC19j8XDo
	968luvh9vme6vr+IMQFuwzcUMhRJgzqLbmKHOvefsGji6DgIK2U/wq3pIn8ZhdHiD86a
	sGrw==
X-Received: by 10.194.172.1 with SMTP id ay1mr18267964wjc.101.1445527577668;
	Thu, 22 Oct 2015 08:26:17 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	en2sm12063102wib.5.2015.10.22.08.26.17
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 22 Oct 2015 08:26: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: Thu, 22 Oct 2015 16:26:23 +0100
Message-Id: <1445527583-3252-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1445527583-3252-1-git-send-email-paul.durrant@citrix.com>
References: <1445527583-3252-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Add a registry override to veto driver
	installations
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 certain cases where a local installer package may wish to
prevent Windows Update installations of drivers. This can be achieved by
having the co-installer check for a registry value and fail it's pre-install
phase if the value is present.

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

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 75d3f28..d6700c0 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -185,6 +185,146 @@ __FunctionName(
 }
 
 static BOOLEAN
+AllowUpdate(
+    IN  PTCHAR      DriverName,
+    OUT PBOOLEAN    Allow
+    )
+{
+    TCHAR           ServiceKeyName[MAX_PATH];
+    HKEY            ServiceKey;
+    HRESULT         Result;
+    HRESULT         Error;
+    DWORD           ValueLength;
+    DWORD           Value;
+    DWORD           Type;
+
+    Log("====> (%s)", DriverName);
+
+    Result = StringCbPrintf(ServiceKeyName,
+                            MAX_PATH,
+                            SERVICES_KEY "\\%s",
+                            DriverName);
+    assert(SUCCEEDED(Result));
+
+    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+                         ServiceKeyName,
+                         0,
+                         KEY_READ,
+                         &ServiceKey);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Value = 1;
+            goto done;
+        }
+
+        SetLastError(Error);
+        goto fail1;
+    }
+
+    ValueLength = sizeof (Value);
+
+    Error = RegQueryValueEx(ServiceKey,
+                            "AllowUpdate",
+                            NULL,
+                            &Type,
+                            (LPBYTE)&Value,
+                            &ValueLength);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Type = REG_DWORD;
+            Value = 1;
+        } else {
+            SetLastError(Error);
+            goto fail2;
+        }
+    }
+
+    if (Type != REG_DWORD) {
+        SetLastError(ERROR_BAD_FORMAT);
+        goto fail3;
+    }
+
+done:
+    if (Value == 0) {
+        Log("DISALLOWED");
+        *Allow = FALSE;
+    }
+
+    RegCloseKey(ServiceKey);
+
+    Log("<====");
+
+    return TRUE;
+
+fail3:
+    Log("fail3");
+
+fail2:
+    Log("fail2");
+
+    RegCloseKey(ServiceKey);
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
+AllowInstall(
+    OUT PBOOLEAN    Allow
+    )
+{
+    BOOLEAN         Success;
+    HRESULT         Error;
+
+    Log("====>");
+
+    *Allow = TRUE;
+
+    Success = AllowUpdate("XEN", Allow);
+    if (!Success)
+        goto fail1;
+
+    Success = AllowUpdate("XENBUS", Allow);
+    if (!Success)
+        goto fail2;
+
+    Success = AllowUpdate("XENFILT", Allow);
+    if (!Success)
+        goto fail3;
+
+    Log("<====");
+
+    return TRUE;
+
+fail3:
+    Log("fail3");
+
+fail2:
+    Log("fail2");
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
 OpenEnumKey(
     OUT PHKEY   EnumKey
     )
@@ -1271,6 +1411,7 @@ DifInstallPreProcess(
 {
     BOOLEAN                         Success;
     HRESULT                         Error;
+    BOOLEAN                         Allow;
 
     UNREFERENCED_PARAMETER(DeviceInfoSet);
     UNREFERENCED_PARAMETER(DeviceInfoData);
@@ -1278,18 +1419,33 @@ DifInstallPreProcess(
 
     Log("====>");
 
-    Success = MatchExistingDriver();
+    Success = AllowInstall(&Allow);
     if (!Success)
         goto fail1;
 
+    if (!Allow) {
+        SetLastError(ERROR_ACCESS_DENIED);
+        goto fail2;
+    }
+
+    Success = MatchExistingDriver();
+    if (!Success)
+        goto fail3;
+
     Success = SupportChildDrivers();
     if (!Success)
-        goto fail2;
+        goto fail4;
 
     Log("<====");
     
     return NO_ERROR;
 
+fail4:
+    Log("fail4");
+
+fail3:
+    Log("fail3");
+
 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 Fri Oct 23 09:15:41 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 09:15: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 1ZpYRo-0007lw-3T; Fri, 23 Oct 2015 09:15:40 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabio.fantoni@m2r.biz>) id 1ZpYRl-0007ln-HC
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 09:15:38 +0000
Received: from [85.158.137.68] by server-4.bemta-3.messagelabs.com id
	4E/E4-09570-5BAF9265; Fri, 23 Oct 2015 09:15:33 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-5.tower-31.messagelabs.com!1445591721!56064894!1
X-Originating-IP: [209.85.212.174]
X-SpamReason: No, hits=1.2 required=7.0 tests=UNIQUE_WORDS,
  UPPERCASE_50_75
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31497 invoked from network); 23 Oct 2015 09:15:21 -0000
Received: from mail-wi0-f174.google.com (HELO mail-wi0-f174.google.com)
	(209.85.212.174)
	by server-5.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 09:15:21 -0000
Received: by wicll6 with SMTP id ll6so22589462wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 23 Oct 2015 02:15:20 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=m2r_biz.20150623.gappssmtp.com; s=20150623;
	h=to:cc:from:subject:message-id:date:user-agent:mime-version
	:content-type; bh=WjKvNFjPU7aCmtJvLhAOU3mveq7H1yS2uixjMsKo37g=;
	b=NbVLe1+6IcZi3ad8iFuASEkH6sIjc1XTgiu/1whXw2EL7qnki6S2aeTMDRiDO3A8N6
	7RWq9PxWkz4P+UOp4hPrmOlkXjWKy8NZZ6N1df20J0u8/4f/VxXGpJkVsk8W16ochRBm
	M6jw/oJMJmut+nydRb9lKs/8GekyFDmZApxWpEkCJhR+SwpK04VMfPHeLh3LlxaaVQzM
	peVpfUeQ4W1X0u89MHG5lXAdaPDdUlrYclRPCCa74/Z73+ZEHEctoqdYzOym/5z3uPSN
	3AZo7ngtEMyhm/86r8l4sjmPJS9km8c66NfRZvcBzvH8joFyTZW7hBbEeXEUWa3tkrEl
	nE3g==
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=WjKvNFjPU7aCmtJvLhAOU3mveq7H1yS2uixjMsKo37g=;
	b=lZand24nldE46NmmWJ/WJ2kg7p/mHzp7TDAEjKbX9z98Snu84GLKrSwHktXZq/DQtm
	XvvISUrvkXD2ZKHGPhZUjtU3fr06xJ8G+tUlGrNgmcW7mNxLqvbL0DAl16xj9xUf6thR
	dCVF/XlmuPNdG1pqzIPDBKbo9qNBjKD00oRQgdiVnMJ7sGw63kIIPKnyeiHX75WzzB+w
	tG2KV4/HAPCixWUy2tL8eh0WbgyR2BPEwQG0XdXt+e9epF+hYnwmdB059+4bOcYEyRpw
	ybgYq1jPevTvZtvvDgubsleQ/EGONa2L2dZ11r4dTKLLD1NNQrUbJbpsn2dMuCNvXnUf
	gOiQ==
X-Gm-Message-State: ALoCoQnZMDdfLoe2B1/u9wu32gmctGM8GRljIUsr0nECfo5i53/KDzW10xcfQ/iQpQo6JQ/sslLv
X-Received: by 10.194.133.129 with SMTP id pc1mr22735352wjb.148.1445591720795; 
	Fri, 23 Oct 2015 02:15:20 -0700 (PDT)
Received: from [192.168.1.37] (ip-73-126.sn2.eutelia.it. [83.211.73.126])
	by smtp.googlemail.com with ESMTPSA id
	x16sm2248683wia.7.2015.10.23.02.15.15
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 23 Oct 2015 02:15:19 -0700 (PDT)
To: win-pv-devel@lists.xenproject.org
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <5629FAAE.8090700@m2r.biz>
Date: Fri, 23 Oct 2015 11:15:26 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------040909010706090107090300"
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] winpv drivers update still don't works correctly and
 domUs unable to boot on next reboot
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.
--------------040909010706090107090300
Content-Type: text/plain; charset=iso-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

In many months I have tried numerous times with numerous winpv builds on 
windows update 7/8/10 but most of the time still using earlier builds 
for one or more components, and often the next reboot fails to boot.

In my latest test:
Dom0:
Wheezy (debian 7) 64 bit with xen 4.6.0 plus some small additional patches:
https://github.com/Fantu/Xen/commits/rebase/m2r-testing-4.6
kernel is custom build of 4.1.8 with .config in attachment
Qemu 2.4 with some small additional patches:
https://github.com/Fantu/qemu/commits/rebase/upstream
Seabios 1.8.2

DomU:
windows 10 pro 64 bit
xl cfg in attachment

I updated all winpv components to latest build without saw errors but on 
reboot windows fails to boot, in qemu log I saw a trace about and also 
the still use older build of at least one component.
Full qemu log with trace in attachment.
I had similar problem many time with different versions of xen, qemu, 
seabios, winpv, windows ecc...
I also already did at least one other report about time ago if I 
remember good.


If you need more informations/tests tell me and I'll post them.

Thanks for any reply and sorry for my bad english.



--------------040909010706090107090300
Content-Type: text/plain; charset=UTF-8;
 name="kernel-config"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="kernel-config"

#
# Automatically generated file; DO NOT EDIT.
# Linux/x86_64 4.1.8-0m2r-amd64 Kernel Configuration
#
CONFIG_64BIT=y
CONFIG_X86_64=y
CONFIG_X86=y
CONFIG_INSTRUCTION_DECODER=y
CONFIG_PERF_EVENTS_INTEL_UNCORE=y
CONFIG_OUTPUT_FORMAT="elf64-x86-64"
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
CONFIG_MMU=y
CONFIG_NEED_DMA_MAP_STATE=y
CONFIG_NEED_SG_DMA_LENGTH=y
CONFIG_GENERIC_ISA_DMA=y
CONFIG_GENERIC_BUG=y
CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
CONFIG_GENERIC_HWEIGHT=y
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_ARCH_HAS_CPU_RELAX=y
CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
CONFIG_HAVE_SETUP_PER_CPU_AREA=y
CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
CONFIG_ARCH_SUSPEND_POSSIBLE=y
CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
CONFIG_ZONE_DMA32=y
CONFIG_AUDIT_ARCH=y
CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y
CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
CONFIG_HAVE_INTEL_TXT=y
CONFIG_X86_64_SMP=y
CONFIG_X86_HT=y
CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-rdi -fcall-saved-rsi -fcall-saved-rdx -fcall-saved-rcx -fcall-saved-r8 -fcall-saved-r9 -fcall-saved-r10 -fcall-saved-r11"
CONFIG_ARCH_SUPPORTS_UPROBES=y
CONFIG_FIX_EARLYCON_MEM=y
CONFIG_PGTABLE_LEVELS=4
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
CONFIG_IRQ_WORK=y
CONFIG_BUILDTIME_EXTABLE_SORT=y

#
# General setup
#
CONFIG_INIT_ENV_ARG_LIMIT=32
CONFIG_CROSS_COMPILE=""
# CONFIG_COMPILE_TEST is not set
CONFIG_LOCALVERSION=""
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_HAVE_KERNEL_GZIP=y
CONFIG_HAVE_KERNEL_BZIP2=y
CONFIG_HAVE_KERNEL_LZMA=y
CONFIG_HAVE_KERNEL_XZ=y
CONFIG_HAVE_KERNEL_LZO=y
CONFIG_HAVE_KERNEL_LZ4=y
# CONFIG_KERNEL_GZIP is not set
# CONFIG_KERNEL_BZIP2 is not set
# CONFIG_KERNEL_LZMA is not set
CONFIG_KERNEL_XZ=y
# CONFIG_KERNEL_LZO is not set
# CONFIG_KERNEL_LZ4 is not set
CONFIG_DEFAULT_HOSTNAME="(none)"
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
CONFIG_SYSVIPC_SYSCTL=y
CONFIG_POSIX_MQUEUE=y
CONFIG_POSIX_MQUEUE_SYSCTL=y
CONFIG_CROSS_MEMORY_ATTACH=y
CONFIG_FHANDLE=y
CONFIG_USELIB=y
CONFIG_AUDIT=y
CONFIG_HAVE_ARCH_AUDITSYSCALL=y
CONFIG_AUDITSYSCALL=y
CONFIG_AUDIT_WATCH=y
CONFIG_AUDIT_TREE=y

#
# IRQ subsystem
#
CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_GENERIC_IRQ_SHOW=y
CONFIG_GENERIC_IRQ_LEGACY_ALLOC_HWIRQ=y
CONFIG_GENERIC_PENDING_IRQ=y
CONFIG_GENERIC_IRQ_CHIP=y
CONFIG_IRQ_DOMAIN=y
CONFIG_GENERIC_MSI_IRQ=y
# CONFIG_IRQ_DOMAIN_DEBUG is not set
CONFIG_IRQ_FORCED_THREADING=y
CONFIG_SPARSE_IRQ=y
CONFIG_CLOCKSOURCE_WATCHDOG=y
CONFIG_ARCH_CLOCKSOURCE_DATA=y
CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y
CONFIG_GENERIC_TIME_VSYSCALL=y
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y
CONFIG_GENERIC_CMOS_UPDATE=y

#
# Timers subsystem
#
CONFIG_TICK_ONESHOT=y
CONFIG_NO_HZ_COMMON=y
# CONFIG_HZ_PERIODIC is not set
CONFIG_NO_HZ_IDLE=y
# CONFIG_NO_HZ_FULL is not set
# CONFIG_NO_HZ is not set
CONFIG_HIGH_RES_TIMERS=y

#
# CPU/Task time and stats accounting
#
CONFIG_TICK_CPU_ACCOUNTING=y
# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set
# CONFIG_IRQ_TIME_ACCOUNTING is not set
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_BSD_PROCESS_ACCT_V3=y
CONFIG_TASKSTATS=y
CONFIG_TASK_DELAY_ACCT=y
CONFIG_TASK_XACCT=y
CONFIG_TASK_IO_ACCOUNTING=y

#
# RCU Subsystem
#
CONFIG_TREE_RCU=y
CONFIG_SRCU=y
# CONFIG_TASKS_RCU is not set
CONFIG_RCU_STALL_COMMON=y
# CONFIG_RCU_USER_QS is not set
CONFIG_RCU_FANOUT=64
CONFIG_RCU_FANOUT_LEAF=16
# CONFIG_RCU_FANOUT_EXACT is not set
CONFIG_RCU_FAST_NO_HZ=y
# CONFIG_TREE_RCU_TRACE is not set
CONFIG_RCU_KTHREAD_PRIO=0
# CONFIG_RCU_NOCB_CPU is not set
# CONFIG_RCU_EXPEDITE_BOOT is not set
CONFIG_BUILD_BIN2C=y
# CONFIG_IKCONFIG is not set
CONFIG_LOG_BUF_SHIFT=17
CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
CONFIG_ARCH_SUPPORTS_INT128=y
CONFIG_NUMA_BALANCING=y
# CONFIG_NUMA_BALANCING_DEFAULT_ENABLED is not set
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CPUSETS=y
CONFIG_PROC_PID_CPUSET=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_PAGE_COUNTER=y
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
# CONFIG_MEMCG_SWAP_ENABLED is not set
# CONFIG_MEMCG_KMEM is not set
# CONFIG_CGROUP_HUGETLB is not set
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_FAIR_GROUP_SCHED=y
# CONFIG_CFS_BANDWIDTH is not set
# CONFIG_RT_GROUP_SCHED is not set
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_CHECKPOINT_RESTORE=y
CONFIG_NAMESPACES=y
CONFIG_UTS_NS=y
CONFIG_IPC_NS=y
CONFIG_USER_NS=y
CONFIG_PID_NS=y
CONFIG_NET_NS=y
CONFIG_SCHED_AUTOGROUP=y
# CONFIG_SYSFS_DEPRECATED is not set
CONFIG_RELAY=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""
CONFIG_RD_GZIP=y
CONFIG_RD_BZIP2=y
CONFIG_RD_LZMA=y
CONFIG_RD_XZ=y
CONFIG_RD_LZO=y
CONFIG_RD_LZ4=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
CONFIG_SYSCTL=y
CONFIG_ANON_INODES=y
CONFIG_HAVE_UID16=y
CONFIG_SYSCTL_EXCEPTION_TRACE=y
CONFIG_HAVE_PCSPKR_PLATFORM=y
CONFIG_BPF=y
CONFIG_EXPERT=y
CONFIG_UID16=y
CONFIG_MULTIUSER=y
CONFIG_SGETMASK_SYSCALL=y
CONFIG_SYSFS_SYSCALL=y
# CONFIG_SYSCTL_SYSCALL is not set
CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_ALL is not set
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_ELF_CORE=y
CONFIG_PCSPKR_PLATFORM=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y
CONFIG_EPOLL=y
CONFIG_SIGNALFD=y
CONFIG_TIMERFD=y
CONFIG_EVENTFD=y
# CONFIG_BPF_SYSCALL is not set
CONFIG_SHMEM=y
CONFIG_AIO=y
CONFIG_ADVISE_SYSCALLS=y
CONFIG_PCI_QUIRKS=y
# CONFIG_EMBEDDED is not set
CONFIG_HAVE_PERF_EVENTS=y

#
# Kernel Performance Events And Counters
#
CONFIG_PERF_EVENTS=y
# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
CONFIG_VM_EVENT_COUNTERS=y
# CONFIG_COMPAT_BRK is not set
CONFIG_SLAB=y
# CONFIG_SLUB is not set
# CONFIG_SLOB is not set
# CONFIG_SYSTEM_TRUSTED_KEYRING is not set
CONFIG_PROFILING=y
CONFIG_TRACEPOINTS=y
CONFIG_OPROFILE=m
# CONFIG_OPROFILE_EVENT_MULTIPLEX is not set
CONFIG_HAVE_OPROFILE=y
CONFIG_OPROFILE_NMI_TIMER=y
CONFIG_KPROBES=y
CONFIG_JUMP_LABEL=y
CONFIG_OPTPROBES=y
CONFIG_KPROBES_ON_FTRACE=y
CONFIG_UPROBES=y
# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
CONFIG_ARCH_USE_BUILTIN_BSWAP=y
CONFIG_KRETPROBES=y
CONFIG_USER_RETURN_NOTIFIER=y
CONFIG_HAVE_IOREMAP_PROT=y
CONFIG_HAVE_KPROBES=y
CONFIG_HAVE_KRETPROBES=y
CONFIG_HAVE_OPTPROBES=y
CONFIG_HAVE_KPROBES_ON_FTRACE=y
CONFIG_HAVE_ARCH_TRACEHOOK=y
CONFIG_HAVE_DMA_ATTRS=y
CONFIG_HAVE_DMA_CONTIGUOUS=y
CONFIG_GENERIC_SMP_IDLE_THREAD=y
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
CONFIG_HAVE_CLK=y
CONFIG_HAVE_DMA_API_DEBUG=y
CONFIG_HAVE_HW_BREAKPOINT=y
CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y
CONFIG_HAVE_USER_RETURN_NOTIFIER=y
CONFIG_HAVE_PERF_EVENTS_NMI=y
CONFIG_HAVE_PERF_REGS=y
CONFIG_HAVE_PERF_USER_STACK_DUMP=y
CONFIG_HAVE_ARCH_JUMP_LABEL=y
CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
CONFIG_HAVE_CMPXCHG_LOCAL=y
CONFIG_HAVE_CMPXCHG_DOUBLE=y
CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y
CONFIG_ARCH_WANT_OLD_COMPAT_IPC=y
CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
CONFIG_SECCOMP_FILTER=y
CONFIG_HAVE_CC_STACKPROTECTOR=y
CONFIG_CC_STACKPROTECTOR=y
# CONFIG_CC_STACKPROTECTOR_NONE is not set
CONFIG_CC_STACKPROTECTOR_REGULAR=y
# CONFIG_CC_STACKPROTECTOR_STRONG is not set
CONFIG_HAVE_CONTEXT_TRACKING=y
CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
CONFIG_HAVE_ARCH_HUGE_VMAP=y
CONFIG_HAVE_ARCH_SOFT_DIRTY=y
CONFIG_MODULES_USE_ELF_RELA=y
CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y
CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
CONFIG_OLD_SIGSUSPEND3=y
CONFIG_COMPAT_OLD_SIGACTION=y

#
# GCOV-based kernel profiling
#
# CONFIG_GCOV_KERNEL is not set
CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
CONFIG_SLABINFO=y
CONFIG_RT_MUTEXES=y
CONFIG_BASE_SMALL=0
CONFIG_MODULES=y
CONFIG_MODULE_FORCE_LOAD=y
CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_FORCE_UNLOAD=y
CONFIG_MODVERSIONS=y
# CONFIG_MODULE_SRCVERSION_ALL is not set
# CONFIG_MODULE_SIG is not set
# CONFIG_MODULE_COMPRESS is not set
CONFIG_STOP_MACHINE=y
CONFIG_BLOCK=y
CONFIG_BLK_DEV_BSG=y
CONFIG_BLK_DEV_BSGLIB=y
CONFIG_BLK_DEV_INTEGRITY=y
CONFIG_BLK_DEV_THROTTLING=y
# CONFIG_BLK_CMDLINE_PARSER is not set

#
# Partition Types
#
CONFIG_PARTITION_ADVANCED=y
CONFIG_ACORN_PARTITION=y
# CONFIG_ACORN_PARTITION_CUMANA is not set
# CONFIG_ACORN_PARTITION_EESOX is not set
CONFIG_ACORN_PARTITION_ICS=y
# CONFIG_ACORN_PARTITION_ADFS is not set
# CONFIG_ACORN_PARTITION_POWERTEC is not set
CONFIG_ACORN_PARTITION_RISCIX=y
# CONFIG_AIX_PARTITION is not set
CONFIG_OSF_PARTITION=y
CONFIG_AMIGA_PARTITION=y
CONFIG_ATARI_PARTITION=y
CONFIG_MAC_PARTITION=y
CONFIG_MSDOS_PARTITION=y
CONFIG_BSD_DISKLABEL=y
CONFIG_MINIX_SUBPARTITION=y
CONFIG_SOLARIS_X86_PARTITION=y
CONFIG_UNIXWARE_DISKLABEL=y
CONFIG_LDM_PARTITION=y
# CONFIG_LDM_DEBUG is not set
CONFIG_SGI_PARTITION=y
CONFIG_ULTRIX_PARTITION=y
CONFIG_SUN_PARTITION=y
CONFIG_KARMA_PARTITION=y
CONFIG_EFI_PARTITION=y
# CONFIG_SYSV68_PARTITION is not set
# CONFIG_CMDLINE_PARTITION is not set
CONFIG_BLOCK_COMPAT=y

#
# IO Schedulers
#
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
CONFIG_CFQ_GROUP_IOSCHED=y
# CONFIG_DEFAULT_DEADLINE is not set
CONFIG_DEFAULT_CFQ=y
# CONFIG_DEFAULT_NOOP is not set
CONFIG_DEFAULT_IOSCHED="cfq"
CONFIG_PREEMPT_NOTIFIERS=y
CONFIG_PADATA=y
CONFIG_UNINLINE_SPIN_UNLOCK=y
CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
CONFIG_INLINE_READ_UNLOCK=y
CONFIG_INLINE_READ_UNLOCK_IRQ=y
CONFIG_INLINE_WRITE_UNLOCK=y
CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
CONFIG_MUTEX_SPIN_ON_OWNER=y
CONFIG_RWSEM_SPIN_ON_OWNER=y
CONFIG_LOCK_SPIN_ON_OWNER=y
CONFIG_ARCH_USE_QUEUE_RWLOCK=y
CONFIG_QUEUE_RWLOCK=y
CONFIG_FREEZER=y

#
# Processor type and features
#
CONFIG_ZONE_DMA=y
CONFIG_SMP=y
CONFIG_X86_FEATURE_NAMES=y
CONFIG_X86_X2APIC=y
CONFIG_X86_MPPARSE=y
# CONFIG_X86_EXTENDED_PLATFORM is not set
CONFIG_X86_INTEL_LPSS=y
# CONFIG_X86_AMD_PLATFORM_DEVICE is not set
CONFIG_IOSF_MBI=m
# CONFIG_IOSF_MBI_DEBUG is not set
CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y
CONFIG_SCHED_OMIT_FRAME_POINTER=y
CONFIG_HYPERVISOR_GUEST=y
CONFIG_PARAVIRT=y
# CONFIG_PARAVIRT_DEBUG is not set
CONFIG_PARAVIRT_SPINLOCKS=y
CONFIG_XEN=y
CONFIG_XEN_DOM0=y
CONFIG_XEN_PVHVM=y
CONFIG_XEN_MAX_DOMAIN_MEMORY=500
CONFIG_XEN_SAVE_RESTORE=y
# CONFIG_XEN_DEBUG_FS is not set
CONFIG_XEN_PVH=y
CONFIG_KVM_GUEST=y
# CONFIG_KVM_DEBUG_FS is not set
# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set
CONFIG_PARAVIRT_CLOCK=y
CONFIG_NO_BOOTMEM=y
# CONFIG_MK8 is not set
# CONFIG_MPSC is not set
# CONFIG_MCORE2 is not set
# CONFIG_MATOM is not set
CONFIG_GENERIC_CPU=y
CONFIG_X86_INTERNODE_CACHE_SHIFT=6
CONFIG_X86_L1_CACHE_SHIFT=6
CONFIG_X86_TSC=y
CONFIG_X86_CMPXCHG64=y
CONFIG_X86_CMOV=y
CONFIG_X86_MINIMUM_CPU_FAMILY=64
CONFIG_X86_DEBUGCTLMSR=y
# CONFIG_PROCESSOR_SELECT is not set
CONFIG_CPU_SUP_INTEL=y
CONFIG_CPU_SUP_AMD=y
CONFIG_CPU_SUP_CENTAUR=y
CONFIG_HPET_TIMER=y
CONFIG_HPET_EMULATE_RTC=y
CONFIG_DMI=y
CONFIG_GART_IOMMU=y
CONFIG_CALGARY_IOMMU=y
CONFIG_CALGARY_IOMMU_ENABLED_BY_DEFAULT=y
CONFIG_SWIOTLB=y
CONFIG_IOMMU_HELPER=y
# CONFIG_MAXSMP is not set
CONFIG_NR_CPUS=512
CONFIG_SCHED_SMT=y
CONFIG_SCHED_MC=y
# CONFIG_PREEMPT_NONE is not set
CONFIG_PREEMPT_VOLUNTARY=y
# CONFIG_PREEMPT is not set
CONFIG_X86_LOCAL_APIC=y
CONFIG_X86_IO_APIC=y
CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
CONFIG_X86_MCE=y
CONFIG_X86_MCE_INTEL=y
CONFIG_X86_MCE_AMD=y
CONFIG_X86_MCE_THRESHOLD=y
CONFIG_X86_MCE_INJECT=m
CONFIG_X86_THERMAL_VECTOR=y
CONFIG_X86_16BIT=y
CONFIG_X86_ESPFIX64=y
CONFIG_X86_VSYSCALL_EMULATION=y
CONFIG_I8K=m
CONFIG_MICROCODE=y
CONFIG_MICROCODE_INTEL=y
CONFIG_MICROCODE_AMD=y
CONFIG_MICROCODE_OLD_INTERFACE=y
CONFIG_MICROCODE_INTEL_EARLY=y
CONFIG_MICROCODE_AMD_EARLY=y
CONFIG_MICROCODE_EARLY=y
CONFIG_X86_MSR=m
CONFIG_X86_CPUID=m
CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
CONFIG_ARCH_DMA_ADDR_T_64BIT=y
CONFIG_X86_DIRECT_GBPAGES=y
CONFIG_NUMA=y
CONFIG_AMD_NUMA=y
CONFIG_X86_64_ACPI_NUMA=y
CONFIG_NODES_SPAN_OTHER_NODES=y
CONFIG_NUMA_EMU=y
CONFIG_NODES_SHIFT=6
CONFIG_ARCH_SPARSEMEM_ENABLE=y
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
# CONFIG_ARCH_MEMORY_PROBE is not set
CONFIG_ARCH_PROC_KCORE_TEXT=y
CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
CONFIG_SELECT_MEMORY_MODEL=y
CONFIG_SPARSEMEM_MANUAL=y
CONFIG_SPARSEMEM=y
CONFIG_NEED_MULTIPLE_NODES=y
CONFIG_HAVE_MEMORY_PRESENT=y
CONFIG_SPARSEMEM_EXTREME=y
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
CONFIG_SPARSEMEM_ALLOC_MEM_MAP_TOGETHER=y
CONFIG_SPARSEMEM_VMEMMAP=y
CONFIG_HAVE_MEMBLOCK=y
CONFIG_HAVE_MEMBLOCK_NODE_MAP=y
CONFIG_ARCH_DISCARD_MEMBLOCK=y
CONFIG_MEMORY_ISOLATION=y
# CONFIG_MOVABLE_NODE is not set
CONFIG_HAVE_BOOTMEM_INFO_NODE=y
CONFIG_MEMORY_HOTPLUG=y
CONFIG_MEMORY_HOTPLUG_SPARSE=y
CONFIG_MEMORY_HOTREMOVE=y
CONFIG_PAGEFLAGS_EXTENDED=y
CONFIG_SPLIT_PTLOCK_CPUS=4
CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y
CONFIG_MEMORY_BALLOON=y
CONFIG_BALLOON_COMPACTION=y
CONFIG_COMPACTION=y
CONFIG_MIGRATION=y
CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y
CONFIG_PHYS_ADDR_T_64BIT=y
CONFIG_ZONE_DMA_FLAG=1
CONFIG_BOUNCE=y
CONFIG_VIRT_TO_BUS=y
CONFIG_MMU_NOTIFIER=y
CONFIG_KSM=y
CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
CONFIG_MEMORY_FAILURE=y
CONFIG_HWPOISON_INJECT=m
CONFIG_TRANSPARENT_HUGEPAGE=y
# CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS is not set
CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
# CONFIG_CLEANCACHE is not set
CONFIG_FRONTSWAP=y
# CONFIG_CMA is not set
CONFIG_MEM_SOFT_DIRTY=y
CONFIG_ZSWAP=y
CONFIG_ZPOOL=y
CONFIG_ZBUD=m
CONFIG_ZSMALLOC=m
# CONFIG_PGTABLE_MAPPING is not set
# CONFIG_ZSMALLOC_STAT is not set
CONFIG_GENERIC_EARLY_IOREMAP=y
CONFIG_X86_PMEM_LEGACY=y
# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set
CONFIG_X86_RESERVE_LOW=64
CONFIG_MTRR=y
CONFIG_MTRR_SANITIZER=y
CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=0
CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1
CONFIG_X86_PAT=y
CONFIG_ARCH_USES_PG_UNCACHED=y
CONFIG_ARCH_RANDOM=y
CONFIG_X86_SMAP=y
# CONFIG_X86_INTEL_MPX is not set
CONFIG_EFI=y
CONFIG_EFI_STUB=y
CONFIG_EFI_MIXED=y
CONFIG_SECCOMP=y
# CONFIG_HZ_100 is not set
CONFIG_HZ_250=y
# CONFIG_HZ_300 is not set
# CONFIG_HZ_1000 is not set
CONFIG_HZ=250
CONFIG_SCHED_HRTICK=y
CONFIG_KEXEC=y
CONFIG_CRASH_DUMP=y
# CONFIG_KEXEC_JUMP is not set
CONFIG_PHYSICAL_START=0x1000000
CONFIG_RELOCATABLE=y
# CONFIG_RANDOMIZE_BASE is not set
CONFIG_PHYSICAL_ALIGN=0x200000
CONFIG_HOTPLUG_CPU=y
# CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set
# CONFIG_DEBUG_HOTPLUG_CPU0 is not set
# CONFIG_COMPAT_VDSO is not set
# CONFIG_CMDLINE_BOOL is not set
CONFIG_HAVE_LIVEPATCH=y
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
CONFIG_USE_PERCPU_NUMA_NODE_ID=y

#
# Power management and ACPI options
#
CONFIG_ARCH_HIBERNATION_HEADER=y
CONFIG_SUSPEND=y
CONFIG_SUSPEND_FREEZER=y
CONFIG_HIBERNATE_CALLBACKS=y
CONFIG_HIBERNATION=y
CONFIG_PM_STD_PARTITION=""
CONFIG_PM_SLEEP=y
CONFIG_PM_SLEEP_SMP=y
# CONFIG_PM_AUTOSLEEP is not set
# CONFIG_PM_WAKELOCKS is not set
CONFIG_PM=y
CONFIG_PM_DEBUG=y
CONFIG_PM_ADVANCED_DEBUG=y
# CONFIG_PM_TEST_SUSPEND is not set
CONFIG_PM_SLEEP_DEBUG=y
# CONFIG_DPM_WATCHDOG is not set
# CONFIG_PM_TRACE_RTC is not set
CONFIG_PM_CLK=y
# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set
CONFIG_ACPI=y
CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y
CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y
CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y
CONFIG_ACPI_SLEEP=y
# CONFIG_ACPI_PROCFS_POWER is not set
# CONFIG_ACPI_EC_DEBUGFS is not set
CONFIG_ACPI_AC=m
CONFIG_ACPI_BATTERY=m
CONFIG_ACPI_BUTTON=m
CONFIG_ACPI_VIDEO=m
CONFIG_ACPI_FAN=m
CONFIG_ACPI_DOCK=y
CONFIG_ACPI_PROCESSOR=m
CONFIG_ACPI_IPMI=m
CONFIG_ACPI_HOTPLUG_CPU=y
CONFIG_ACPI_PROCESSOR_AGGREGATOR=m
CONFIG_ACPI_THERMAL=m
CONFIG_ACPI_NUMA=y
# CONFIG_ACPI_CUSTOM_DSDT is not set
CONFIG_ACPI_INITRD_TABLE_OVERRIDE=y
# CONFIG_ACPI_DEBUG is not set
CONFIG_ACPI_PCI_SLOT=y
CONFIG_X86_PM_TIMER=y
CONFIG_ACPI_CONTAINER=y
CONFIG_ACPI_HOTPLUG_MEMORY=y
CONFIG_ACPI_HOTPLUG_IOAPIC=y
CONFIG_ACPI_SBS=m
CONFIG_ACPI_HED=y
# CONFIG_ACPI_CUSTOM_METHOD is not set
CONFIG_ACPI_BGRT=y
# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set
CONFIG_HAVE_ACPI_APEI=y
CONFIG_HAVE_ACPI_APEI_NMI=y
CONFIG_ACPI_APEI=y
CONFIG_ACPI_APEI_GHES=y
CONFIG_ACPI_APEI_PCIEAER=y
CONFIG_ACPI_APEI_MEMORY_FAILURE=y
# CONFIG_ACPI_APEI_EINJ is not set
# CONFIG_ACPI_APEI_ERST_DEBUG is not set
CONFIG_ACPI_EXTLOG=y
# CONFIG_PMIC_OPREGION is not set
CONFIG_SFI=y

#
# CPU Frequency scaling
#
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_GOV_COMMON=y
CONFIG_CPU_FREQ_STAT=m
# CONFIG_CPU_FREQ_STAT_DETAILS is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
CONFIG_CPU_FREQ_GOV_USERSPACE=m
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m

#
# CPU frequency scaling drivers
#
CONFIG_X86_INTEL_PSTATE=y
CONFIG_X86_PCC_CPUFREQ=m
CONFIG_X86_ACPI_CPUFREQ=m
CONFIG_X86_ACPI_CPUFREQ_CPB=y
CONFIG_X86_POWERNOW_K8=m
CONFIG_X86_AMD_FREQ_SENSITIVITY=m
CONFIG_X86_SPEEDSTEP_CENTRINO=m
CONFIG_X86_P4_CLOCKMOD=m

#
# shared options
#
CONFIG_X86_SPEEDSTEP_LIB=m

#
# CPU Idle
#
CONFIG_CPU_IDLE=y
CONFIG_CPU_IDLE_GOV_LADDER=y
CONFIG_CPU_IDLE_GOV_MENU=y
# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set
CONFIG_INTEL_IDLE=y

#
# Memory power savings
#
CONFIG_I7300_IDLE_IOAT_CHANNEL=y
CONFIG_I7300_IDLE=m

#
# Bus options (PCI etc.)
#
CONFIG_PCI=y
CONFIG_PCI_DIRECT=y
CONFIG_PCI_MMCONFIG=y
CONFIG_PCI_XEN=y
CONFIG_PCI_DOMAINS=y
# CONFIG_PCI_CNB20LE_QUIRK is not set
CONFIG_PCIEPORTBUS=y
CONFIG_HOTPLUG_PCI_PCIE=y
CONFIG_PCIEAER=y
# CONFIG_PCIE_ECRC is not set
CONFIG_PCIEAER_INJECT=m
CONFIG_PCIEASPM=y
# CONFIG_PCIEASPM_DEBUG is not set
CONFIG_PCIEASPM_DEFAULT=y
# CONFIG_PCIEASPM_POWERSAVE is not set
# CONFIG_PCIEASPM_PERFORMANCE is not set
CONFIG_PCIE_PME=y
CONFIG_PCI_BUS_ADDR_T_64BIT=y
CONFIG_PCI_MSI=y
# CONFIG_PCI_DEBUG is not set
CONFIG_PCI_REALLOC_ENABLE_AUTO=y
CONFIG_PCI_STUB=m
CONFIG_XEN_PCIDEV_FRONTEND=m
CONFIG_HT_IRQ=y
CONFIG_PCI_ATS=y
CONFIG_PCI_IOV=y
CONFIG_PCI_PRI=y
CONFIG_PCI_PASID=y
CONFIG_PCI_LABEL=y

#
# PCI host controller drivers
#
CONFIG_ISA_DMA_API=y
CONFIG_AMD_NB=y
CONFIG_PCCARD=m
CONFIG_PCMCIA=m
CONFIG_PCMCIA_LOAD_CIS=y
CONFIG_CARDBUS=y

#
# PC-card bridges
#
CONFIG_YENTA=m
CONFIG_YENTA_O2=y
CONFIG_YENTA_RICOH=y
CONFIG_YENTA_TI=y
CONFIG_YENTA_ENE_TUNE=y
CONFIG_YENTA_TOSHIBA=y
CONFIG_PD6729=m
CONFIG_I82092=m
CONFIG_PCCARD_NONSTATIC=y
CONFIG_HOTPLUG_PCI=y
CONFIG_HOTPLUG_PCI_ACPI=y
CONFIG_HOTPLUG_PCI_ACPI_IBM=m
CONFIG_HOTPLUG_PCI_CPCI=y
CONFIG_HOTPLUG_PCI_CPCI_ZT5550=m
CONFIG_HOTPLUG_PCI_CPCI_GENERIC=m
CONFIG_HOTPLUG_PCI_SHPC=m
# CONFIG_RAPIDIO is not set
CONFIG_X86_SYSFB=y

#
# Executable file formats / Emulations
#
CONFIG_BINFMT_ELF=y
CONFIG_COMPAT_BINFMT_ELF=y
CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
CONFIG_BINFMT_SCRIPT=y
# CONFIG_HAVE_AOUT is not set
CONFIG_BINFMT_MISC=m
CONFIG_COREDUMP=y
CONFIG_IA32_EMULATION=y
CONFIG_IA32_AOUT=y
CONFIG_X86_X32=y
CONFIG_COMPAT=y
CONFIG_COMPAT_FOR_U64_ALIGNMENT=y
CONFIG_SYSVIPC_COMPAT=y
CONFIG_KEYS_COMPAT=y
CONFIG_X86_DEV_DMA_OPS=y
CONFIG_PMC_ATOM=y
CONFIG_NET=y
CONFIG_COMPAT_NETLINK_MESSAGES=y

#
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_DIAG=m
CONFIG_UNIX=y
CONFIG_UNIX_DIAG=m
CONFIG_XFRM=y
CONFIG_XFRM_ALGO=m
CONFIG_XFRM_USER=m
CONFIG_XFRM_SUB_POLICY=y
CONFIG_XFRM_MIGRATE=y
# CONFIG_XFRM_STATISTICS is not set
CONFIG_XFRM_IPCOMP=m
CONFIG_NET_KEY=m
CONFIG_NET_KEY_MIGRATE=y
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_IP_FIB_TRIE_STATS=y
CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_ROUTE_MULTIPATH=y
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_ROUTE_CLASSID=y
# CONFIG_IP_PNP is not set
CONFIG_NET_IPIP=m
CONFIG_NET_IPGRE_DEMUX=m
CONFIG_NET_IP_TUNNEL=m
CONFIG_NET_IPGRE=m
CONFIG_NET_IPGRE_BROADCAST=y
CONFIG_IP_MROUTE=y
CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
CONFIG_IP_PIMSM_V1=y
CONFIG_IP_PIMSM_V2=y
CONFIG_SYN_COOKIES=y
CONFIG_NET_IPVTI=m
CONFIG_NET_UDP_TUNNEL=m
CONFIG_NET_FOU=m
CONFIG_NET_FOU_IP_TUNNELS=y
CONFIG_GENEVE=m
CONFIG_INET_AH=m
CONFIG_INET_ESP=m
CONFIG_INET_IPCOMP=m
CONFIG_INET_XFRM_TUNNEL=m
CONFIG_INET_TUNNEL=m
CONFIG_INET_XFRM_MODE_TRANSPORT=m
CONFIG_INET_XFRM_MODE_TUNNEL=m
CONFIG_INET_XFRM_MODE_BEET=m
CONFIG_INET_LRO=m
CONFIG_INET_DIAG=m
CONFIG_INET_TCP_DIAG=m
CONFIG_INET_UDP_DIAG=m
CONFIG_TCP_CONG_ADVANCED=y
CONFIG_TCP_CONG_BIC=m
CONFIG_TCP_CONG_CUBIC=y
CONFIG_TCP_CONG_WESTWOOD=m
CONFIG_TCP_CONG_HTCP=m
CONFIG_TCP_CONG_HSTCP=m
CONFIG_TCP_CONG_HYBLA=m
CONFIG_TCP_CONG_VEGAS=m
CONFIG_TCP_CONG_SCALABLE=m
CONFIG_TCP_CONG_LP=m
CONFIG_TCP_CONG_VENO=m
CONFIG_TCP_CONG_YEAH=m
CONFIG_TCP_CONG_ILLINOIS=m
CONFIG_TCP_CONG_DCTCP=m
CONFIG_DEFAULT_CUBIC=y
# CONFIG_DEFAULT_RENO is not set
CONFIG_DEFAULT_TCP_CONG="cubic"
CONFIG_TCP_MD5SIG=y
CONFIG_IPV6=y
CONFIG_IPV6_ROUTER_PREF=y
CONFIG_IPV6_ROUTE_INFO=y
CONFIG_IPV6_OPTIMISTIC_DAD=y
CONFIG_INET6_AH=m
CONFIG_INET6_ESP=m
CONFIG_INET6_IPCOMP=m
CONFIG_IPV6_MIP6=y
CONFIG_INET6_XFRM_TUNNEL=m
CONFIG_INET6_TUNNEL=m
CONFIG_INET6_XFRM_MODE_TRANSPORT=m
CONFIG_INET6_XFRM_MODE_TUNNEL=m
CONFIG_INET6_XFRM_MODE_BEET=m
CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m
CONFIG_IPV6_VTI=m
CONFIG_IPV6_SIT=m
CONFIG_IPV6_SIT_6RD=y
CONFIG_IPV6_NDISC_NODETYPE=y
CONFIG_IPV6_TUNNEL=m
CONFIG_IPV6_GRE=m
CONFIG_IPV6_MULTIPLE_TABLES=y
CONFIG_IPV6_SUBTREES=y
CONFIG_IPV6_MROUTE=y
CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y
CONFIG_IPV6_PIMSM_V2=y
# CONFIG_NETLABEL is not set
CONFIG_NETWORK_SECMARK=y
CONFIG_NET_PTP_CLASSIFY=y
# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
CONFIG_NETFILTER_ADVANCED=y
CONFIG_BRIDGE_NETFILTER=m

#
# Core Netfilter Configuration
#
CONFIG_NETFILTER_NETLINK=m
CONFIG_NETFILTER_NETLINK_ACCT=m
CONFIG_NETFILTER_NETLINK_QUEUE=m
CONFIG_NETFILTER_NETLINK_LOG=m
CONFIG_NF_CONNTRACK=m
CONFIG_NF_LOG_COMMON=m
CONFIG_NF_CONNTRACK_MARK=y
CONFIG_NF_CONNTRACK_SECMARK=y
CONFIG_NF_CONNTRACK_ZONES=y
CONFIG_NF_CONNTRACK_PROCFS=y
CONFIG_NF_CONNTRACK_EVENTS=y
CONFIG_NF_CONNTRACK_TIMEOUT=y
CONFIG_NF_CONNTRACK_TIMESTAMP=y
CONFIG_NF_CONNTRACK_LABELS=y
CONFIG_NF_CT_PROTO_DCCP=m
CONFIG_NF_CT_PROTO_GRE=m
CONFIG_NF_CT_PROTO_SCTP=m
CONFIG_NF_CT_PROTO_UDPLITE=m
CONFIG_NF_CONNTRACK_AMANDA=m
CONFIG_NF_CONNTRACK_FTP=m
CONFIG_NF_CONNTRACK_H323=m
CONFIG_NF_CONNTRACK_IRC=m
CONFIG_NF_CONNTRACK_BROADCAST=m
CONFIG_NF_CONNTRACK_NETBIOS_NS=m
CONFIG_NF_CONNTRACK_SNMP=m
CONFIG_NF_CONNTRACK_PPTP=m
CONFIG_NF_CONNTRACK_SANE=m
CONFIG_NF_CONNTRACK_SIP=m
CONFIG_NF_CONNTRACK_TFTP=m
CONFIG_NF_CT_NETLINK=m
CONFIG_NF_CT_NETLINK_TIMEOUT=m
CONFIG_NF_CT_NETLINK_HELPER=m
CONFIG_NETFILTER_NETLINK_QUEUE_CT=y
CONFIG_NF_NAT=m
CONFIG_NF_NAT_NEEDED=y
CONFIG_NF_NAT_PROTO_DCCP=m
CONFIG_NF_NAT_PROTO_UDPLITE=m
CONFIG_NF_NAT_PROTO_SCTP=m
CONFIG_NF_NAT_AMANDA=m
CONFIG_NF_NAT_FTP=m
CONFIG_NF_NAT_IRC=m
CONFIG_NF_NAT_SIP=m
CONFIG_NF_NAT_TFTP=m
CONFIG_NF_NAT_REDIRECT=m
CONFIG_NETFILTER_SYNPROXY=m
CONFIG_NF_TABLES=m
CONFIG_NF_TABLES_INET=m
CONFIG_NFT_EXTHDR=m
CONFIG_NFT_META=m
CONFIG_NFT_CT=m
CONFIG_NFT_RBTREE=m
CONFIG_NFT_HASH=m
CONFIG_NFT_COUNTER=m
CONFIG_NFT_LOG=m
CONFIG_NFT_LIMIT=m
CONFIG_NFT_MASQ=m
CONFIG_NFT_REDIR=m
CONFIG_NFT_NAT=m
CONFIG_NFT_QUEUE=m
CONFIG_NFT_REJECT=m
CONFIG_NFT_REJECT_INET=m
CONFIG_NFT_COMPAT=m
CONFIG_NETFILTER_XTABLES=m

#
# Xtables combined modules
#
CONFIG_NETFILTER_XT_MARK=m
CONFIG_NETFILTER_XT_CONNMARK=m
CONFIG_NETFILTER_XT_SET=m

#
# Xtables targets
#
CONFIG_NETFILTER_XT_TARGET_AUDIT=m
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m
CONFIG_NETFILTER_XT_TARGET_CT=m
CONFIG_NETFILTER_XT_TARGET_DSCP=m
CONFIG_NETFILTER_XT_TARGET_HL=m
CONFIG_NETFILTER_XT_TARGET_HMARK=m
CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m
CONFIG_NETFILTER_XT_TARGET_LED=m
CONFIG_NETFILTER_XT_TARGET_LOG=m
CONFIG_NETFILTER_XT_TARGET_MARK=m
CONFIG_NETFILTER_XT_NAT=m
CONFIG_NETFILTER_XT_TARGET_NETMAP=m
CONFIG_NETFILTER_XT_TARGET_NFLOG=m
CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set
CONFIG_NETFILTER_XT_TARGET_RATEEST=m
CONFIG_NETFILTER_XT_TARGET_REDIRECT=m
CONFIG_NETFILTER_XT_TARGET_TEE=m
CONFIG_NETFILTER_XT_TARGET_TPROXY=m
CONFIG_NETFILTER_XT_TARGET_TRACE=m
CONFIG_NETFILTER_XT_TARGET_SECMARK=m
CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m

#
# Xtables matches
#
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
CONFIG_NETFILTER_XT_MATCH_BPF=m
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NETFILTER_XT_MATCH_CLUSTER=m
CONFIG_NETFILTER_XT_MATCH_COMMENT=m
CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m
CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
CONFIG_NETFILTER_XT_MATCH_CPU=m
CONFIG_NETFILTER_XT_MATCH_DCCP=m
CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m
CONFIG_NETFILTER_XT_MATCH_DSCP=m
CONFIG_NETFILTER_XT_MATCH_ECN=m
CONFIG_NETFILTER_XT_MATCH_ESP=m
CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
CONFIG_NETFILTER_XT_MATCH_HELPER=m
CONFIG_NETFILTER_XT_MATCH_HL=m
CONFIG_NETFILTER_XT_MATCH_IPCOMP=m
CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
CONFIG_NETFILTER_XT_MATCH_IPVS=m
CONFIG_NETFILTER_XT_MATCH_L2TP=m
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
CONFIG_NETFILTER_XT_MATCH_LIMIT=m
CONFIG_NETFILTER_XT_MATCH_MAC=m
CONFIG_NETFILTER_XT_MATCH_MARK=m
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
CONFIG_NETFILTER_XT_MATCH_NFACCT=m
CONFIG_NETFILTER_XT_MATCH_OSF=m
CONFIG_NETFILTER_XT_MATCH_OWNER=m
CONFIG_NETFILTER_XT_MATCH_POLICY=m
CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
CONFIG_NETFILTER_XT_MATCH_QUOTA=m
CONFIG_NETFILTER_XT_MATCH_RATEEST=m
CONFIG_NETFILTER_XT_MATCH_REALM=m
CONFIG_NETFILTER_XT_MATCH_RECENT=m
CONFIG_NETFILTER_XT_MATCH_SCTP=m
CONFIG_NETFILTER_XT_MATCH_SOCKET=m
CONFIG_NETFILTER_XT_MATCH_STATE=m
CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
CONFIG_NETFILTER_XT_MATCH_STRING=m
CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
CONFIG_NETFILTER_XT_MATCH_TIME=m
CONFIG_NETFILTER_XT_MATCH_U32=m
CONFIG_IP_SET=m
CONFIG_IP_SET_MAX=256
CONFIG_IP_SET_BITMAP_IP=m
CONFIG_IP_SET_BITMAP_IPMAC=m
CONFIG_IP_SET_BITMAP_PORT=m
CONFIG_IP_SET_HASH_IP=m
CONFIG_IP_SET_HASH_IPMARK=m
CONFIG_IP_SET_HASH_IPPORT=m
CONFIG_IP_SET_HASH_IPPORTIP=m
CONFIG_IP_SET_HASH_IPPORTNET=m
CONFIG_IP_SET_HASH_MAC=m
CONFIG_IP_SET_HASH_NETPORTNET=m
CONFIG_IP_SET_HASH_NET=m
CONFIG_IP_SET_HASH_NETNET=m
CONFIG_IP_SET_HASH_NETPORT=m
CONFIG_IP_SET_HASH_NETIFACE=m
CONFIG_IP_SET_LIST_SET=m
CONFIG_IP_VS=m
CONFIG_IP_VS_IPV6=y
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12

#
# IPVS transport protocol load balancing support
#
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y

#
# IPVS scheduler
#
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_FO=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m

#
# IPVS SH scheduler
#
CONFIG_IP_VS_SH_TAB_BITS=8

#
# IPVS application helper
#
CONFIG_IP_VS_FTP=m
CONFIG_IP_VS_NFCT=y
CONFIG_IP_VS_PE_SIP=m

#
# IP: Netfilter Configuration
#
CONFIG_NF_DEFRAG_IPV4=m
CONFIG_NF_CONNTRACK_IPV4=m
CONFIG_NF_CONNTRACK_PROC_COMPAT=y
CONFIG_NF_TABLES_IPV4=m
CONFIG_NFT_CHAIN_ROUTE_IPV4=m
CONFIG_NFT_REJECT_IPV4=m
CONFIG_NF_TABLES_ARP=m
CONFIG_NF_LOG_ARP=m
CONFIG_NF_LOG_IPV4=m
CONFIG_NF_REJECT_IPV4=m
CONFIG_NF_NAT_IPV4=m
CONFIG_NFT_CHAIN_NAT_IPV4=m
CONFIG_NF_NAT_MASQUERADE_IPV4=m
CONFIG_NFT_MASQ_IPV4=m
# CONFIG_NFT_REDIR_IPV4 is not set
CONFIG_NF_NAT_SNMP_BASIC=m
CONFIG_NF_NAT_PROTO_GRE=m
CONFIG_NF_NAT_PPTP=m
CONFIG_NF_NAT_H323=m
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_MATCH_AH=m
CONFIG_IP_NF_MATCH_ECN=m
CONFIG_IP_NF_MATCH_RPFILTER=m
CONFIG_IP_NF_MATCH_TTL=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_TARGET_SYNPROXY=m
CONFIG_IP_NF_NAT=m
CONFIG_IP_NF_TARGET_MASQUERADE=m
CONFIG_IP_NF_TARGET_NETMAP=m
CONFIG_IP_NF_TARGET_REDIRECT=m
CONFIG_IP_NF_MANGLE=m
CONFIG_IP_NF_TARGET_CLUSTERIP=m
CONFIG_IP_NF_TARGET_ECN=m
CONFIG_IP_NF_TARGET_TTL=m
CONFIG_IP_NF_RAW=m
CONFIG_IP_NF_SECURITY=m
CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m

#
# IPv6: Netfilter Configuration
#
CONFIG_NF_DEFRAG_IPV6=m
CONFIG_NF_CONNTRACK_IPV6=m
CONFIG_NF_TABLES_IPV6=m
CONFIG_NFT_CHAIN_ROUTE_IPV6=m
CONFIG_NFT_REJECT_IPV6=m
CONFIG_NF_REJECT_IPV6=m
CONFIG_NF_LOG_IPV6=m
CONFIG_NF_NAT_IPV6=m
CONFIG_NFT_CHAIN_NAT_IPV6=m
CONFIG_NF_NAT_MASQUERADE_IPV6=m
CONFIG_NFT_MASQ_IPV6=m
# CONFIG_NFT_REDIR_IPV6 is not set
CONFIG_IP6_NF_IPTABLES=m
CONFIG_IP6_NF_MATCH_AH=m
CONFIG_IP6_NF_MATCH_EUI64=m
CONFIG_IP6_NF_MATCH_FRAG=m
CONFIG_IP6_NF_MATCH_OPTS=m
CONFIG_IP6_NF_MATCH_HL=m
CONFIG_IP6_NF_MATCH_IPV6HEADER=m
CONFIG_IP6_NF_MATCH_MH=m
CONFIG_IP6_NF_MATCH_RPFILTER=m
CONFIG_IP6_NF_MATCH_RT=m
CONFIG_IP6_NF_TARGET_HL=m
CONFIG_IP6_NF_FILTER=m
CONFIG_IP6_NF_TARGET_REJECT=m
CONFIG_IP6_NF_TARGET_SYNPROXY=m
CONFIG_IP6_NF_MANGLE=m
CONFIG_IP6_NF_RAW=m
CONFIG_IP6_NF_SECURITY=m
CONFIG_IP6_NF_NAT=m
CONFIG_IP6_NF_TARGET_MASQUERADE=m
CONFIG_IP6_NF_TARGET_NPT=m

#
# DECnet: Netfilter Configuration
#
CONFIG_DECNET_NF_GRABULATOR=m
CONFIG_NF_TABLES_BRIDGE=m
CONFIG_NFT_BRIDGE_META=m
CONFIG_NFT_BRIDGE_REJECT=m
CONFIG_NF_LOG_BRIDGE=m
CONFIG_BRIDGE_NF_EBTABLES=m
CONFIG_BRIDGE_EBT_BROUTE=m
CONFIG_BRIDGE_EBT_T_FILTER=m
CONFIG_BRIDGE_EBT_T_NAT=m
CONFIG_BRIDGE_EBT_802_3=m
CONFIG_BRIDGE_EBT_AMONG=m
CONFIG_BRIDGE_EBT_ARP=m
CONFIG_BRIDGE_EBT_IP=m
CONFIG_BRIDGE_EBT_IP6=m
CONFIG_BRIDGE_EBT_LIMIT=m
CONFIG_BRIDGE_EBT_MARK=m
CONFIG_BRIDGE_EBT_PKTTYPE=m
CONFIG_BRIDGE_EBT_STP=m
CONFIG_BRIDGE_EBT_VLAN=m
CONFIG_BRIDGE_EBT_ARPREPLY=m
CONFIG_BRIDGE_EBT_DNAT=m
CONFIG_BRIDGE_EBT_MARK_T=m
CONFIG_BRIDGE_EBT_REDIRECT=m
CONFIG_BRIDGE_EBT_SNAT=m
CONFIG_BRIDGE_EBT_LOG=m
CONFIG_BRIDGE_EBT_NFLOG=m
CONFIG_IP_DCCP=m
CONFIG_INET_DCCP_DIAG=m

#
# DCCP CCIDs Configuration
#
# CONFIG_IP_DCCP_CCID2_DEBUG is not set
CONFIG_IP_DCCP_CCID3=y
# CONFIG_IP_DCCP_CCID3_DEBUG is not set
CONFIG_IP_DCCP_TFRC_LIB=y

#
# DCCP Kernel Hacking
#
# CONFIG_IP_DCCP_DEBUG is not set
CONFIG_NET_DCCPPROBE=m
CONFIG_IP_SCTP=m
CONFIG_NET_SCTPPROBE=m
# CONFIG_SCTP_DBG_OBJCNT is not set
CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5=y
# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA1 is not set
# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_NONE is not set
CONFIG_SCTP_COOKIE_HMAC_MD5=y
CONFIG_SCTP_COOKIE_HMAC_SHA1=y
CONFIG_RDS=m
CONFIG_RDS_RDMA=m
CONFIG_RDS_TCP=m
# CONFIG_RDS_DEBUG is not set
CONFIG_TIPC=m
CONFIG_TIPC_MEDIA_IB=y
CONFIG_TIPC_MEDIA_UDP=y
CONFIG_ATM=m
CONFIG_ATM_CLIP=m
# CONFIG_ATM_CLIP_NO_ICMP is not set
CONFIG_ATM_LANE=m
CONFIG_ATM_MPOA=m
CONFIG_ATM_BR2684=m
# CONFIG_ATM_BR2684_IPFILTER is not set
CONFIG_L2TP=m
CONFIG_L2TP_DEBUGFS=m
CONFIG_L2TP_V3=y
CONFIG_L2TP_IP=m
CONFIG_L2TP_ETH=m
CONFIG_STP=m
CONFIG_GARP=m
CONFIG_MRP=m
CONFIG_BRIDGE=m
CONFIG_BRIDGE_IGMP_SNOOPING=y
CONFIG_BRIDGE_VLAN_FILTERING=y
CONFIG_HAVE_NET_DSA=y
CONFIG_VLAN_8021Q=m
CONFIG_VLAN_8021Q_GVRP=y
CONFIG_VLAN_8021Q_MVRP=y
CONFIG_DECNET=m
# CONFIG_DECNET_ROUTER is not set
CONFIG_LLC=m
CONFIG_LLC2=m
CONFIG_IPX=m
# CONFIG_IPX_INTERN is not set
CONFIG_ATALK=m
CONFIG_DEV_APPLETALK=m
CONFIG_IPDDP=m
CONFIG_IPDDP_ENCAP=y
# CONFIG_X25 is not set
CONFIG_LAPB=m
CONFIG_PHONET=m
CONFIG_6LOWPAN=m
CONFIG_6LOWPAN_NHC=m
CONFIG_6LOWPAN_NHC_DEST=m
CONFIG_6LOWPAN_NHC_FRAGMENT=m
CONFIG_6LOWPAN_NHC_HOP=m
CONFIG_6LOWPAN_NHC_IPV6=m
CONFIG_6LOWPAN_NHC_MOBILITY=m
CONFIG_6LOWPAN_NHC_ROUTING=m
CONFIG_6LOWPAN_NHC_UDP=m
CONFIG_IEEE802154=m
CONFIG_IEEE802154_SOCKET=m
CONFIG_IEEE802154_6LOWPAN=m
# CONFIG_MAC802154 is not set
CONFIG_NET_SCHED=y

#
# Queueing/Scheduling
#
CONFIG_NET_SCH_CBQ=m
CONFIG_NET_SCH_HTB=m
CONFIG_NET_SCH_HFSC=m
CONFIG_NET_SCH_ATM=m
CONFIG_NET_SCH_PRIO=m
CONFIG_NET_SCH_MULTIQ=m
CONFIG_NET_SCH_RED=m
CONFIG_NET_SCH_SFB=m
CONFIG_NET_SCH_SFQ=m
CONFIG_NET_SCH_TEQL=m
CONFIG_NET_SCH_TBF=m
CONFIG_NET_SCH_GRED=m
CONFIG_NET_SCH_DSMARK=m
CONFIG_NET_SCH_NETEM=m
CONFIG_NET_SCH_DRR=m
CONFIG_NET_SCH_MQPRIO=m
CONFIG_NET_SCH_CHOKE=m
CONFIG_NET_SCH_QFQ=m
CONFIG_NET_SCH_CODEL=m
CONFIG_NET_SCH_FQ_CODEL=m
CONFIG_NET_SCH_FQ=m
CONFIG_NET_SCH_HHF=m
CONFIG_NET_SCH_PIE=m
CONFIG_NET_SCH_INGRESS=m
CONFIG_NET_SCH_PLUG=m

#
# Classification
#
CONFIG_NET_CLS=y
CONFIG_NET_CLS_BASIC=m
CONFIG_NET_CLS_TCINDEX=m
CONFIG_NET_CLS_ROUTE4=m
CONFIG_NET_CLS_FW=m
CONFIG_NET_CLS_U32=m
CONFIG_CLS_U32_PERF=y
CONFIG_CLS_U32_MARK=y
CONFIG_NET_CLS_RSVP=m
CONFIG_NET_CLS_RSVP6=m
CONFIG_NET_CLS_FLOW=m
CONFIG_NET_CLS_CGROUP=m
CONFIG_NET_CLS_BPF=m
CONFIG_NET_EMATCH=y
CONFIG_NET_EMATCH_STACK=32
CONFIG_NET_EMATCH_CMP=m
CONFIG_NET_EMATCH_NBYTE=m
CONFIG_NET_EMATCH_U32=m
CONFIG_NET_EMATCH_META=m
CONFIG_NET_EMATCH_TEXT=m
CONFIG_NET_EMATCH_CANID=m
CONFIG_NET_EMATCH_IPSET=m
CONFIG_NET_CLS_ACT=y
CONFIG_NET_ACT_POLICE=m
CONFIG_NET_ACT_GACT=m
CONFIG_GACT_PROB=y
CONFIG_NET_ACT_MIRRED=m
CONFIG_NET_ACT_IPT=m
CONFIG_NET_ACT_NAT=m
CONFIG_NET_ACT_PEDIT=m
CONFIG_NET_ACT_SIMP=m
CONFIG_NET_ACT_SKBEDIT=m
CONFIG_NET_ACT_CSUM=m
CONFIG_NET_ACT_VLAN=m
CONFIG_NET_ACT_BPF=m
CONFIG_NET_ACT_CONNMARK=m
CONFIG_NET_CLS_IND=y
CONFIG_NET_SCH_FIFO=y
CONFIG_DCB=y
CONFIG_DNS_RESOLVER=m
CONFIG_BATMAN_ADV=m
CONFIG_BATMAN_ADV_BLA=y
CONFIG_BATMAN_ADV_DAT=y
CONFIG_BATMAN_ADV_NC=y
CONFIG_BATMAN_ADV_MCAST=y
# CONFIG_BATMAN_ADV_DEBUG is not set
CONFIG_OPENVSWITCH=m
CONFIG_OPENVSWITCH_GRE=m
CONFIG_OPENVSWITCH_VXLAN=m
CONFIG_OPENVSWITCH_GENEVE=m
CONFIG_VSOCKETS=m
CONFIG_VMWARE_VMCI_VSOCKETS=m
CONFIG_NETLINK_MMAP=y
CONFIG_NETLINK_DIAG=m
CONFIG_MPLS=y
CONFIG_NET_MPLS_GSO=y
CONFIG_MPLS_ROUTING=m
# CONFIG_HSR is not set
# CONFIG_NET_SWITCHDEV is not set
CONFIG_RPS=y
CONFIG_RFS_ACCEL=y
CONFIG_XPS=y
CONFIG_CGROUP_NET_PRIO=y
CONFIG_CGROUP_NET_CLASSID=y
CONFIG_NET_RX_BUSY_POLL=y
CONFIG_BQL=y
CONFIG_BPF_JIT=y
CONFIG_NET_FLOW_LIMIT=y

#
# Network testing
#
CONFIG_NET_PKTGEN=m
# CONFIG_NET_TCPPROBE is not set
CONFIG_NET_DROP_MONITOR=m
CONFIG_HAMRADIO=y

#
# Packet Radio protocols
#
CONFIG_AX25=m
# CONFIG_AX25_DAMA_SLAVE is not set
CONFIG_NETROM=m
CONFIG_ROSE=m

#
# AX.25 network device drivers
#
CONFIG_MKISS=m
CONFIG_6PACK=m
CONFIG_BPQETHER=m
CONFIG_BAYCOM_SER_FDX=m
CONFIG_BAYCOM_SER_HDX=m
CONFIG_BAYCOM_PAR=m
CONFIG_YAM=m
CONFIG_CAN=m
CONFIG_CAN_RAW=m
CONFIG_CAN_BCM=m
CONFIG_CAN_GW=m

#
# CAN Device Drivers
#
CONFIG_CAN_VCAN=m
CONFIG_CAN_SLCAN=m
CONFIG_CAN_DEV=m
CONFIG_CAN_CALC_BITTIMING=y
# CONFIG_CAN_LEDS is not set
CONFIG_CAN_SJA1000=m
CONFIG_CAN_SJA1000_ISA=m
# CONFIG_CAN_SJA1000_PLATFORM is not set
CONFIG_CAN_EMS_PCMCIA=m
CONFIG_CAN_EMS_PCI=m
CONFIG_CAN_PEAK_PCMCIA=m
CONFIG_CAN_PEAK_PCI=m
CONFIG_CAN_PEAK_PCIEC=y
CONFIG_CAN_KVASER_PCI=m
CONFIG_CAN_PLX_PCI=m
# CONFIG_CAN_C_CAN is not set
# CONFIG_CAN_M_CAN is not set
# CONFIG_CAN_CC770 is not set

#
# CAN SPI interfaces
#
# CONFIG_CAN_MCP251X is not set

#
# CAN USB interfaces
#
CONFIG_CAN_EMS_USB=m
CONFIG_CAN_ESD_USB2=m
CONFIG_CAN_GS_USB=m
CONFIG_CAN_KVASER_USB=m
CONFIG_CAN_PEAK_USB=m
CONFIG_CAN_8DEV_USB=m
CONFIG_CAN_SOFTING=m
CONFIG_CAN_SOFTING_CS=m
# CONFIG_CAN_DEBUG_DEVICES is not set
CONFIG_IRDA=m

#
# IrDA protocols
#
CONFIG_IRLAN=m
CONFIG_IRNET=m
CONFIG_IRCOMM=m
# CONFIG_IRDA_ULTRA is not set

#
# IrDA options
#
CONFIG_IRDA_CACHE_LAST_LSAP=y
CONFIG_IRDA_FAST_RR=y
# CONFIG_IRDA_DEBUG is not set

#
# Infrared-port device drivers
#

#
# SIR device drivers
#
CONFIG_IRTTY_SIR=m

#
# Dongle support
#
CONFIG_DONGLE=y
CONFIG_ESI_DONGLE=m
CONFIG_ACTISYS_DONGLE=m
CONFIG_TEKRAM_DONGLE=m
CONFIG_TOIM3232_DONGLE=m
CONFIG_LITELINK_DONGLE=m
CONFIG_MA600_DONGLE=m
CONFIG_GIRBIL_DONGLE=m
CONFIG_MCP2120_DONGLE=m
CONFIG_OLD_BELKIN_DONGLE=m
CONFIG_ACT200L_DONGLE=m
CONFIG_KINGSUN_DONGLE=m
CONFIG_KSDAZZLE_DONGLE=m
CONFIG_KS959_DONGLE=m

#
# FIR device drivers
#
CONFIG_USB_IRDA=m
CONFIG_SIGMATEL_FIR=m
CONFIG_NSC_FIR=m
CONFIG_WINBOND_FIR=m
CONFIG_SMC_IRCC_FIR=m
CONFIG_ALI_FIR=m
CONFIG_VLSI_FIR=m
CONFIG_VIA_FIR=m
CONFIG_MCS_FIR=m
CONFIG_BT=m
CONFIG_BT_BREDR=y
CONFIG_BT_RFCOMM=m
CONFIG_BT_RFCOMM_TTY=y
CONFIG_BT_BNEP=m
CONFIG_BT_BNEP_MC_FILTER=y
CONFIG_BT_BNEP_PROTO_FILTER=y
CONFIG_BT_CMTP=m
CONFIG_BT_HIDP=m
CONFIG_BT_LE=y
CONFIG_BT_6LOWPAN=m
# CONFIG_BT_SELFTEST is not set
CONFIG_BT_DEBUGFS=y

#
# Bluetooth device drivers
#
CONFIG_BT_INTEL=m
CONFIG_BT_BCM=m
CONFIG_BT_HCIBTUSB=m
CONFIG_BT_HCIBTUSB_BCM=y
CONFIG_BT_HCIBTSDIO=m
CONFIG_BT_HCIUART=m
CONFIG_BT_HCIUART_H4=y
CONFIG_BT_HCIUART_BCSP=y
CONFIG_BT_HCIUART_ATH3K=y
CONFIG_BT_HCIUART_LL=y
CONFIG_BT_HCIUART_3WIRE=y
CONFIG_BT_HCIUART_INTEL=y
CONFIG_BT_HCIUART_BCM=y
CONFIG_BT_HCIBCM203X=m
CONFIG_BT_HCIBPA10X=m
CONFIG_BT_HCIBFUSB=m
CONFIG_BT_HCIDTL1=m
CONFIG_BT_HCIBT3C=m
CONFIG_BT_HCIBLUECARD=m
# CONFIG_BT_HCIBTUART is not set
CONFIG_BT_HCIVHCI=m
CONFIG_BT_MRVL=m
CONFIG_BT_MRVL_SDIO=m
CONFIG_BT_ATH3K=m
CONFIG_AF_RXRPC=m
# CONFIG_AF_RXRPC_DEBUG is not set
CONFIG_RXKAD=m
CONFIG_FIB_RULES=y
CONFIG_WIRELESS=y
CONFIG_WIRELESS_EXT=y
CONFIG_WEXT_CORE=y
CONFIG_WEXT_PROC=y
CONFIG_WEXT_SPY=y
CONFIG_WEXT_PRIV=y
CONFIG_CFG80211=m
# CONFIG_NL80211_TESTMODE is not set
# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set
# CONFIG_CFG80211_REG_DEBUG is not set
# CONFIG_CFG80211_CERTIFICATION_ONUS is not set
CONFIG_CFG80211_DEFAULT_PS=y
# CONFIG_CFG80211_DEBUGFS is not set
# CONFIG_CFG80211_INTERNAL_REGDB is not set
CONFIG_CFG80211_WEXT=y
CONFIG_CFG80211_WEXT_EXPORT=y
CONFIG_LIB80211=m
CONFIG_LIB80211_CRYPT_WEP=m
CONFIG_LIB80211_CRYPT_CCMP=m
CONFIG_LIB80211_CRYPT_TKIP=m
# CONFIG_LIB80211_DEBUG is not set
CONFIG_MAC80211=m
CONFIG_MAC80211_HAS_RC=y
CONFIG_MAC80211_RC_MINSTREL=y
CONFIG_MAC80211_RC_MINSTREL_HT=y
# CONFIG_MAC80211_RC_MINSTREL_VHT is not set
CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
CONFIG_MAC80211_RC_DEFAULT="minstrel_ht"
CONFIG_MAC80211_MESH=y
CONFIG_MAC80211_LEDS=y
# CONFIG_MAC80211_DEBUGFS is not set
# CONFIG_MAC80211_MESSAGE_TRACING is not set
# CONFIG_MAC80211_DEBUG_MENU is not set
CONFIG_WIMAX=m
CONFIG_WIMAX_DEBUG_LEVEL=8
CONFIG_RFKILL=m
CONFIG_RFKILL_LEDS=y
CONFIG_RFKILL_INPUT=y
# CONFIG_RFKILL_GPIO is not set
CONFIG_NET_9P=m
CONFIG_NET_9P_VIRTIO=m
CONFIG_NET_9P_RDMA=m
# CONFIG_NET_9P_DEBUG is not set
# CONFIG_CAIF is not set
CONFIG_CEPH_LIB=m
# CONFIG_CEPH_LIB_PRETTYDEBUG is not set
# CONFIG_CEPH_LIB_USE_DNS_RESOLVER is not set
CONFIG_NFC=m
CONFIG_NFC_DIGITAL=m
# CONFIG_NFC_NCI is not set
CONFIG_NFC_HCI=m
# CONFIG_NFC_SHDLC is not set

#
# Near Field Communication (NFC) devices
#
CONFIG_NFC_PN533=m
# CONFIG_NFC_TRF7970A is not set
CONFIG_NFC_MEI_PHY=m
CONFIG_NFC_SIM=m
CONFIG_NFC_PORT100=m
CONFIG_NFC_PN544=m
CONFIG_NFC_PN544_MEI=m
# CONFIG_NFC_MICROREAD is not set
# CONFIG_NFC_ST21NFCA is not set
CONFIG_HAVE_BPF_JIT=y

#
# Device Drivers
#

#
# Generic Driver Options
#
CONFIG_UEVENT_HELPER=y
CONFIG_UEVENT_HELPER_PATH=""
CONFIG_DEVTMPFS=y
# CONFIG_DEVTMPFS_MOUNT is not set
CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y
CONFIG_FW_LOADER=y
# CONFIG_FIRMWARE_IN_KERNEL is not set
CONFIG_EXTRA_FIRMWARE=""
CONFIG_FW_LOADER_USER_HELPER=y
# CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set
CONFIG_WANT_DEV_COREDUMP=y
CONFIG_ALLOW_DEV_COREDUMP=y
CONFIG_DEV_COREDUMP=y
# CONFIG_DEBUG_DRIVER is not set
# CONFIG_DEBUG_DEVRES is not set
CONFIG_SYS_HYPERVISOR=y
# CONFIG_GENERIC_CPU_DEVICES is not set
CONFIG_GENERIC_CPU_AUTOPROBE=y
CONFIG_REGMAP=y
CONFIG_REGMAP_I2C=m
CONFIG_REGMAP_SPI=m
CONFIG_DMA_SHARED_BUFFER=y
# CONFIG_FENCE_TRACE is not set

#
# Bus devices
#
CONFIG_CONNECTOR=y
CONFIG_PROC_EVENTS=y
CONFIG_MTD=m
# CONFIG_MTD_TESTS is not set
CONFIG_MTD_REDBOOT_PARTS=m
CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
# CONFIG_MTD_CMDLINE_PARTS is not set
CONFIG_MTD_AR7_PARTS=m

#
# User Modules And Translation Layers
#
CONFIG_MTD_BLKDEVS=m
CONFIG_MTD_BLOCK=m
CONFIG_MTD_BLOCK_RO=m
CONFIG_FTL=m
CONFIG_NFTL=m
CONFIG_NFTL_RW=y
CONFIG_INFTL=m
CONFIG_RFD_FTL=m
CONFIG_SSFDC=m
# CONFIG_SM_FTL is not set
CONFIG_MTD_OOPS=m
CONFIG_MTD_SWAP=m
# CONFIG_MTD_PARTITIONED_MASTER is not set

#
# RAM/ROM/Flash chip drivers
#
CONFIG_MTD_CFI=m
CONFIG_MTD_JEDECPROBE=m
CONFIG_MTD_GEN_PROBE=m
# CONFIG_MTD_CFI_ADV_OPTIONS is not set
CONFIG_MTD_MAP_BANK_WIDTH_1=y
CONFIG_MTD_MAP_BANK_WIDTH_2=y
CONFIG_MTD_MAP_BANK_WIDTH_4=y
# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
CONFIG_MTD_CFI_I1=y
CONFIG_MTD_CFI_I2=y
# CONFIG_MTD_CFI_I4 is not set
# CONFIG_MTD_CFI_I8 is not set
CONFIG_MTD_CFI_INTELEXT=m
CONFIG_MTD_CFI_AMDSTD=m
CONFIG_MTD_CFI_STAA=m
CONFIG_MTD_CFI_UTIL=m
CONFIG_MTD_RAM=m
CONFIG_MTD_ROM=m
CONFIG_MTD_ABSENT=m

#
# Mapping drivers for chip access
#
CONFIG_MTD_COMPLEX_MAPPINGS=y
CONFIG_MTD_PHYSMAP=m
# CONFIG_MTD_PHYSMAP_COMPAT is not set
CONFIG_MTD_SBC_GXX=m
# CONFIG_MTD_AMD76XROM is not set
# CONFIG_MTD_ICHXROM is not set
# CONFIG_MTD_ESB2ROM is not set
# CONFIG_MTD_CK804XROM is not set
# CONFIG_MTD_SCB2_FLASH is not set
CONFIG_MTD_NETtel=m
# CONFIG_MTD_L440GX is not set
CONFIG_MTD_PCI=m
CONFIG_MTD_PCMCIA=m
# CONFIG_MTD_PCMCIA_ANONYMOUS is not set
# CONFIG_MTD_GPIO_ADDR is not set
CONFIG_MTD_INTEL_VR_NOR=m
CONFIG_MTD_PLATRAM=m
# CONFIG_MTD_LATCH_ADDR is not set

#
# Self-contained MTD device drivers
#
# CONFIG_MTD_PMC551 is not set
CONFIG_MTD_DATAFLASH=m
# CONFIG_MTD_DATAFLASH_WRITE_VERIFY is not set
# CONFIG_MTD_DATAFLASH_OTP is not set
CONFIG_MTD_M25P80=m
CONFIG_MTD_SST25L=m
CONFIG_MTD_SLRAM=m
CONFIG_MTD_PHRAM=m
CONFIG_MTD_MTDRAM=m
CONFIG_MTDRAM_TOTAL_SIZE=4096
CONFIG_MTDRAM_ERASE_SIZE=128
CONFIG_MTD_BLOCK2MTD=m

#
# Disk-On-Chip Device Drivers
#
# CONFIG_MTD_DOCG3 is not set
CONFIG_MTD_NAND_ECC=m
# CONFIG_MTD_NAND_ECC_SMC is not set
CONFIG_MTD_NAND=m
CONFIG_MTD_NAND_BCH=m
CONFIG_MTD_NAND_ECC_BCH=y
CONFIG_MTD_SM_COMMON=m
# CONFIG_MTD_NAND_DENALI is not set
# CONFIG_MTD_NAND_GPIO is not set
# CONFIG_MTD_NAND_OMAP_BCH_BUILD is not set
CONFIG_MTD_NAND_IDS=m
CONFIG_MTD_NAND_RICOH=m
CONFIG_MTD_NAND_DISKONCHIP=m
# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set
CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0
# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set
# CONFIG_MTD_NAND_DOCG4 is not set
CONFIG_MTD_NAND_CAFE=m
CONFIG_MTD_NAND_NANDSIM=m
# CONFIG_MTD_NAND_PLATFORM is not set
# CONFIG_MTD_NAND_HISI504 is not set
CONFIG_MTD_ONENAND=m
CONFIG_MTD_ONENAND_VERIFY_WRITE=y
# CONFIG_MTD_ONENAND_GENERIC is not set
# CONFIG_MTD_ONENAND_OTP is not set
CONFIG_MTD_ONENAND_2X_PROGRAM=y

#
# LPDDR & LPDDR2 PCM memory drivers
#
CONFIG_MTD_LPDDR=m
CONFIG_MTD_QINFO_PROBE=m
CONFIG_MTD_SPI_NOR=m
CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y
CONFIG_MTD_UBI=m
CONFIG_MTD_UBI_WL_THRESHOLD=4096
CONFIG_MTD_UBI_BEB_LIMIT=20
# CONFIG_MTD_UBI_FASTMAP is not set
# CONFIG_MTD_UBI_GLUEBI is not set
CONFIG_MTD_UBI_BLOCK=y
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
CONFIG_PARPORT=m
CONFIG_PARPORT_PC=m
CONFIG_PARPORT_SERIAL=m
# CONFIG_PARPORT_PC_FIFO is not set
# CONFIG_PARPORT_PC_SUPERIO is not set
CONFIG_PARPORT_PC_PCMCIA=m
# CONFIG_PARPORT_GSC is not set
# CONFIG_PARPORT_AX88796 is not set
CONFIG_PARPORT_1284=y
CONFIG_PARPORT_NOT_PC=y
CONFIG_PNP=y
# CONFIG_PNP_DEBUG_MESSAGES is not set

#
# Protocols
#
CONFIG_PNPACPI=y
CONFIG_BLK_DEV=y
CONFIG_BLK_DEV_NULL_BLK=m
CONFIG_BLK_DEV_FD=m
# CONFIG_PARIDE is not set
CONFIG_BLK_DEV_PCIESSD_MTIP32XX=m
CONFIG_ZRAM=m
CONFIG_ZRAM_LZ4_COMPRESS=y
# CONFIG_ZRAM_DEBUG is not set
CONFIG_BLK_CPQ_CISS_DA=m
CONFIG_CISS_SCSI_TAPE=y
CONFIG_BLK_DEV_DAC960=m
CONFIG_BLK_DEV_UMEM=m
# CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=m
CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
CONFIG_BLK_DEV_DRBD=m
# CONFIG_DRBD_FAULT_INJECTION is not set
CONFIG_BLK_DEV_NBD=m
CONFIG_BLK_DEV_NVME=m
CONFIG_BLK_DEV_SKD=m
CONFIG_BLK_DEV_OSD=m
CONFIG_BLK_DEV_SX8=m
CONFIG_BLK_DEV_RAM=m
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=16384
CONFIG_BLK_DEV_PMEM=m
CONFIG_CDROM_PKTCDVD=m
CONFIG_CDROM_PKTCDVD_BUFFERS=8
# CONFIG_CDROM_PKTCDVD_WCACHE is not set
CONFIG_ATA_OVER_ETH=m
CONFIG_XEN_BLKDEV_FRONTEND=m
CONFIG_XEN_BLKDEV_BACKEND=m
CONFIG_VIRTIO_BLK=m
# CONFIG_BLK_DEV_HD is not set
CONFIG_BLK_DEV_RBD=m
CONFIG_BLK_DEV_RSXX=m

#
# Misc devices
#
CONFIG_SENSORS_LIS3LV02D=m
CONFIG_AD525X_DPOT=m
CONFIG_AD525X_DPOT_I2C=m
CONFIG_AD525X_DPOT_SPI=m
# CONFIG_DUMMY_IRQ is not set
CONFIG_IBM_ASM=m
CONFIG_PHANTOM=m
CONFIG_SGI_IOC4=m
CONFIG_TIFM_CORE=m
CONFIG_TIFM_7XX1=m
CONFIG_ICS932S401=m
CONFIG_ENCLOSURE_SERVICES=m
CONFIG_HP_ILO=m
CONFIG_APDS9802ALS=m
CONFIG_ISL29003=m
CONFIG_ISL29020=m
CONFIG_SENSORS_TSL2550=m
CONFIG_SENSORS_BH1780=m
CONFIG_SENSORS_BH1770=m
CONFIG_SENSORS_APDS990X=m
CONFIG_HMC6352=m
CONFIG_DS1682=m
CONFIG_TI_DAC7512=m
CONFIG_VMWARE_BALLOON=m
# CONFIG_BMP085_I2C is not set
# CONFIG_BMP085_SPI is not set
# CONFIG_USB_SWITCH_FSA9480 is not set
# CONFIG_LATTICE_ECP3_CONFIG is not set
# CONFIG_SRAM is not set
CONFIG_C2PORT=m
CONFIG_C2PORT_DURAMAR_2150=m

#
# EEPROM support
#
CONFIG_EEPROM_AT24=m
CONFIG_EEPROM_AT25=m
CONFIG_EEPROM_LEGACY=m
CONFIG_EEPROM_MAX6875=m
CONFIG_EEPROM_93CX6=m
# CONFIG_EEPROM_93XX46 is not set
CONFIG_CB710_CORE=m
# CONFIG_CB710_DEBUG is not set
CONFIG_CB710_DEBUG_ASSUMPTIONS=y

#
# Texas Instruments shared transport line discipline
#
# CONFIG_TI_ST is not set
CONFIG_SENSORS_LIS3_I2C=m

#
# Altera FPGA firmware download module
#
CONFIG_ALTERA_STAPL=m
CONFIG_INTEL_MEI=m
CONFIG_INTEL_MEI_ME=m
# CONFIG_INTEL_MEI_TXE is not set
CONFIG_VMWARE_VMCI=m

#
# Intel MIC Bus Driver
#
CONFIG_INTEL_MIC_BUS=m

#
# Intel MIC Host Driver
#
CONFIG_INTEL_MIC_HOST=m

#
# Intel MIC Card Driver
#
# CONFIG_INTEL_MIC_CARD is not set
# CONFIG_GENWQE is not set
# CONFIG_ECHO is not set
# CONFIG_CXL_BASE is not set
CONFIG_HAVE_IDE=y
# CONFIG_IDE is not set

#
# SCSI device support
#
CONFIG_SCSI_MOD=m
CONFIG_RAID_ATTRS=m
CONFIG_SCSI=m
CONFIG_SCSI_DMA=y
CONFIG_SCSI_NETLINK=y
# CONFIG_SCSI_MQ_DEFAULT is not set
# CONFIG_SCSI_PROC_FS is not set

#
# SCSI support type (disk, tape, CD-ROM)
#
CONFIG_BLK_DEV_SD=m
CONFIG_CHR_DEV_ST=m
CONFIG_CHR_DEV_OSST=m
CONFIG_BLK_DEV_SR=m
CONFIG_BLK_DEV_SR_VENDOR=y
CONFIG_CHR_DEV_SG=m
CONFIG_CHR_DEV_SCH=m
CONFIG_SCSI_ENCLOSURE=m
CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_LOGGING=y
CONFIG_SCSI_SCAN_ASYNC=y

#
# SCSI Transports
#
CONFIG_SCSI_SPI_ATTRS=m
CONFIG_SCSI_FC_ATTRS=m
CONFIG_SCSI_ISCSI_ATTRS=m
CONFIG_SCSI_SAS_ATTRS=m
CONFIG_SCSI_SAS_LIBSAS=m
CONFIG_SCSI_SAS_ATA=y
CONFIG_SCSI_SAS_HOST_SMP=y
CONFIG_SCSI_SRP_ATTRS=m
CONFIG_SCSI_LOWLEVEL=y
CONFIG_ISCSI_TCP=m
CONFIG_ISCSI_BOOT_SYSFS=m
CONFIG_SCSI_CXGB3_ISCSI=m
CONFIG_SCSI_CXGB4_ISCSI=m
CONFIG_SCSI_BNX2_ISCSI=m
CONFIG_SCSI_BNX2X_FCOE=m
CONFIG_BE2ISCSI=m
CONFIG_BLK_DEV_3W_XXXX_RAID=m
CONFIG_SCSI_HPSA=m
CONFIG_SCSI_3W_9XXX=m
CONFIG_SCSI_3W_SAS=m
CONFIG_SCSI_ACARD=m
CONFIG_SCSI_AACRAID=m
CONFIG_SCSI_AIC7XXX=m
CONFIG_AIC7XXX_CMDS_PER_DEVICE=8
CONFIG_AIC7XXX_RESET_DELAY_MS=15000
CONFIG_AIC7XXX_DEBUG_ENABLE=y
CONFIG_AIC7XXX_DEBUG_MASK=0
CONFIG_AIC7XXX_REG_PRETTY_PRINT=y
CONFIG_SCSI_AIC79XX=m
CONFIG_AIC79XX_CMDS_PER_DEVICE=32
CONFIG_AIC79XX_RESET_DELAY_MS=15000
CONFIG_AIC79XX_DEBUG_ENABLE=y
CONFIG_AIC79XX_DEBUG_MASK=0
CONFIG_AIC79XX_REG_PRETTY_PRINT=y
CONFIG_SCSI_AIC94XX=m
# CONFIG_AIC94XX_DEBUG is not set
CONFIG_SCSI_MVSAS=m
# CONFIG_SCSI_MVSAS_DEBUG is not set
# CONFIG_SCSI_MVSAS_TASKLET is not set
CONFIG_SCSI_MVUMI=m
CONFIG_SCSI_DPT_I2O=m
CONFIG_SCSI_ADVANSYS=m
CONFIG_SCSI_ARCMSR=m
CONFIG_SCSI_ESAS2R=m
CONFIG_MEGARAID_NEWGEN=y
CONFIG_MEGARAID_MM=m
CONFIG_MEGARAID_MAILBOX=m
CONFIG_MEGARAID_LEGACY=m
CONFIG_MEGARAID_SAS=m
CONFIG_SCSI_MPT2SAS=m
CONFIG_SCSI_MPT2SAS_MAX_SGE=128
# CONFIG_SCSI_MPT2SAS_LOGGING is not set
CONFIG_SCSI_MPT3SAS=m
CONFIG_SCSI_MPT3SAS_MAX_SGE=128
# CONFIG_SCSI_MPT3SAS_LOGGING is not set
CONFIG_SCSI_UFSHCD=m
CONFIG_SCSI_UFSHCD_PCI=m
# CONFIG_SCSI_UFSHCD_PLATFORM is not set
CONFIG_SCSI_HPTIOP=m
CONFIG_SCSI_BUSLOGIC=m
# CONFIG_SCSI_FLASHPOINT is not set
CONFIG_VMWARE_PVSCSI=m
CONFIG_XEN_SCSI_FRONTEND=m
CONFIG_HYPERV_STORAGE=m
CONFIG_LIBFC=m
CONFIG_LIBFCOE=m
CONFIG_FCOE=m
CONFIG_FCOE_FNIC=m
CONFIG_SCSI_DMX3191D=m
CONFIG_SCSI_EATA=m
CONFIG_SCSI_EATA_TAGGED_QUEUE=y
CONFIG_SCSI_EATA_LINKED_COMMANDS=y
CONFIG_SCSI_EATA_MAX_TAGS=16
CONFIG_SCSI_FUTURE_DOMAIN=m
CONFIG_SCSI_GDTH=m
CONFIG_SCSI_ISCI=m
CONFIG_SCSI_IPS=m
CONFIG_SCSI_INITIO=m
CONFIG_SCSI_INIA100=m
# CONFIG_SCSI_PPA is not set
# CONFIG_SCSI_IMM is not set
CONFIG_SCSI_STEX=m
CONFIG_SCSI_SYM53C8XX_2=m
CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
CONFIG_SCSI_SYM53C8XX_MMIO=y
CONFIG_SCSI_IPR=m
# CONFIG_SCSI_IPR_TRACE is not set
# CONFIG_SCSI_IPR_DUMP is not set
CONFIG_SCSI_QLOGIC_1280=m
CONFIG_SCSI_QLA_FC=m
CONFIG_TCM_QLA2XXX=m
CONFIG_SCSI_QLA_ISCSI=m
CONFIG_SCSI_LPFC=m
# CONFIG_SCSI_LPFC_DEBUG_FS is not set
CONFIG_SCSI_DC395x=m
CONFIG_SCSI_AM53C974=m
CONFIG_SCSI_WD719X=m
CONFIG_SCSI_DEBUG=m
CONFIG_SCSI_PMCRAID=m
CONFIG_SCSI_PM8001=m
CONFIG_SCSI_BFA_FC=m
CONFIG_SCSI_VIRTIO=m
CONFIG_SCSI_CHELSIO_FCOE=m
CONFIG_SCSI_LOWLEVEL_PCMCIA=y
CONFIG_PCMCIA_AHA152X=m
CONFIG_PCMCIA_FDOMAIN=m
CONFIG_PCMCIA_QLOGIC=m
CONFIG_PCMCIA_SYM53C500=m
CONFIG_SCSI_DH=m
CONFIG_SCSI_DH_RDAC=m
CONFIG_SCSI_DH_HP_SW=m
CONFIG_SCSI_DH_EMC=m
CONFIG_SCSI_DH_ALUA=m
CONFIG_SCSI_OSD_INITIATOR=m
CONFIG_SCSI_OSD_ULD=m
CONFIG_SCSI_OSD_DPRINT_SENSE=1
# CONFIG_SCSI_OSD_DEBUG is not set
CONFIG_ATA=m
# CONFIG_ATA_NONSTANDARD is not set
CONFIG_ATA_VERBOSE_ERROR=y
CONFIG_ATA_ACPI=y
CONFIG_SATA_ZPODD=y
CONFIG_SATA_PMP=y

#
# Controllers with non-SFF native interface
#
CONFIG_SATA_AHCI=m
# CONFIG_SATA_AHCI_PLATFORM is not set
# CONFIG_SATA_INIC162X is not set
CONFIG_SATA_ACARD_AHCI=m
CONFIG_SATA_SIL24=m
CONFIG_ATA_SFF=y

#
# SFF controllers with custom DMA interface
#
CONFIG_PDC_ADMA=m
CONFIG_SATA_QSTOR=m
CONFIG_SATA_SX4=m
CONFIG_ATA_BMDMA=y

#
# SATA SFF controllers with BMDMA
#
CONFIG_ATA_PIIX=m
CONFIG_SATA_MV=m
CONFIG_SATA_NV=m
CONFIG_SATA_PROMISE=m
CONFIG_SATA_SIL=m
CONFIG_SATA_SIS=m
CONFIG_SATA_SVW=m
CONFIG_SATA_ULI=m
CONFIG_SATA_VIA=m
CONFIG_SATA_VITESSE=m

#
# PATA SFF controllers with BMDMA
#
CONFIG_PATA_ALI=m
CONFIG_PATA_AMD=m
CONFIG_PATA_ARTOP=m
CONFIG_PATA_ATIIXP=m
CONFIG_PATA_ATP867X=m
CONFIG_PATA_CMD64X=m
# CONFIG_PATA_CYPRESS is not set
CONFIG_PATA_EFAR=m
CONFIG_PATA_HPT366=m
CONFIG_PATA_HPT37X=m
# CONFIG_PATA_HPT3X2N is not set
# CONFIG_PATA_HPT3X3 is not set
CONFIG_PATA_IT8213=m
CONFIG_PATA_IT821X=m
CONFIG_PATA_JMICRON=m
CONFIG_PATA_MARVELL=m
CONFIG_PATA_NETCELL=m
CONFIG_PATA_NINJA32=m
CONFIG_PATA_NS87415=m
CONFIG_PATA_OLDPIIX=m
# CONFIG_PATA_OPTIDMA is not set
CONFIG_PATA_PDC2027X=m
CONFIG_PATA_PDC_OLD=m
# CONFIG_PATA_RADISYS is not set
CONFIG_PATA_RDC=m
CONFIG_PATA_SCH=m
CONFIG_PATA_SERVERWORKS=m
CONFIG_PATA_SIL680=m
CONFIG_PATA_SIS=m
CONFIG_PATA_TOSHIBA=m
CONFIG_PATA_TRIFLEX=m
CONFIG_PATA_VIA=m
# CONFIG_PATA_WINBOND is not set

#
# PIO-only SFF controllers
#
# CONFIG_PATA_CMD640_PCI is not set
CONFIG_PATA_MPIIX=m
CONFIG_PATA_NS87410=m
# CONFIG_PATA_OPTI is not set
CONFIG_PATA_PCMCIA=m
# CONFIG_PATA_PLATFORM is not set
CONFIG_PATA_RZ1000=m

#
# Generic fallback / legacy drivers
#
# CONFIG_PATA_ACPI is not set
CONFIG_ATA_GENERIC=m
# CONFIG_PATA_LEGACY is not set
CONFIG_MD=y
CONFIG_BLK_DEV_MD=m
CONFIG_MD_LINEAR=m
CONFIG_MD_RAID0=m
CONFIG_MD_RAID1=m
CONFIG_MD_RAID10=m
CONFIG_MD_RAID456=m
CONFIG_MD_MULTIPATH=m
CONFIG_MD_FAULTY=m
# CONFIG_MD_CLUSTER is not set
CONFIG_BCACHE=m
# CONFIG_BCACHE_DEBUG is not set
# CONFIG_BCACHE_CLOSURES_DEBUG is not set
CONFIG_BLK_DEV_DM_BUILTIN=y
CONFIG_BLK_DEV_DM=m
# CONFIG_DM_MQ_DEFAULT is not set
# CONFIG_DM_DEBUG is not set
CONFIG_DM_BUFIO=m
CONFIG_DM_BIO_PRISON=m
CONFIG_DM_PERSISTENT_DATA=m
# CONFIG_DM_DEBUG_BLOCK_STACK_TRACING is not set
CONFIG_DM_CRYPT=m
CONFIG_DM_SNAPSHOT=m
CONFIG_DM_THIN_PROVISIONING=m
CONFIG_DM_CACHE=m
CONFIG_DM_CACHE_MQ=m
CONFIG_DM_CACHE_CLEANER=m
CONFIG_DM_ERA=m
CONFIG_DM_MIRROR=m
CONFIG_DM_LOG_USERSPACE=m
CONFIG_DM_RAID=m
CONFIG_DM_ZERO=m
CONFIG_DM_MULTIPATH=m
CONFIG_DM_MULTIPATH_QL=m
CONFIG_DM_MULTIPATH_ST=m
CONFIG_DM_DELAY=m
CONFIG_DM_UEVENT=y
CONFIG_DM_FLAKEY=m
CONFIG_DM_VERITY=m
CONFIG_DM_SWITCH=m
CONFIG_DM_LOG_WRITES=m
CONFIG_TARGET_CORE=m
CONFIG_TCM_IBLOCK=m
CONFIG_TCM_FILEIO=m
CONFIG_TCM_PSCSI=m
# CONFIG_TCM_USER2 is not set
CONFIG_LOOPBACK_TARGET=m
CONFIG_TCM_FC=m
CONFIG_ISCSI_TARGET=m
CONFIG_SBP_TARGET=m
CONFIG_FUSION=y
CONFIG_FUSION_SPI=m
CONFIG_FUSION_FC=m
CONFIG_FUSION_SAS=m
CONFIG_FUSION_MAX_SGE=128
CONFIG_FUSION_CTL=m
CONFIG_FUSION_LAN=m
# CONFIG_FUSION_LOGGING is not set

#
# IEEE 1394 (FireWire) support
#
CONFIG_FIREWIRE=m
CONFIG_FIREWIRE_OHCI=m
CONFIG_FIREWIRE_SBP2=m
CONFIG_FIREWIRE_NET=m
CONFIG_FIREWIRE_NOSY=m
CONFIG_MACINTOSH_DRIVERS=y
CONFIG_MAC_EMUMOUSEBTN=y
CONFIG_NETDEVICES=y
CONFIG_MII=m
CONFIG_NET_CORE=y
CONFIG_BONDING=m
CONFIG_DUMMY=m
CONFIG_EQUALIZER=m
CONFIG_NET_FC=y
CONFIG_IFB=m
CONFIG_NET_TEAM=m
CONFIG_NET_TEAM_MODE_BROADCAST=m
CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
CONFIG_NET_TEAM_MODE_RANDOM=m
CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m
CONFIG_NET_TEAM_MODE_LOADBALANCE=m
CONFIG_MACVLAN=m
CONFIG_MACVTAP=m
CONFIG_IPVLAN=m
CONFIG_VXLAN=m
CONFIG_NETCONSOLE=m
CONFIG_NETCONSOLE_DYNAMIC=y
CONFIG_NETPOLL=y
CONFIG_NET_POLL_CONTROLLER=y
CONFIG_TUN=m
CONFIG_VETH=m
CONFIG_VIRTIO_NET=m
CONFIG_NLMON=m
CONFIG_SUNGEM_PHY=m
CONFIG_ARCNET=m
CONFIG_ARCNET_1201=m
CONFIG_ARCNET_1051=m
CONFIG_ARCNET_RAW=m
CONFIG_ARCNET_CAP=m
CONFIG_ARCNET_COM90xx=m
CONFIG_ARCNET_COM90xxIO=m
CONFIG_ARCNET_RIM_I=m
CONFIG_ARCNET_COM20020=m
CONFIG_ARCNET_COM20020_PCI=m
CONFIG_ARCNET_COM20020_CS=m
CONFIG_ATM_DRIVERS=y
CONFIG_ATM_DUMMY=m
CONFIG_ATM_TCP=m
CONFIG_ATM_LANAI=m
CONFIG_ATM_ENI=m
# CONFIG_ATM_ENI_DEBUG is not set
# CONFIG_ATM_ENI_TUNE_BURST is not set
CONFIG_ATM_FIRESTREAM=m
CONFIG_ATM_ZATM=m
# CONFIG_ATM_ZATM_DEBUG is not set
CONFIG_ATM_NICSTAR=m
CONFIG_ATM_NICSTAR_USE_SUNI=y
CONFIG_ATM_NICSTAR_USE_IDT77105=y
CONFIG_ATM_IDT77252=m
# CONFIG_ATM_IDT77252_DEBUG is not set
# CONFIG_ATM_IDT77252_RCV_ALL is not set
CONFIG_ATM_IDT77252_USE_SUNI=y
CONFIG_ATM_AMBASSADOR=m
# CONFIG_ATM_AMBASSADOR_DEBUG is not set
CONFIG_ATM_HORIZON=m
# CONFIG_ATM_HORIZON_DEBUG is not set
CONFIG_ATM_IA=m
# CONFIG_ATM_IA_DEBUG is not set
CONFIG_ATM_FORE200E=m
# CONFIG_ATM_FORE200E_USE_TASKLET is not set
CONFIG_ATM_FORE200E_TX_RETRY=16
CONFIG_ATM_FORE200E_DEBUG=0
CONFIG_ATM_HE=m
CONFIG_ATM_HE_USE_SUNI=y
CONFIG_ATM_SOLOS=m

#
# CAIF transport drivers
#
CONFIG_VHOST_NET=m
CONFIG_VHOST_SCSI=m
CONFIG_VHOST_RING=m
CONFIG_VHOST=m

#
# Distributed Switch Architecture drivers
#
# CONFIG_NET_DSA_MV88E6XXX is not set
# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set
CONFIG_ETHERNET=y
CONFIG_MDIO=m
CONFIG_NET_VENDOR_3COM=y
CONFIG_PCMCIA_3C574=m
CONFIG_PCMCIA_3C589=m
CONFIG_VORTEX=m
CONFIG_TYPHOON=m
CONFIG_NET_VENDOR_ADAPTEC=y
CONFIG_ADAPTEC_STARFIRE=m
CONFIG_NET_VENDOR_AGERE=y
CONFIG_ET131X=m
CONFIG_NET_VENDOR_ALTEON=y
CONFIG_ACENIC=m
# CONFIG_ACENIC_OMIT_TIGON_I is not set
# CONFIG_ALTERA_TSE is not set
CONFIG_NET_VENDOR_AMD=y
CONFIG_AMD8111_ETH=m
CONFIG_PCNET32=m
CONFIG_PCMCIA_NMCLAN=m
# CONFIG_NET_VENDOR_ARC is not set
CONFIG_NET_VENDOR_ATHEROS=y
CONFIG_ATL2=m
CONFIG_ATL1=m
CONFIG_ATL1E=m
CONFIG_ATL1C=m
CONFIG_ALX=m
CONFIG_NET_CADENCE=y
# CONFIG_MACB is not set
CONFIG_NET_VENDOR_BROADCOM=y
CONFIG_B44=m
CONFIG_B44_PCI_AUTOSELECT=y
CONFIG_B44_PCICORE_AUTOSELECT=y
CONFIG_B44_PCI=y
# CONFIG_BCMGENET is not set
CONFIG_BNX2=m
CONFIG_CNIC=m
CONFIG_TIGON3=m
CONFIG_BNX2X=m
CONFIG_BNX2X_SRIOV=y
CONFIG_NET_VENDOR_BROCADE=y
CONFIG_BNA=m
CONFIG_NET_VENDOR_CHELSIO=y
CONFIG_CHELSIO_T1=m
CONFIG_CHELSIO_T1_1G=y
CONFIG_CHELSIO_T3=m
CONFIG_CHELSIO_T4=m
CONFIG_CHELSIO_T4_DCB=y
# CONFIG_CHELSIO_T4_FCOE is not set
CONFIG_CHELSIO_T4VF=m
CONFIG_NET_VENDOR_CISCO=y
CONFIG_ENIC=m
# CONFIG_CX_ECAT is not set
# CONFIG_DNET is not set
CONFIG_NET_VENDOR_DEC=y
CONFIG_NET_TULIP=y
CONFIG_DE2104X=m
CONFIG_DE2104X_DSL=0
CONFIG_TULIP=m
# CONFIG_TULIP_MWI is not set
# CONFIG_TULIP_MMIO is not set
CONFIG_TULIP_NAPI=y
CONFIG_TULIP_NAPI_HW_MITIGATION=y
# CONFIG_DE4X5 is not set
CONFIG_WINBOND_840=m
CONFIG_DM9102=m
CONFIG_ULI526X=m
CONFIG_PCMCIA_XIRCOM=m
CONFIG_NET_VENDOR_DLINK=y
CONFIG_DL2K=m
CONFIG_SUNDANCE=m
# CONFIG_SUNDANCE_MMIO is not set
CONFIG_NET_VENDOR_EMULEX=y
CONFIG_BE2NET=m
CONFIG_BE2NET_VXLAN=y
CONFIG_NET_VENDOR_EXAR=y
CONFIG_S2IO=m
CONFIG_VXGE=m
# CONFIG_VXGE_DEBUG_TRACE_ALL is not set
CONFIG_NET_VENDOR_FUJITSU=y
CONFIG_PCMCIA_FMVJ18X=m
CONFIG_NET_VENDOR_HP=y
CONFIG_HP100=m
CONFIG_NET_VENDOR_INTEL=y
CONFIG_E100=m
CONFIG_E1000=m
CONFIG_E1000E=m
CONFIG_IGB=m
CONFIG_IGB_HWMON=y
CONFIG_IGB_DCA=y
CONFIG_IGBVF=m
CONFIG_IXGB=m
CONFIG_IXGBE=m
CONFIG_IXGBE_VXLAN=y
CONFIG_IXGBE_HWMON=y
CONFIG_IXGBE_DCA=y
CONFIG_IXGBE_DCB=y
CONFIG_IXGBEVF=m
CONFIG_I40E=m
CONFIG_I40E_VXLAN=y
CONFIG_I40E_DCB=y
CONFIG_I40E_FCOE=y
CONFIG_I40EVF=m
# CONFIG_FM10K is not set
CONFIG_NET_VENDOR_I825XX=y
CONFIG_IP1000=m
CONFIG_JME=m
CONFIG_NET_VENDOR_MARVELL=y
# CONFIG_MVMDIO is not set
CONFIG_SKGE=m
# CONFIG_SKGE_DEBUG is not set
CONFIG_SKGE_GENESIS=y
CONFIG_SKY2=m
# CONFIG_SKY2_DEBUG is not set
CONFIG_NET_VENDOR_MELLANOX=y
CONFIG_MLX4_EN=m
CONFIG_MLX4_EN_DCB=y
CONFIG_MLX4_EN_VXLAN=y
CONFIG_MLX4_CORE=m
CONFIG_MLX4_DEBUG=y
CONFIG_MLX5_CORE=m
CONFIG_NET_VENDOR_MICREL=y
# CONFIG_KS8842 is not set
# CONFIG_KS8851 is not set
# CONFIG_KS8851_MLL is not set
CONFIG_KSZ884X_PCI=m
CONFIG_NET_VENDOR_MICROCHIP=y
# CONFIG_ENC28J60 is not set
CONFIG_NET_VENDOR_MYRI=y
CONFIG_MYRI10GE=m
CONFIG_MYRI10GE_DCA=y
CONFIG_FEALNX=m
CONFIG_NET_VENDOR_NATSEMI=y
CONFIG_NATSEMI=m
CONFIG_NS83820=m
CONFIG_NET_VENDOR_8390=y
CONFIG_PCMCIA_AXNET=m
CONFIG_NE2K_PCI=m
CONFIG_PCMCIA_PCNET=m
CONFIG_NET_VENDOR_NVIDIA=y
CONFIG_FORCEDETH=m
CONFIG_NET_VENDOR_OKI=y
# CONFIG_ETHOC is not set
CONFIG_NET_PACKET_ENGINE=y
CONFIG_HAMACHI=m
CONFIG_YELLOWFIN=m
CONFIG_NET_VENDOR_QLOGIC=y
CONFIG_QLA3XXX=m
CONFIG_QLCNIC=m
CONFIG_QLCNIC_SRIOV=y
CONFIG_QLCNIC_DCB=y
CONFIG_QLCNIC_VXLAN=y
CONFIG_QLCNIC_HWMON=y
CONFIG_QLGE=m
CONFIG_NETXEN_NIC=m
CONFIG_NET_VENDOR_QUALCOMM=y
CONFIG_NET_VENDOR_REALTEK=y
# CONFIG_ATP is not set
CONFIG_8139CP=m
CONFIG_8139TOO=m
# CONFIG_8139TOO_PIO is not set
CONFIG_8139TOO_TUNE_TWISTER=y
CONFIG_8139TOO_8129=y
# CONFIG_8139_OLD_RX_RESET is not set
CONFIG_R8169=m
CONFIG_NET_VENDOR_RDC=y
CONFIG_R6040=m
CONFIG_NET_VENDOR_ROCKER=y
CONFIG_NET_VENDOR_SAMSUNG=y
# CONFIG_SXGBE_ETH is not set
# CONFIG_NET_VENDOR_SEEQ is not set
CONFIG_NET_VENDOR_SILAN=y
CONFIG_SC92031=m
CONFIG_NET_VENDOR_SIS=y
CONFIG_SIS900=m
CONFIG_SIS190=m
CONFIG_SFC=m
CONFIG_SFC_MTD=y
CONFIG_SFC_MCDI_MON=y
CONFIG_SFC_SRIOV=y
CONFIG_NET_VENDOR_SMSC=y
CONFIG_PCMCIA_SMC91C92=m
CONFIG_EPIC100=m
# CONFIG_SMSC911X is not set
CONFIG_SMSC9420=m
CONFIG_NET_VENDOR_STMICRO=y
# CONFIG_STMMAC_ETH is not set
CONFIG_NET_VENDOR_SUN=y
CONFIG_HAPPYMEAL=m
CONFIG_SUNGEM=m
CONFIG_CASSINI=m
CONFIG_NIU=m
CONFIG_NET_VENDOR_TEHUTI=y
CONFIG_TEHUTI=m
CONFIG_NET_VENDOR_TI=y
# CONFIG_TI_CPSW_ALE is not set
CONFIG_TLAN=m
CONFIG_NET_VENDOR_VIA=y
CONFIG_VIA_RHINE=m
# CONFIG_VIA_RHINE_MMIO is not set
CONFIG_VIA_VELOCITY=m
CONFIG_NET_VENDOR_WIZNET=y
# CONFIG_WIZNET_W5100 is not set
# CONFIG_WIZNET_W5300 is not set
CONFIG_NET_VENDOR_XIRCOM=y
CONFIG_PCMCIA_XIRC2PS=m
CONFIG_FDDI=y
CONFIG_DEFXX=m
# CONFIG_DEFXX_MMIO is not set
CONFIG_SKFP=m
CONFIG_HIPPI=y
CONFIG_ROADRUNNER=m
# CONFIG_ROADRUNNER_LARGE_RINGS is not set
CONFIG_NET_SB1000=m
CONFIG_PHYLIB=m

#
# MII PHY device drivers
#
CONFIG_AT803X_PHY=m
CONFIG_AMD_PHY=m
CONFIG_MARVELL_PHY=m
CONFIG_DAVICOM_PHY=m
CONFIG_QSEMI_PHY=m
CONFIG_LXT_PHY=m
CONFIG_CICADA_PHY=m
CONFIG_VITESSE_PHY=m
CONFIG_SMSC_PHY=m
CONFIG_BROADCOM_PHY=m
# CONFIG_BCM7XXX_PHY is not set
CONFIG_BCM87XX_PHY=m
CONFIG_ICPLUS_PHY=m
CONFIG_REALTEK_PHY=m
CONFIG_NATIONAL_PHY=m
CONFIG_STE10XP=m
CONFIG_LSI_ET1011C_PHY=m
CONFIG_MICREL_PHY=m
# CONFIG_FIXED_PHY is not set
# CONFIG_MDIO_BITBANG is not set
# CONFIG_MDIO_BCM_UNIMAC is not set
# CONFIG_MICREL_KS8995MA is not set
CONFIG_PLIP=m
CONFIG_PPP=m
CONFIG_PPP_BSDCOMP=m
CONFIG_PPP_DEFLATE=m
CONFIG_PPP_FILTER=y
CONFIG_PPP_MPPE=m
CONFIG_PPP_MULTILINK=y
CONFIG_PPPOATM=m
CONFIG_PPPOE=m
CONFIG_PPTP=m
CONFIG_PPPOL2TP=m
CONFIG_PPP_ASYNC=m
CONFIG_PPP_SYNC_TTY=m
CONFIG_SLIP=m
CONFIG_SLHC=m
CONFIG_SLIP_COMPRESSED=y
CONFIG_SLIP_SMART=y
CONFIG_SLIP_MODE_SLIP6=y

#
# Host-side USB support is needed for USB Network Adapter support
#
CONFIG_USB_NET_DRIVERS=m
CONFIG_USB_CATC=m
CONFIG_USB_KAWETH=m
CONFIG_USB_PEGASUS=m
CONFIG_USB_RTL8150=m
CONFIG_USB_RTL8152=m
CONFIG_USB_USBNET=m
CONFIG_USB_NET_AX8817X=m
CONFIG_USB_NET_AX88179_178A=m
CONFIG_USB_NET_CDCETHER=m
CONFIG_USB_NET_CDC_EEM=m
CONFIG_USB_NET_CDC_NCM=m
CONFIG_USB_NET_HUAWEI_CDC_NCM=m
CONFIG_USB_NET_CDC_MBIM=m
CONFIG_USB_NET_DM9601=m
CONFIG_USB_NET_SR9700=m
CONFIG_USB_NET_SR9800=m
CONFIG_USB_NET_SMSC75XX=m
CONFIG_USB_NET_SMSC95XX=m
CONFIG_USB_NET_GL620A=m
CONFIG_USB_NET_NET1080=m
CONFIG_USB_NET_PLUSB=m
CONFIG_USB_NET_MCS7830=m
CONFIG_USB_NET_RNDIS_HOST=m
CONFIG_USB_NET_CDC_SUBSET=m
CONFIG_USB_ALI_M5632=y
CONFIG_USB_AN2720=y
CONFIG_USB_BELKIN=y
CONFIG_USB_ARMLINUX=y
CONFIG_USB_EPSON2888=y
CONFIG_USB_KC2190=y
CONFIG_USB_NET_ZAURUS=m
CONFIG_USB_NET_CX82310_ETH=m
CONFIG_USB_NET_KALMIA=m
CONFIG_USB_NET_QMI_WWAN=m
CONFIG_USB_HSO=m
CONFIG_USB_NET_INT51X1=m
CONFIG_USB_CDC_PHONET=m
CONFIG_USB_IPHETH=m
CONFIG_USB_SIERRA_NET=m
CONFIG_USB_VL600=m
CONFIG_WLAN=y
CONFIG_PCMCIA_RAYCS=m
CONFIG_LIBERTAS_THINFIRM=m
# CONFIG_LIBERTAS_THINFIRM_DEBUG is not set
CONFIG_LIBERTAS_THINFIRM_USB=m
CONFIG_AIRO=m
CONFIG_ATMEL=m
CONFIG_PCI_ATMEL=m
CONFIG_PCMCIA_ATMEL=m
CONFIG_AT76C50X_USB=m
CONFIG_AIRO_CS=m
CONFIG_PCMCIA_WL3501=m
# CONFIG_PRISM54 is not set
CONFIG_USB_ZD1201=m
CONFIG_USB_NET_RNDIS_WLAN=m
CONFIG_RTL8180=m
CONFIG_RTL8187=m
CONFIG_RTL8187_LEDS=y
CONFIG_ADM8211=m
CONFIG_MAC80211_HWSIM=m
CONFIG_MWL8K=m
CONFIG_ATH_COMMON=m
CONFIG_ATH_CARDS=m
# CONFIG_ATH_DEBUG is not set
CONFIG_ATH5K=m
# CONFIG_ATH5K_DEBUG is not set
# CONFIG_ATH5K_TRACER is not set
CONFIG_ATH5K_PCI=y
CONFIG_ATH9K_HW=m
CONFIG_ATH9K_COMMON=m
CONFIG_ATH9K_BTCOEX_SUPPORT=y
CONFIG_ATH9K=m
CONFIG_ATH9K_PCI=y
# CONFIG_ATH9K_AHB is not set
# CONFIG_ATH9K_DEBUGFS is not set
# CONFIG_ATH9K_DYNACK is not set
# CONFIG_ATH9K_WOW is not set
CONFIG_ATH9K_RFKILL=y
# CONFIG_ATH9K_CHANNEL_CONTEXT is not set
CONFIG_ATH9K_PCOEM=y
CONFIG_ATH9K_HTC=m
# CONFIG_ATH9K_HTC_DEBUGFS is not set
CONFIG_CARL9170=m
CONFIG_CARL9170_LEDS=y
CONFIG_CARL9170_WPC=y
# CONFIG_CARL9170_HWRNG is not set
CONFIG_ATH6KL=m
CONFIG_ATH6KL_SDIO=m
CONFIG_ATH6KL_USB=m
# CONFIG_ATH6KL_DEBUG is not set
# CONFIG_ATH6KL_TRACING is not set
CONFIG_AR5523=m
CONFIG_WIL6210=m
CONFIG_WIL6210_ISR_COR=y
CONFIG_WIL6210_TRACING=y
CONFIG_ATH10K=m
CONFIG_ATH10K_PCI=m
# CONFIG_ATH10K_DEBUG is not set
# CONFIG_ATH10K_DEBUGFS is not set
# CONFIG_ATH10K_TRACING is not set
# CONFIG_WCN36XX is not set
CONFIG_B43=m
CONFIG_B43_BCMA=y
CONFIG_B43_SSB=y
CONFIG_B43_BUSES_BCMA_AND_SSB=y
# CONFIG_B43_BUSES_BCMA is not set
# CONFIG_B43_BUSES_SSB is not set
CONFIG_B43_PCI_AUTOSELECT=y
CONFIG_B43_PCICORE_AUTOSELECT=y
CONFIG_B43_PCMCIA=y
CONFIG_B43_SDIO=y
CONFIG_B43_BCMA_PIO=y
CONFIG_B43_PIO=y
CONFIG_B43_PHY_G=y
CONFIG_B43_PHY_N=y
CONFIG_B43_PHY_LP=y
CONFIG_B43_PHY_HT=y
CONFIG_B43_LEDS=y
CONFIG_B43_HWRNG=y
# CONFIG_B43_DEBUG is not set
CONFIG_B43LEGACY=m
CONFIG_B43LEGACY_PCI_AUTOSELECT=y
CONFIG_B43LEGACY_PCICORE_AUTOSELECT=y
CONFIG_B43LEGACY_LEDS=y
CONFIG_B43LEGACY_HWRNG=y
CONFIG_B43LEGACY_DEBUG=y
CONFIG_B43LEGACY_DMA=y
CONFIG_B43LEGACY_PIO=y
CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y
# CONFIG_B43LEGACY_DMA_MODE is not set
# CONFIG_B43LEGACY_PIO_MODE is not set
CONFIG_BRCMUTIL=m
CONFIG_BRCMSMAC=m
CONFIG_BRCMFMAC=m
CONFIG_BRCMFMAC_PROTO_BCDC=y
CONFIG_BRCMFMAC_PROTO_MSGBUF=y
CONFIG_BRCMFMAC_SDIO=y
CONFIG_BRCMFMAC_USB=y
CONFIG_BRCMFMAC_PCIE=y
# CONFIG_BRCM_TRACING is not set
# CONFIG_BRCMDBG is not set
CONFIG_HOSTAP=m
CONFIG_HOSTAP_FIRMWARE=y
# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set
CONFIG_HOSTAP_PLX=m
CONFIG_HOSTAP_PCI=m
CONFIG_HOSTAP_CS=m
# CONFIG_IPW2100 is not set
CONFIG_IPW2200=m
CONFIG_IPW2200_MONITOR=y
CONFIG_IPW2200_RADIOTAP=y
CONFIG_IPW2200_PROMISCUOUS=y
CONFIG_IPW2200_QOS=y
# CONFIG_IPW2200_DEBUG is not set
CONFIG_LIBIPW=m
# CONFIG_LIBIPW_DEBUG is not set
CONFIG_IWLWIFI=m
CONFIG_IWLWIFI_LEDS=y
CONFIG_IWLDVM=m
CONFIG_IWLMVM=m
CONFIG_IWLWIFI_OPMODE_MODULAR=y
# CONFIG_IWLWIFI_BCAST_FILTERING is not set
# CONFIG_IWLWIFI_UAPSD is not set

#
# Debugging Options
#
# CONFIG_IWLWIFI_DEBUG is not set
# CONFIG_IWLWIFI_DEVICE_TRACING is not set
CONFIG_IWLEGACY=m
CONFIG_IWL4965=m
CONFIG_IWL3945=m

#
# iwl3945 / iwl4965 Debugging Options
#
# CONFIG_IWLEGACY_DEBUG is not set
CONFIG_LIBERTAS=m
CONFIG_LIBERTAS_USB=m
CONFIG_LIBERTAS_CS=m
CONFIG_LIBERTAS_SDIO=m
# CONFIG_LIBERTAS_SPI is not set
# CONFIG_LIBERTAS_DEBUG is not set
CONFIG_LIBERTAS_MESH=y
CONFIG_HERMES=m
# CONFIG_HERMES_PRISM is not set
CONFIG_HERMES_CACHE_FW_ON_INIT=y
CONFIG_PLX_HERMES=m
CONFIG_TMD_HERMES=m
CONFIG_NORTEL_HERMES=m
CONFIG_PCMCIA_HERMES=m
CONFIG_PCMCIA_SPECTRUM=m
CONFIG_ORINOCO_USB=m
CONFIG_P54_COMMON=m
CONFIG_P54_USB=m
CONFIG_P54_PCI=m
# CONFIG_P54_SPI is not set
CONFIG_P54_LEDS=y
CONFIG_RT2X00=m
CONFIG_RT2400PCI=m
CONFIG_RT2500PCI=m
CONFIG_RT61PCI=m
CONFIG_RT2800PCI=m
CONFIG_RT2800PCI_RT33XX=y
CONFIG_RT2800PCI_RT35XX=y
CONFIG_RT2800PCI_RT53XX=y
CONFIG_RT2800PCI_RT3290=y
CONFIG_RT2500USB=m
CONFIG_RT73USB=m
CONFIG_RT2800USB=m
CONFIG_RT2800USB_RT33XX=y
CONFIG_RT2800USB_RT35XX=y
CONFIG_RT2800USB_RT3573=y
CONFIG_RT2800USB_RT53XX=y
CONFIG_RT2800USB_RT55XX=y
# CONFIG_RT2800USB_UNKNOWN is not set
CONFIG_RT2800_LIB=m
CONFIG_RT2800_LIB_MMIO=m
CONFIG_RT2X00_LIB_MMIO=m
CONFIG_RT2X00_LIB_PCI=m
CONFIG_RT2X00_LIB_USB=m
CONFIG_RT2X00_LIB=m
CONFIG_RT2X00_LIB_FIRMWARE=y
CONFIG_RT2X00_LIB_CRYPTO=y
CONFIG_RT2X00_LIB_LEDS=y
# CONFIG_RT2X00_DEBUG is not set
CONFIG_RTL_CARDS=m
CONFIG_RTL8192CE=m
CONFIG_RTL8192SE=m
CONFIG_RTL8192DE=m
CONFIG_RTL8723AE=m
CONFIG_RTL8723BE=m
CONFIG_RTL8188EE=m
CONFIG_RTL8192EE=m
CONFIG_RTL8821AE=m
CONFIG_RTL8192CU=m
CONFIG_RTLWIFI=m
CONFIG_RTLWIFI_PCI=m
CONFIG_RTLWIFI_USB=m
# CONFIG_RTLWIFI_DEBUG is not set
CONFIG_RTL8192C_COMMON=m
CONFIG_RTL8723_COMMON=m
CONFIG_RTLBTCOEXIST=m
# CONFIG_WL_TI is not set
CONFIG_ZD1211RW=m
# CONFIG_ZD1211RW_DEBUG is not set
CONFIG_MWIFIEX=m
CONFIG_MWIFIEX_SDIO=m
CONFIG_MWIFIEX_PCIE=m
CONFIG_MWIFIEX_USB=m
# CONFIG_CW1200 is not set
CONFIG_RSI_91X=m
CONFIG_RSI_DEBUGFS=y
# CONFIG_RSI_SDIO is not set
CONFIG_RSI_USB=m

#
# WiMAX Wireless Broadband devices
#
CONFIG_WIMAX_I2400M=m
CONFIG_WIMAX_I2400M_USB=m
CONFIG_WIMAX_I2400M_DEBUG_LEVEL=8
CONFIG_WAN=y
CONFIG_LANMEDIA=m
CONFIG_HDLC=m
CONFIG_HDLC_RAW=m
CONFIG_HDLC_RAW_ETH=m
CONFIG_HDLC_CISCO=m
CONFIG_HDLC_FR=m
CONFIG_HDLC_PPP=m
# CONFIG_HDLC_X25 is not set
CONFIG_PCI200SYN=m
CONFIG_WANXL=m
# CONFIG_PC300TOO is not set
CONFIG_FARSYNC=m
CONFIG_DSCC4=m
CONFIG_DSCC4_PCISYNC=y
CONFIG_DSCC4_PCI_RST=y
CONFIG_DLCI=m
CONFIG_DLCI_MAX=8
# CONFIG_SBNI is not set
CONFIG_IEEE802154_DRIVERS=m
CONFIG_XEN_NETDEV_FRONTEND=m
CONFIG_XEN_NETDEV_BACKEND=m
CONFIG_VMXNET3=m
CONFIG_HYPERV_NET=m
CONFIG_ISDN=y
# CONFIG_ISDN_I4L is not set
CONFIG_ISDN_CAPI=m
CONFIG_CAPI_TRACE=y
CONFIG_ISDN_CAPI_CAPI20=m
CONFIG_ISDN_CAPI_MIDDLEWARE=y

#
# CAPI hardware drivers
#
CONFIG_CAPI_AVM=y
CONFIG_ISDN_DRV_AVMB1_B1PCI=m
CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y
CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m
CONFIG_ISDN_DRV_AVMB1_AVM_CS=m
CONFIG_ISDN_DRV_AVMB1_T1PCI=m
CONFIG_ISDN_DRV_AVMB1_C4=m
CONFIG_CAPI_EICON=y
CONFIG_ISDN_DIVAS=m
CONFIG_ISDN_DIVAS_BRIPCI=y
CONFIG_ISDN_DIVAS_PRIPCI=y
CONFIG_ISDN_DIVAS_DIVACAPI=m
CONFIG_ISDN_DIVAS_USERIDI=m
CONFIG_ISDN_DIVAS_MAINT=m
CONFIG_ISDN_DRV_GIGASET=m
CONFIG_GIGASET_CAPI=y
# CONFIG_GIGASET_DUMMYLL is not set
CONFIG_GIGASET_BASE=m
CONFIG_GIGASET_M105=m
CONFIG_GIGASET_M101=m
# CONFIG_GIGASET_DEBUG is not set
CONFIG_HYSDN=m
CONFIG_HYSDN_CAPI=y
CONFIG_MISDN=m
CONFIG_MISDN_DSP=m
CONFIG_MISDN_L1OIP=m

#
# mISDN hardware drivers
#
CONFIG_MISDN_HFCPCI=m
CONFIG_MISDN_HFCMULTI=m
CONFIG_MISDN_HFCUSB=m
CONFIG_MISDN_AVMFRITZ=m
CONFIG_MISDN_SPEEDFAX=m
CONFIG_MISDN_INFINEON=m
CONFIG_MISDN_W6692=m
# CONFIG_MISDN_NETJET is not set
CONFIG_MISDN_IPAC=m
CONFIG_MISDN_ISAR=m

#
# Input device support
#
CONFIG_INPUT=y
CONFIG_INPUT_FF_MEMLESS=m
CONFIG_INPUT_POLLDEV=m
CONFIG_INPUT_SPARSEKMAP=m
# CONFIG_INPUT_MATRIXKMAP is not set

#
# Userland interfaces
#
CONFIG_INPUT_MOUSEDEV=y
CONFIG_INPUT_MOUSEDEV_PSAUX=y
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
CONFIG_INPUT_JOYDEV=m
CONFIG_INPUT_EVDEV=m
# CONFIG_INPUT_EVBUG is not set

#
# Input Device Drivers
#
CONFIG_INPUT_KEYBOARD=y
CONFIG_KEYBOARD_ADP5588=m
# CONFIG_KEYBOARD_ADP5589 is not set
CONFIG_KEYBOARD_ATKBD=y
# CONFIG_KEYBOARD_QT1070 is not set
CONFIG_KEYBOARD_QT2160=m
CONFIG_KEYBOARD_LKKBD=m
# CONFIG_KEYBOARD_GPIO is not set
# CONFIG_KEYBOARD_GPIO_POLLED is not set
# CONFIG_KEYBOARD_TCA6416 is not set
# CONFIG_KEYBOARD_TCA8418 is not set
# CONFIG_KEYBOARD_MATRIX is not set
CONFIG_KEYBOARD_LM8323=m
# CONFIG_KEYBOARD_LM8333 is not set
CONFIG_KEYBOARD_MAX7359=m
# CONFIG_KEYBOARD_MCS is not set
# CONFIG_KEYBOARD_MPR121 is not set
CONFIG_KEYBOARD_NEWTON=m
CONFIG_KEYBOARD_OPENCORES=m
# CONFIG_KEYBOARD_SAMSUNG is not set
CONFIG_KEYBOARD_STOWAWAY=m
CONFIG_KEYBOARD_SUNKBD=m
CONFIG_KEYBOARD_XTKBD=m
CONFIG_INPUT_MOUSE=y
CONFIG_MOUSE_PS2=m
CONFIG_MOUSE_PS2_ALPS=y
CONFIG_MOUSE_PS2_LOGIPS2PP=y
CONFIG_MOUSE_PS2_SYNAPTICS=y
CONFIG_MOUSE_PS2_CYPRESS=y
CONFIG_MOUSE_PS2_LIFEBOOK=y
CONFIG_MOUSE_PS2_TRACKPOINT=y
CONFIG_MOUSE_PS2_ELANTECH=y
CONFIG_MOUSE_PS2_SENTELIC=y
# CONFIG_MOUSE_PS2_TOUCHKIT is not set
CONFIG_MOUSE_PS2_FOCALTECH=y
# CONFIG_MOUSE_PS2_VMMOUSE is not set
CONFIG_MOUSE_SERIAL=m
CONFIG_MOUSE_APPLETOUCH=m
CONFIG_MOUSE_BCM5974=m
CONFIG_MOUSE_CYAPA=m
# CONFIG_MOUSE_ELAN_I2C is not set
CONFIG_MOUSE_VSXXXAA=m
# CONFIG_MOUSE_GPIO is not set
CONFIG_MOUSE_SYNAPTICS_I2C=m
CONFIG_MOUSE_SYNAPTICS_USB=m
CONFIG_INPUT_JOYSTICK=y
CONFIG_JOYSTICK_ANALOG=m
CONFIG_JOYSTICK_A3D=m
CONFIG_JOYSTICK_ADI=m
CONFIG_JOYSTICK_COBRA=m
CONFIG_JOYSTICK_GF2K=m
CONFIG_JOYSTICK_GRIP=m
CONFIG_JOYSTICK_GRIP_MP=m
CONFIG_JOYSTICK_GUILLEMOT=m
CONFIG_JOYSTICK_INTERACT=m
CONFIG_JOYSTICK_SIDEWINDER=m
CONFIG_JOYSTICK_TMDC=m
CONFIG_JOYSTICK_IFORCE=m
CONFIG_JOYSTICK_IFORCE_USB=y
CONFIG_JOYSTICK_IFORCE_232=y
CONFIG_JOYSTICK_WARRIOR=m
CONFIG_JOYSTICK_MAGELLAN=m
CONFIG_JOYSTICK_SPACEORB=m
CONFIG_JOYSTICK_SPACEBALL=m
CONFIG_JOYSTICK_STINGER=m
CONFIG_JOYSTICK_TWIDJOY=m
CONFIG_JOYSTICK_ZHENHUA=m
CONFIG_JOYSTICK_DB9=m
CONFIG_JOYSTICK_GAMECON=m
CONFIG_JOYSTICK_TURBOGRAFX=m
# CONFIG_JOYSTICK_AS5011 is not set
CONFIG_JOYSTICK_JOYDUMP=m
CONFIG_JOYSTICK_XPAD=m
CONFIG_JOYSTICK_XPAD_FF=y
CONFIG_JOYSTICK_XPAD_LEDS=y
CONFIG_JOYSTICK_WALKERA0701=m
CONFIG_INPUT_TABLET=y
CONFIG_TABLET_USB_ACECAD=m
CONFIG_TABLET_USB_AIPTEK=m
CONFIG_TABLET_USB_GTCO=m
CONFIG_TABLET_USB_HANWANG=m
CONFIG_TABLET_USB_KBTAB=m
CONFIG_TABLET_SERIAL_WACOM4=m
CONFIG_INPUT_TOUCHSCREEN=y
CONFIG_TOUCHSCREEN_ADS7846=m
CONFIG_TOUCHSCREEN_AD7877=m
CONFIG_TOUCHSCREEN_AD7879=m
CONFIG_TOUCHSCREEN_AD7879_I2C=m
# CONFIG_TOUCHSCREEN_AD7879_SPI is not set
CONFIG_TOUCHSCREEN_ATMEL_MXT=m
# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
# CONFIG_TOUCHSCREEN_BU21013 is not set
# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set
# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set
CONFIG_TOUCHSCREEN_DYNAPRO=m
CONFIG_TOUCHSCREEN_HAMPSHIRE=m
CONFIG_TOUCHSCREEN_EETI=m
CONFIG_TOUCHSCREEN_FUJITSU=m
# CONFIG_TOUCHSCREEN_GOODIX is not set
# CONFIG_TOUCHSCREEN_ILI210X is not set
CONFIG_TOUCHSCREEN_GUNZE=m
# CONFIG_TOUCHSCREEN_ELAN is not set
CONFIG_TOUCHSCREEN_ELO=m
CONFIG_TOUCHSCREEN_WACOM_W8001=m
# CONFIG_TOUCHSCREEN_WACOM_I2C is not set
# CONFIG_TOUCHSCREEN_MAX11801 is not set
CONFIG_TOUCHSCREEN_MCS5000=m
# CONFIG_TOUCHSCREEN_MMS114 is not set
CONFIG_TOUCHSCREEN_MTOUCH=m
CONFIG_TOUCHSCREEN_INEXIO=m
CONFIG_TOUCHSCREEN_MK712=m
CONFIG_TOUCHSCREEN_PENMOUNT=m
# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set
CONFIG_TOUCHSCREEN_TOUCHRIGHT=m
CONFIG_TOUCHSCREEN_TOUCHWIN=m
# CONFIG_TOUCHSCREEN_PIXCIR is not set
CONFIG_TOUCHSCREEN_WM97XX=m
CONFIG_TOUCHSCREEN_WM9705=y
CONFIG_TOUCHSCREEN_WM9712=y
CONFIG_TOUCHSCREEN_WM9713=y
CONFIG_TOUCHSCREEN_USB_COMPOSITE=m
CONFIG_TOUCHSCREEN_USB_EGALAX=y
CONFIG_TOUCHSCREEN_USB_PANJIT=y
CONFIG_TOUCHSCREEN_USB_3M=y
CONFIG_TOUCHSCREEN_USB_ITM=y
CONFIG_TOUCHSCREEN_USB_ETURBO=y
CONFIG_TOUCHSCREEN_USB_GUNZE=y
CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y
CONFIG_TOUCHSCREEN_USB_IRTOUCH=y
CONFIG_TOUCHSCREEN_USB_IDEALTEK=y
CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y
CONFIG_TOUCHSCREEN_USB_GOTOP=y
CONFIG_TOUCHSCREEN_USB_JASTEC=y
CONFIG_TOUCHSCREEN_USB_ELO=y
CONFIG_TOUCHSCREEN_USB_E2I=y
CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y
CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y
CONFIG_TOUCHSCREEN_USB_NEXIO=y
CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y
CONFIG_TOUCHSCREEN_TOUCHIT213=m
CONFIG_TOUCHSCREEN_TSC_SERIO=m
# CONFIG_TOUCHSCREEN_TSC2005 is not set
CONFIG_TOUCHSCREEN_TSC2007=m
# CONFIG_TOUCHSCREEN_ST1232 is not set
CONFIG_TOUCHSCREEN_SUR40=m
# CONFIG_TOUCHSCREEN_SX8654 is not set
CONFIG_TOUCHSCREEN_TPS6507X=m
# CONFIG_TOUCHSCREEN_ZFORCE is not set
CONFIG_INPUT_MISC=y
# CONFIG_INPUT_AD714X is not set
# CONFIG_INPUT_BMA150 is not set
# CONFIG_INPUT_E3X0_BUTTON is not set
CONFIG_INPUT_PCSPKR=m
# CONFIG_INPUT_MMA8450 is not set
# CONFIG_INPUT_MPU3050 is not set
CONFIG_INPUT_APANEL=m
# CONFIG_INPUT_GP2A is not set
# CONFIG_INPUT_GPIO_BEEPER is not set
# CONFIG_INPUT_GPIO_TILT_POLLED is not set
CONFIG_INPUT_ATLAS_BTNS=m
CONFIG_INPUT_ATI_REMOTE2=m
CONFIG_INPUT_KEYSPAN_REMOTE=m
# CONFIG_INPUT_KXTJ9 is not set
CONFIG_INPUT_POWERMATE=m
CONFIG_INPUT_YEALINK=m
CONFIG_INPUT_CM109=m
CONFIG_INPUT_UINPUT=m
# CONFIG_INPUT_PCF8574 is not set
# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set
# CONFIG_INPUT_ADXL34X is not set
# CONFIG_INPUT_IMS_PCU is not set
# CONFIG_INPUT_CMA3000 is not set
CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y
CONFIG_INPUT_IDEAPAD_SLIDEBAR=m
# CONFIG_INPUT_DRV260X_HAPTICS is not set
# CONFIG_INPUT_DRV2667_HAPTICS is not set

#
# Hardware I/O ports
#
CONFIG_SERIO=y
CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y
CONFIG_SERIO_I8042=y
CONFIG_SERIO_SERPORT=m
CONFIG_SERIO_CT82C710=m
CONFIG_SERIO_PARKBD=m
CONFIG_SERIO_PCIPS2=m
CONFIG_SERIO_LIBPS2=y
CONFIG_SERIO_RAW=m
CONFIG_SERIO_ALTERA_PS2=m
# CONFIG_SERIO_PS2MULT is not set
# CONFIG_SERIO_ARC_PS2 is not set
CONFIG_HYPERV_KEYBOARD=m
CONFIG_GAMEPORT=m
CONFIG_GAMEPORT_NS558=m
CONFIG_GAMEPORT_L4=m
CONFIG_GAMEPORT_EMU10K1=m
CONFIG_GAMEPORT_FM801=m

#
# Character devices
#
CONFIG_TTY=y
CONFIG_VT=y
CONFIG_CONSOLE_TRANSLATIONS=y
CONFIG_VT_CONSOLE=y
CONFIG_VT_CONSOLE_SLEEP=y
CONFIG_HW_CONSOLE=y
CONFIG_VT_HW_CONSOLE_BINDING=y
CONFIG_UNIX98_PTYS=y
CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
# CONFIG_LEGACY_PTYS is not set
CONFIG_SERIAL_NONSTANDARD=y
CONFIG_ROCKETPORT=m
CONFIG_CYCLADES=m
# CONFIG_CYZ_INTR is not set
CONFIG_MOXA_INTELLIO=m
CONFIG_MOXA_SMARTIO=m
CONFIG_SYNCLINK=m
CONFIG_SYNCLINKMP=m
CONFIG_SYNCLINK_GT=m
CONFIG_NOZOMI=m
CONFIG_ISI=m
CONFIG_N_HDLC=m
CONFIG_N_GSM=m
# CONFIG_TRACE_SINK is not set
CONFIG_DEVMEM=y
# CONFIG_DEVKMEM is not set

#
# Serial drivers
#
CONFIG_SERIAL_EARLYCON=y
CONFIG_SERIAL_8250=y
# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set
CONFIG_SERIAL_8250_PNP=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_DMA=y
CONFIG_SERIAL_8250_PCI=y
CONFIG_SERIAL_8250_CS=m
CONFIG_SERIAL_8250_NR_UARTS=32
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_SHARE_IRQ=y
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
CONFIG_SERIAL_8250_RSA=y
CONFIG_SERIAL_8250_DW=y
CONFIG_SERIAL_8250_FINTEK=m

#
# Non-8250 serial port support
#
# CONFIG_SERIAL_MAX3100 is not set
# CONFIG_SERIAL_MAX310X is not set
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_SERIAL_JSM=m
# CONFIG_SERIAL_SCCNXP is not set
# CONFIG_SERIAL_SC16IS7XX is not set
# CONFIG_SERIAL_ALTERA_JTAGUART is not set
# CONFIG_SERIAL_ALTERA_UART is not set
# CONFIG_SERIAL_IFX6X60 is not set
# CONFIG_SERIAL_ARC is not set
CONFIG_SERIAL_RP2=m
CONFIG_SERIAL_RP2_NR_UARTS=32
# CONFIG_SERIAL_FSL_LPUART is not set
# CONFIG_TTY_PRINTK is not set
CONFIG_PRINTER=m
# CONFIG_LP_CONSOLE is not set
CONFIG_PPDEV=m
CONFIG_HVC_DRIVER=y
CONFIG_HVC_IRQ=y
CONFIG_HVC_XEN=y
CONFIG_HVC_XEN_FRONTEND=y
CONFIG_VIRTIO_CONSOLE=m
CONFIG_IPMI_HANDLER=m
# CONFIG_IPMI_PANIC_EVENT is not set
CONFIG_IPMI_DEVICE_INTERFACE=m
CONFIG_IPMI_SI=m
# CONFIG_IPMI_SI_PROBE_DEFAULTS is not set
# CONFIG_IPMI_SSIF is not set
CONFIG_IPMI_WATCHDOG=m
CONFIG_IPMI_POWEROFF=m
CONFIG_HW_RANDOM=m
# CONFIG_HW_RANDOM_TIMERIOMEM is not set
CONFIG_HW_RANDOM_INTEL=m
CONFIG_HW_RANDOM_AMD=m
CONFIG_HW_RANDOM_VIA=m
CONFIG_HW_RANDOM_VIRTIO=m
CONFIG_HW_RANDOM_TPM=m
CONFIG_NVRAM=m
CONFIG_R3964=m
CONFIG_APPLICOM=m

#
# PCMCIA character devices
#
CONFIG_SYNCLINK_CS=m
CONFIG_CARDMAN_4000=m
CONFIG_CARDMAN_4040=m
CONFIG_IPWIRELESS=m
CONFIG_MWAVE=m
CONFIG_RAW_DRIVER=m
CONFIG_MAX_RAW_DEVS=256
CONFIG_HPET=y
CONFIG_HPET_MMAP=y
CONFIG_HPET_MMAP_DEFAULT=y
CONFIG_HANGCHECK_TIMER=m
CONFIG_TCG_TPM=m
CONFIG_TCG_TIS=m
CONFIG_TCG_TIS_I2C_ATMEL=m
CONFIG_TCG_TIS_I2C_INFINEON=m
CONFIG_TCG_TIS_I2C_NUVOTON=m
CONFIG_TCG_NSC=m
CONFIG_TCG_ATMEL=m
CONFIG_TCG_INFINEON=m
CONFIG_TCG_XEN=m
CONFIG_TCG_CRB=m
CONFIG_TCG_TIS_ST33ZP24=m
CONFIG_TCG_TIS_ST33ZP24_I2C=m
# CONFIG_TCG_TIS_ST33ZP24_SPI is not set
CONFIG_TELCLOCK=m
CONFIG_DEVPORT=y
# CONFIG_XILLYBUS is not set

#
# I2C support
#
CONFIG_I2C=y
CONFIG_ACPI_I2C_OPREGION=y
CONFIG_I2C_BOARDINFO=y
CONFIG_I2C_COMPAT=y
CONFIG_I2C_CHARDEV=m
CONFIG_I2C_MUX=m

#
# Multiplexer I2C Chip support
#
# CONFIG_I2C_MUX_GPIO is not set
# CONFIG_I2C_MUX_PCA9541 is not set
# CONFIG_I2C_MUX_PCA954x is not set
# CONFIG_I2C_MUX_PINCTRL is not set
CONFIG_I2C_HELPER_AUTO=y
CONFIG_I2C_SMBUS=m
CONFIG_I2C_ALGOBIT=m
CONFIG_I2C_ALGOPCA=m

#
# I2C Hardware Bus support
#

#
# PC SMBus host controller drivers
#
CONFIG_I2C_ALI1535=m
CONFIG_I2C_ALI1563=m
CONFIG_I2C_ALI15X3=m
CONFIG_I2C_AMD756=m
CONFIG_I2C_AMD756_S4882=m
CONFIG_I2C_AMD8111=m
CONFIG_I2C_I801=m
CONFIG_I2C_ISCH=m
CONFIG_I2C_ISMT=m
CONFIG_I2C_PIIX4=m
CONFIG_I2C_NFORCE2=m
CONFIG_I2C_NFORCE2_S4985=m
CONFIG_I2C_SIS5595=m
CONFIG_I2C_SIS630=m
CONFIG_I2C_SIS96X=m
CONFIG_I2C_VIA=m
CONFIG_I2C_VIAPRO=m

#
# ACPI drivers
#
CONFIG_I2C_SCMI=m

#
# I2C system bus drivers (mostly embedded / system-on-chip)
#
# CONFIG_I2C_CBUS_GPIO is not set
CONFIG_I2C_DESIGNWARE_CORE=m
CONFIG_I2C_DESIGNWARE_PLATFORM=m
CONFIG_I2C_DESIGNWARE_PCI=m
# CONFIG_I2C_GPIO is not set
CONFIG_I2C_KEMPLD=m
CONFIG_I2C_OCORES=m
CONFIG_I2C_PCA_PLATFORM=m
# CONFIG_I2C_PXA_PCI is not set
CONFIG_I2C_SIMTEC=m
# CONFIG_I2C_XILINX is not set

#
# External I2C/SMBus adapter drivers
#
CONFIG_I2C_DIOLAN_U2C=m
CONFIG_I2C_PARPORT=m
CONFIG_I2C_PARPORT_LIGHT=m
CONFIG_I2C_ROBOTFUZZ_OSIF=m
CONFIG_I2C_TAOS_EVM=m
CONFIG_I2C_TINY_USB=m
CONFIG_I2C_VIPERBOARD=m

#
# Other I2C/SMBus bus drivers
#
CONFIG_I2C_STUB=m
# CONFIG_I2C_SLAVE is not set
# CONFIG_I2C_DEBUG_CORE is not set
# CONFIG_I2C_DEBUG_ALGO is not set
# CONFIG_I2C_DEBUG_BUS is not set
CONFIG_SPI=y
# CONFIG_SPI_DEBUG is not set
CONFIG_SPI_MASTER=y

#
# SPI Master Controller Drivers
#
# CONFIG_SPI_ALTERA is not set
CONFIG_SPI_BITBANG=m
CONFIG_SPI_BUTTERFLY=m
# CONFIG_SPI_CADENCE is not set
# CONFIG_SPI_GPIO is not set
CONFIG_SPI_LM70_LLP=m
# CONFIG_SPI_OC_TINY is not set
# CONFIG_SPI_PXA2XX is not set
# CONFIG_SPI_PXA2XX_PCI is not set
# CONFIG_SPI_SC18IS602 is not set
# CONFIG_SPI_XCOMM is not set
# CONFIG_SPI_XILINX is not set
# CONFIG_SPI_DESIGNWARE is not set

#
# SPI Protocol Masters
#
# CONFIG_SPI_SPIDEV is not set
# CONFIG_SPI_TLE62X0 is not set
# CONFIG_SPMI is not set
# CONFIG_HSI is not set

#
# PPS support
#
CONFIG_PPS=m
# CONFIG_PPS_DEBUG is not set
# CONFIG_NTP_PPS is not set

#
# PPS clients support
#
# CONFIG_PPS_CLIENT_KTIMER is not set
CONFIG_PPS_CLIENT_LDISC=m
CONFIG_PPS_CLIENT_PARPORT=m
# CONFIG_PPS_CLIENT_GPIO is not set

#
# PPS generators support
#

#
# PTP clock support
#
CONFIG_PTP_1588_CLOCK=m

#
# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
#
CONFIG_PINCTRL=y

#
# Pin controllers
#
# CONFIG_DEBUG_PINCTRL is not set
# CONFIG_PINCTRL_AMD is not set
# CONFIG_PINCTRL_BAYTRAIL is not set
# CONFIG_PINCTRL_CHERRYVIEW is not set
# CONFIG_PINCTRL_SUNRISEPOINT is not set
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
CONFIG_GPIOLIB=y
CONFIG_GPIO_DEVRES=y
CONFIG_GPIO_ACPI=y
# CONFIG_DEBUG_GPIO is not set
# CONFIG_GPIO_SYSFS is not set

#
# Memory mapped GPIO drivers
#
# CONFIG_GPIO_DWAPB is not set
# CONFIG_GPIO_F7188X is not set
# CONFIG_GPIO_GENERIC_PLATFORM is not set
# CONFIG_GPIO_ICH is not set
# CONFIG_GPIO_IT8761E is not set
# CONFIG_GPIO_LYNXPOINT is not set
# CONFIG_GPIO_SCH is not set
# CONFIG_GPIO_SCH311X is not set
# CONFIG_GPIO_VX855 is not set

#
# I2C GPIO expanders
#
# CONFIG_GPIO_ADP5588 is not set
# CONFIG_GPIO_MAX7300 is not set
# CONFIG_GPIO_MAX732X is not set
# CONFIG_GPIO_PCA953X is not set
# CONFIG_GPIO_PCF857X is not set
# CONFIG_GPIO_SX150X is not set

#
# MFD GPIO expanders
#
CONFIG_GPIO_KEMPLD=m

#
# PCI GPIO expanders
#
# CONFIG_GPIO_AMD8111 is not set
# CONFIG_GPIO_INTEL_MID is not set
CONFIG_GPIO_ML_IOH=m
# CONFIG_GPIO_RDC321X is not set

#
# SPI GPIO expanders
#
# CONFIG_GPIO_MAX7301 is not set
# CONFIG_GPIO_MCP23S08 is not set
# CONFIG_GPIO_MC33880 is not set

#
# USB GPIO expanders
#
CONFIG_GPIO_VIPERBOARD=m
CONFIG_W1=m
CONFIG_W1_CON=y

#
# 1-wire Bus Masters
#
CONFIG_W1_MASTER_MATROX=m
CONFIG_W1_MASTER_DS2490=m
CONFIG_W1_MASTER_DS2482=m
# CONFIG_W1_MASTER_DS1WM is not set
# CONFIG_W1_MASTER_GPIO is not set

#
# 1-wire Slaves
#
CONFIG_W1_SLAVE_THERM=m
CONFIG_W1_SLAVE_SMEM=m
# CONFIG_W1_SLAVE_DS2408 is not set
# CONFIG_W1_SLAVE_DS2413 is not set
# CONFIG_W1_SLAVE_DS2406 is not set
# CONFIG_W1_SLAVE_DS2423 is not set
CONFIG_W1_SLAVE_DS2431=m
CONFIG_W1_SLAVE_DS2433=m
# CONFIG_W1_SLAVE_DS2433_CRC is not set
# CONFIG_W1_SLAVE_DS2760 is not set
# CONFIG_W1_SLAVE_DS2780 is not set
# CONFIG_W1_SLAVE_DS2781 is not set
# CONFIG_W1_SLAVE_DS28E04 is not set
CONFIG_W1_SLAVE_BQ27000=m
CONFIG_POWER_SUPPLY=y
# CONFIG_POWER_SUPPLY_DEBUG is not set
# CONFIG_PDA_POWER is not set
# CONFIG_GENERIC_ADC_BATTERY is not set
# CONFIG_TEST_POWER is not set
# CONFIG_BATTERY_DS2780 is not set
# CONFIG_BATTERY_DS2781 is not set
# CONFIG_BATTERY_DS2782 is not set
CONFIG_BATTERY_SBS=m
# CONFIG_BATTERY_BQ27x00 is not set
# CONFIG_BATTERY_MAX17040 is not set
# CONFIG_BATTERY_MAX17042 is not set
# CONFIG_CHARGER_MAX8903 is not set
# CONFIG_CHARGER_LP8727 is not set
# CONFIG_CHARGER_GPIO is not set
# CONFIG_CHARGER_BQ2415X is not set
# CONFIG_CHARGER_BQ24190 is not set
# CONFIG_CHARGER_BQ24735 is not set
# CONFIG_CHARGER_SMB347 is not set
# CONFIG_BATTERY_GAUGE_LTC2941 is not set
# CONFIG_POWER_RESET is not set
# CONFIG_POWER_AVS is not set
CONFIG_HWMON=y
CONFIG_HWMON_VID=m
# CONFIG_HWMON_DEBUG_CHIP is not set

#
# Native drivers
#
CONFIG_SENSORS_ABITUGURU=m
CONFIG_SENSORS_ABITUGURU3=m
# CONFIG_SENSORS_AD7314 is not set
CONFIG_SENSORS_AD7414=m
CONFIG_SENSORS_AD7418=m
CONFIG_SENSORS_ADM1021=m
CONFIG_SENSORS_ADM1025=m
CONFIG_SENSORS_ADM1026=m
CONFIG_SENSORS_ADM1029=m
CONFIG_SENSORS_ADM1031=m
CONFIG_SENSORS_ADM9240=m
# CONFIG_SENSORS_ADT7310 is not set
# CONFIG_SENSORS_ADT7410 is not set
CONFIG_SENSORS_ADT7411=m
CONFIG_SENSORS_ADT7462=m
CONFIG_SENSORS_ADT7470=m
CONFIG_SENSORS_ADT7475=m
CONFIG_SENSORS_ASC7621=m
CONFIG_SENSORS_K8TEMP=m
CONFIG_SENSORS_K10TEMP=m
CONFIG_SENSORS_FAM15H_POWER=m
CONFIG_SENSORS_APPLESMC=m
CONFIG_SENSORS_ASB100=m
CONFIG_SENSORS_ATXP1=m
CONFIG_SENSORS_DS620=m
CONFIG_SENSORS_DS1621=m
CONFIG_SENSORS_I5K_AMB=m
CONFIG_SENSORS_F71805F=m
CONFIG_SENSORS_F71882FG=m
CONFIG_SENSORS_F75375S=m
CONFIG_SENSORS_FSCHMD=m
CONFIG_SENSORS_GL518SM=m
CONFIG_SENSORS_GL520SM=m
CONFIG_SENSORS_G760A=m
# CONFIG_SENSORS_G762 is not set
# CONFIG_SENSORS_GPIO_FAN is not set
# CONFIG_SENSORS_HIH6130 is not set
CONFIG_SENSORS_IBMAEM=m
CONFIG_SENSORS_IBMPEX=m
# CONFIG_SENSORS_IIO_HWMON is not set
# CONFIG_SENSORS_I5500 is not set
CONFIG_SENSORS_CORETEMP=m
CONFIG_SENSORS_IT87=m
CONFIG_SENSORS_JC42=m
# CONFIG_SENSORS_POWR1220 is not set
CONFIG_SENSORS_LINEAGE=m
# CONFIG_SENSORS_LTC2945 is not set
CONFIG_SENSORS_LTC4151=m
CONFIG_SENSORS_LTC4215=m
# CONFIG_SENSORS_LTC4222 is not set
CONFIG_SENSORS_LTC4245=m
# CONFIG_SENSORS_LTC4260 is not set
CONFIG_SENSORS_LTC4261=m
CONFIG_SENSORS_MAX1111=m
CONFIG_SENSORS_MAX16065=m
CONFIG_SENSORS_MAX1619=m
CONFIG_SENSORS_MAX1668=m
# CONFIG_SENSORS_MAX197 is not set
CONFIG_SENSORS_MAX6639=m
CONFIG_SENSORS_MAX6642=m
CONFIG_SENSORS_MAX6650=m
# CONFIG_SENSORS_MAX6697 is not set
# CONFIG_SENSORS_HTU21 is not set
# CONFIG_SENSORS_MCP3021 is not set
CONFIG_SENSORS_MENF21BMC_HWMON=m
CONFIG_SENSORS_ADCXX=m
CONFIG_SENSORS_LM63=m
CONFIG_SENSORS_LM70=m
CONFIG_SENSORS_LM73=m
CONFIG_SENSORS_LM75=m
CONFIG_SENSORS_LM77=m
CONFIG_SENSORS_LM78=m
CONFIG_SENSORS_LM80=m
CONFIG_SENSORS_LM83=m
CONFIG_SENSORS_LM85=m
CONFIG_SENSORS_LM87=m
CONFIG_SENSORS_LM90=m
CONFIG_SENSORS_LM92=m
CONFIG_SENSORS_LM93=m
# CONFIG_SENSORS_LM95234 is not set
CONFIG_SENSORS_LM95241=m
CONFIG_SENSORS_LM95245=m
CONFIG_SENSORS_PC87360=m
CONFIG_SENSORS_PC87427=m
CONFIG_SENSORS_NTC_THERMISTOR=m
CONFIG_SENSORS_NCT6683=m
CONFIG_SENSORS_NCT6775=m
# CONFIG_SENSORS_NCT7802 is not set
# CONFIG_SENSORS_NCT7904 is not set
CONFIG_SENSORS_PCF8591=m
# CONFIG_PMBUS is not set
# CONFIG_SENSORS_SHT15 is not set
CONFIG_SENSORS_SHT21=m
# CONFIG_SENSORS_SHTC1 is not set
CONFIG_SENSORS_SIS5595=m
CONFIG_SENSORS_DME1737=m
CONFIG_SENSORS_EMC1403=m
CONFIG_SENSORS_EMC2103=m
CONFIG_SENSORS_EMC6W201=m
CONFIG_SENSORS_SMSC47M1=m
CONFIG_SENSORS_SMSC47M192=m
CONFIG_SENSORS_SMSC47B397=m
CONFIG_SENSORS_SCH56XX_COMMON=m
CONFIG_SENSORS_SCH5627=m
CONFIG_SENSORS_SCH5636=m
CONFIG_SENSORS_SMM665=m
# CONFIG_SENSORS_ADC128D818 is not set
CONFIG_SENSORS_ADS1015=m
CONFIG_SENSORS_ADS7828=m
CONFIG_SENSORS_ADS7871=m
CONFIG_SENSORS_AMC6821=m
# CONFIG_SENSORS_INA209 is not set
# CONFIG_SENSORS_INA2XX is not set
CONFIG_SENSORS_THMC50=m
CONFIG_SENSORS_TMP102=m
# CONFIG_SENSORS_TMP103 is not set
CONFIG_SENSORS_TMP401=m
CONFIG_SENSORS_TMP421=m
CONFIG_SENSORS_VIA_CPUTEMP=m
CONFIG_SENSORS_VIA686A=m
CONFIG_SENSORS_VT1211=m
CONFIG_SENSORS_VT8231=m
CONFIG_SENSORS_W83781D=m
CONFIG_SENSORS_W83791D=m
CONFIG_SENSORS_W83792D=m
CONFIG_SENSORS_W83793=m
CONFIG_SENSORS_W83795=m
# CONFIG_SENSORS_W83795_FANCTRL is not set
CONFIG_SENSORS_W83L785TS=m
CONFIG_SENSORS_W83L786NG=m
CONFIG_SENSORS_W83627HF=m
CONFIG_SENSORS_W83627EHF=m

#
# ACPI drivers
#
CONFIG_SENSORS_ACPI_POWER=m
CONFIG_SENSORS_ATK0110=m
CONFIG_THERMAL=m
CONFIG_THERMAL_HWMON=y
CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set
# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set
CONFIG_THERMAL_GOV_FAIR_SHARE=y
CONFIG_THERMAL_GOV_STEP_WISE=y
CONFIG_THERMAL_GOV_BANG_BANG=y
CONFIG_THERMAL_GOV_USER_SPACE=y
# CONFIG_THERMAL_EMULATION is not set
CONFIG_INTEL_POWERCLAMP=m
CONFIG_X86_PKG_TEMP_THERMAL=m
# CONFIG_INTEL_SOC_DTS_THERMAL is not set
CONFIG_INT340X_THERMAL=m
CONFIG_ACPI_THERMAL_REL=m

#
# Texas Instruments thermal drivers
#
CONFIG_WATCHDOG=y
CONFIG_WATCHDOG_CORE=y
# CONFIG_WATCHDOG_NOWAYOUT is not set

#
# Watchdog Device Drivers
#
CONFIG_SOFT_WATCHDOG=m
CONFIG_MENF21BMC_WATCHDOG=m
# CONFIG_XILINX_WATCHDOG is not set
# CONFIG_CADENCE_WATCHDOG is not set
# CONFIG_DW_WATCHDOG is not set
CONFIG_ACQUIRE_WDT=m
CONFIG_ADVANTECH_WDT=m
CONFIG_ALIM1535_WDT=m
CONFIG_ALIM7101_WDT=m
CONFIG_F71808E_WDT=m
CONFIG_SP5100_TCO=m
CONFIG_SBC_FITPC2_WATCHDOG=m
CONFIG_EUROTECH_WDT=m
CONFIG_IB700_WDT=m
CONFIG_IBMASR=m
CONFIG_WAFER_WDT=m
CONFIG_I6300ESB_WDT=m
CONFIG_IE6XX_WDT=m
CONFIG_ITCO_WDT=m
CONFIG_ITCO_VENDOR_SUPPORT=y
CONFIG_IT8712F_WDT=m
CONFIG_IT87_WDT=m
CONFIG_HP_WATCHDOG=m
CONFIG_KEMPLD_WDT=m
CONFIG_HPWDT_NMI_DECODING=y
CONFIG_SC1200_WDT=m
CONFIG_PC87413_WDT=m
CONFIG_NV_TCO=m
CONFIG_60XX_WDT=m
CONFIG_CPU5_WDT=m
CONFIG_SMSC_SCH311X_WDT=m
CONFIG_SMSC37B787_WDT=m
CONFIG_VIA_WDT=m
CONFIG_W83627HF_WDT=m
CONFIG_W83877F_WDT=m
CONFIG_W83977F_WDT=m
CONFIG_MACHZ_WDT=m
CONFIG_SBC_EPX_C3_WATCHDOG=m
# CONFIG_MEN_A21_WDT is not set
CONFIG_XEN_WDT=m

#
# PCI-based Watchdog Cards
#
CONFIG_PCIPCWATCHDOG=m
CONFIG_WDTPCI=m

#
# USB-based Watchdog Cards
#
CONFIG_USBPCWATCHDOG=m
CONFIG_SSB_POSSIBLE=y

#
# Sonics Silicon Backplane
#
CONFIG_SSB=m
CONFIG_SSB_SPROM=y
CONFIG_SSB_BLOCKIO=y
CONFIG_SSB_PCIHOST_POSSIBLE=y
CONFIG_SSB_PCIHOST=y
CONFIG_SSB_B43_PCI_BRIDGE=y
CONFIG_SSB_PCMCIAHOST_POSSIBLE=y
CONFIG_SSB_PCMCIAHOST=y
CONFIG_SSB_SDIOHOST_POSSIBLE=y
CONFIG_SSB_SDIOHOST=y
# CONFIG_SSB_SILENT is not set
# CONFIG_SSB_DEBUG is not set
CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y
CONFIG_SSB_DRIVER_PCICORE=y
# CONFIG_SSB_DRIVER_GPIO is not set
CONFIG_BCMA_POSSIBLE=y

#
# Broadcom specific AMBA
#
CONFIG_BCMA=m
CONFIG_BCMA_BLOCKIO=y
CONFIG_BCMA_HOST_PCI_POSSIBLE=y
CONFIG_BCMA_HOST_PCI=y
# CONFIG_BCMA_HOST_SOC is not set
CONFIG_BCMA_DRIVER_PCI=y
# CONFIG_BCMA_DRIVER_GMAC_CMN is not set
# CONFIG_BCMA_DRIVER_GPIO is not set
# CONFIG_BCMA_DEBUG is not set

#
# Multifunction device drivers
#
CONFIG_MFD_CORE=m
# CONFIG_MFD_AS3711 is not set
# CONFIG_PMIC_ADP5520 is not set
# CONFIG_MFD_AAT2870_CORE is not set
# CONFIG_MFD_BCM590XX is not set
# CONFIG_MFD_AXP20X is not set
# CONFIG_MFD_CROS_EC is not set
# CONFIG_PMIC_DA903X is not set
# CONFIG_MFD_DA9052_SPI is not set
# CONFIG_MFD_DA9052_I2C is not set
# CONFIG_MFD_DA9055 is not set
# CONFIG_MFD_DA9063 is not set
# CONFIG_MFD_DA9150 is not set
# CONFIG_MFD_DLN2 is not set
# CONFIG_MFD_MC13XXX_SPI is not set
# CONFIG_MFD_MC13XXX_I2C is not set
# CONFIG_HTC_PASIC3 is not set
# CONFIG_HTC_I2CPLD is not set
# CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set
CONFIG_LPC_ICH=m
CONFIG_LPC_SCH=m
# CONFIG_INTEL_SOC_PMIC is not set
# CONFIG_MFD_JANZ_CMODIO is not set
CONFIG_MFD_KEMPLD=m
# CONFIG_MFD_88PM800 is not set
# CONFIG_MFD_88PM805 is not set
# CONFIG_MFD_88PM860X is not set
# CONFIG_MFD_MAX14577 is not set
# CONFIG_MFD_MAX77693 is not set
# CONFIG_MFD_MAX77843 is not set
# CONFIG_MFD_MAX8907 is not set
# CONFIG_MFD_MAX8925 is not set
# CONFIG_MFD_MAX8997 is not set
# CONFIG_MFD_MAX8998 is not set
# CONFIG_MFD_MT6397 is not set
CONFIG_MFD_MENF21BMC=m
# CONFIG_EZX_PCAP is not set
CONFIG_MFD_VIPERBOARD=m
# CONFIG_MFD_RETU is not set
# CONFIG_MFD_PCF50633 is not set
# CONFIG_UCB1400_CORE is not set
# CONFIG_MFD_RDC321X is not set
CONFIG_MFD_RTSX_PCI=m
# CONFIG_MFD_RT5033 is not set
CONFIG_MFD_RTSX_USB=m
# CONFIG_MFD_RC5T583 is not set
# CONFIG_MFD_RN5T618 is not set
# CONFIG_MFD_SEC_CORE is not set
# CONFIG_MFD_SI476X_CORE is not set
# CONFIG_MFD_SM501 is not set
# CONFIG_MFD_SKY81452 is not set
# CONFIG_MFD_SMSC is not set
# CONFIG_ABX500_CORE is not set
# CONFIG_MFD_SYSCON is not set
# CONFIG_MFD_TI_AM335X_TSCADC is not set
# CONFIG_MFD_LP3943 is not set
# CONFIG_MFD_LP8788 is not set
# CONFIG_MFD_PALMAS is not set
# CONFIG_TPS6105X is not set
# CONFIG_TPS65010 is not set
# CONFIG_TPS6507X is not set
# CONFIG_MFD_TPS65090 is not set
# CONFIG_MFD_TPS65217 is not set
# CONFIG_MFD_TPS65218 is not set
# CONFIG_MFD_TPS6586X is not set
# CONFIG_MFD_TPS65910 is not set
# CONFIG_MFD_TPS65912 is not set
# CONFIG_MFD_TPS65912_I2C is not set
# CONFIG_MFD_TPS65912_SPI is not set
# CONFIG_MFD_TPS80031 is not set
# CONFIG_TWL4030_CORE is not set
# CONFIG_TWL6040_CORE is not set
# CONFIG_MFD_WL1273_CORE is not set
# CONFIG_MFD_LM3533 is not set
# CONFIG_MFD_TMIO is not set
# CONFIG_MFD_VX855 is not set
# CONFIG_MFD_ARIZONA_I2C is not set
# CONFIG_MFD_ARIZONA_SPI is not set
# CONFIG_MFD_WM8400 is not set
# CONFIG_MFD_WM831X_I2C is not set
# CONFIG_MFD_WM831X_SPI is not set
# CONFIG_MFD_WM8350_I2C is not set
# CONFIG_MFD_WM8994 is not set
# CONFIG_REGULATOR is not set
CONFIG_MEDIA_SUPPORT=m

#
# Multimedia core support
#
CONFIG_MEDIA_CAMERA_SUPPORT=y
CONFIG_MEDIA_ANALOG_TV_SUPPORT=y
CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y
CONFIG_MEDIA_RADIO_SUPPORT=y
CONFIG_MEDIA_SDR_SUPPORT=y
CONFIG_MEDIA_RC_SUPPORT=y
CONFIG_MEDIA_CONTROLLER=y
CONFIG_VIDEO_DEV=m
# CONFIG_VIDEO_V4L2_SUBDEV_API is not set
CONFIG_VIDEO_V4L2=m
# CONFIG_VIDEO_ADV_DEBUG is not set
# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
CONFIG_VIDEO_TUNER=m
CONFIG_VIDEOBUF_GEN=m
CONFIG_VIDEOBUF_DMA_SG=m
CONFIG_VIDEOBUF_VMALLOC=m
CONFIG_VIDEOBUF_DVB=m
CONFIG_VIDEOBUF2_CORE=m
CONFIG_VIDEOBUF2_MEMOPS=m
CONFIG_VIDEOBUF2_DMA_CONTIG=m
CONFIG_VIDEOBUF2_VMALLOC=m
CONFIG_VIDEOBUF2_DMA_SG=m
CONFIG_VIDEOBUF2_DVB=m
CONFIG_DVB_CORE=m
CONFIG_DVB_NET=y
CONFIG_TTPCI_EEPROM=m
CONFIG_DVB_MAX_ADAPTERS=8
CONFIG_DVB_DYNAMIC_MINORS=y

#
# Media drivers
#
CONFIG_RC_CORE=m
CONFIG_RC_MAP=m
CONFIG_RC_DECODERS=y
CONFIG_LIRC=m
CONFIG_IR_LIRC_CODEC=m
CONFIG_IR_NEC_DECODER=m
CONFIG_IR_RC5_DECODER=m
CONFIG_IR_RC6_DECODER=m
CONFIG_IR_JVC_DECODER=m
CONFIG_IR_SONY_DECODER=m
CONFIG_IR_SANYO_DECODER=m
CONFIG_IR_SHARP_DECODER=m
CONFIG_IR_MCE_KBD_DECODER=m
CONFIG_IR_XMP_DECODER=m
CONFIG_RC_DEVICES=y
CONFIG_RC_ATI_REMOTE=m
CONFIG_IR_ENE=m
# CONFIG_IR_HIX5HD2 is not set
CONFIG_IR_IMON=m
CONFIG_IR_MCEUSB=m
CONFIG_IR_ITE_CIR=m
CONFIG_IR_FINTEK=m
CONFIG_IR_NUVOTON=m
CONFIG_IR_REDRAT3=m
CONFIG_IR_STREAMZAP=m
CONFIG_IR_WINBOND_CIR=m
CONFIG_IR_IGORPLUGUSB=m
CONFIG_IR_IGUANA=m
CONFIG_IR_TTUSBIR=m
CONFIG_RC_LOOPBACK=m
# CONFIG_IR_GPIO_CIR is not set
CONFIG_MEDIA_USB_SUPPORT=y

#
# Webcam devices
#
CONFIG_USB_VIDEO_CLASS=m
CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
CONFIG_USB_GSPCA=m
CONFIG_USB_M5602=m
CONFIG_USB_STV06XX=m
CONFIG_USB_GL860=m
CONFIG_USB_GSPCA_BENQ=m
CONFIG_USB_GSPCA_CONEX=m
CONFIG_USB_GSPCA_CPIA1=m
CONFIG_USB_GSPCA_DTCS033=m
CONFIG_USB_GSPCA_ETOMS=m
CONFIG_USB_GSPCA_FINEPIX=m
CONFIG_USB_GSPCA_JEILINJ=m
CONFIG_USB_GSPCA_JL2005BCD=m
CONFIG_USB_GSPCA_KINECT=m
CONFIG_USB_GSPCA_KONICA=m
CONFIG_USB_GSPCA_MARS=m
CONFIG_USB_GSPCA_MR97310A=m
CONFIG_USB_GSPCA_NW80X=m
CONFIG_USB_GSPCA_OV519=m
CONFIG_USB_GSPCA_OV534=m
CONFIG_USB_GSPCA_OV534_9=m
CONFIG_USB_GSPCA_PAC207=m
CONFIG_USB_GSPCA_PAC7302=m
CONFIG_USB_GSPCA_PAC7311=m
CONFIG_USB_GSPCA_SE401=m
CONFIG_USB_GSPCA_SN9C2028=m
CONFIG_USB_GSPCA_SN9C20X=m
CONFIG_USB_GSPCA_SONIXB=m
CONFIG_USB_GSPCA_SONIXJ=m
CONFIG_USB_GSPCA_SPCA500=m
CONFIG_USB_GSPCA_SPCA501=m
CONFIG_USB_GSPCA_SPCA505=m
CONFIG_USB_GSPCA_SPCA506=m
CONFIG_USB_GSPCA_SPCA508=m
CONFIG_USB_GSPCA_SPCA561=m
CONFIG_USB_GSPCA_SPCA1528=m
CONFIG_USB_GSPCA_SQ905=m
CONFIG_USB_GSPCA_SQ905C=m
CONFIG_USB_GSPCA_SQ930X=m
CONFIG_USB_GSPCA_STK014=m
CONFIG_USB_GSPCA_STK1135=m
CONFIG_USB_GSPCA_STV0680=m
CONFIG_USB_GSPCA_SUNPLUS=m
CONFIG_USB_GSPCA_T613=m
CONFIG_USB_GSPCA_TOPRO=m
# CONFIG_USB_GSPCA_TOUPTEK is not set
CONFIG_USB_GSPCA_TV8532=m
CONFIG_USB_GSPCA_VC032X=m
CONFIG_USB_GSPCA_VICAM=m
CONFIG_USB_GSPCA_XIRLINK_CIT=m
CONFIG_USB_GSPCA_ZC3XX=m
CONFIG_USB_PWC=m
# CONFIG_USB_PWC_DEBUG is not set
CONFIG_USB_PWC_INPUT_EVDEV=y
CONFIG_VIDEO_CPIA2=m
CONFIG_USB_ZR364XX=m
CONFIG_USB_STKWEBCAM=m
CONFIG_USB_S2255=m
CONFIG_VIDEO_USBTV=m

#
# Analog TV USB devices
#
CONFIG_VIDEO_PVRUSB2=m
CONFIG_VIDEO_PVRUSB2_SYSFS=y
CONFIG_VIDEO_PVRUSB2_DVB=y
# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set
CONFIG_VIDEO_HDPVR=m
CONFIG_VIDEO_USBVISION=m
CONFIG_VIDEO_STK1160_COMMON=m
CONFIG_VIDEO_STK1160_AC97=y
CONFIG_VIDEO_STK1160=m
# CONFIG_VIDEO_GO7007 is not set

#
# Analog/digital TV USB devices
#
CONFIG_VIDEO_AU0828=m
CONFIG_VIDEO_AU0828_V4L2=y
CONFIG_VIDEO_AU0828_RC=y
CONFIG_VIDEO_CX231XX=m
CONFIG_VIDEO_CX231XX_RC=y
CONFIG_VIDEO_CX231XX_ALSA=m
CONFIG_VIDEO_CX231XX_DVB=m
CONFIG_VIDEO_TM6000=m
CONFIG_VIDEO_TM6000_ALSA=m
CONFIG_VIDEO_TM6000_DVB=m

#
# Digital TV USB devices
#
CONFIG_DVB_USB=m
# CONFIG_DVB_USB_DEBUG is not set
CONFIG_DVB_USB_A800=m
CONFIG_DVB_USB_DIBUSB_MB=m
CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y
CONFIG_DVB_USB_DIBUSB_MC=m
CONFIG_DVB_USB_DIB0700=m
CONFIG_DVB_USB_UMT_010=m
CONFIG_DVB_USB_CXUSB=m
CONFIG_DVB_USB_M920X=m
CONFIG_DVB_USB_DIGITV=m
CONFIG_DVB_USB_VP7045=m
CONFIG_DVB_USB_VP702X=m
CONFIG_DVB_USB_GP8PSK=m
CONFIG_DVB_USB_NOVA_T_USB2=m
CONFIG_DVB_USB_TTUSB2=m
CONFIG_DVB_USB_DTT200U=m
CONFIG_DVB_USB_OPERA1=m
CONFIG_DVB_USB_AF9005=m
CONFIG_DVB_USB_AF9005_REMOTE=m
CONFIG_DVB_USB_PCTV452E=m
CONFIG_DVB_USB_DW2102=m
CONFIG_DVB_USB_CINERGY_T2=m
CONFIG_DVB_USB_DTV5100=m
CONFIG_DVB_USB_FRIIO=m
CONFIG_DVB_USB_AZ6027=m
CONFIG_DVB_USB_TECHNISAT_USB2=m
CONFIG_DVB_USB_V2=m
CONFIG_DVB_USB_AF9015=m
CONFIG_DVB_USB_AF9035=m
CONFIG_DVB_USB_ANYSEE=m
CONFIG_DVB_USB_AU6610=m
CONFIG_DVB_USB_AZ6007=m
CONFIG_DVB_USB_CE6230=m
CONFIG_DVB_USB_EC168=m
CONFIG_DVB_USB_GL861=m
CONFIG_DVB_USB_LME2510=m
CONFIG_DVB_USB_MXL111SF=m
CONFIG_DVB_USB_RTL28XXU=m
CONFIG_DVB_USB_DVBSKY=m
CONFIG_DVB_TTUSB_BUDGET=m
CONFIG_DVB_TTUSB_DEC=m
CONFIG_SMS_USB_DRV=m
CONFIG_DVB_B2C2_FLEXCOP_USB=m
# CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set
CONFIG_DVB_AS102=m

#
# Webcam, TV (analog/digital) USB devices
#
CONFIG_VIDEO_EM28XX=m
CONFIG_VIDEO_EM28XX_V4L2=m
CONFIG_VIDEO_EM28XX_ALSA=m
CONFIG_VIDEO_EM28XX_DVB=m
CONFIG_VIDEO_EM28XX_RC=m

#
# Software defined radio USB devices
#
CONFIG_USB_AIRSPY=m
CONFIG_USB_HACKRF=m
CONFIG_USB_MSI2500=m
CONFIG_MEDIA_PCI_SUPPORT=y

#
# Media capture support
#
CONFIG_VIDEO_MEYE=m

#
# Media capture/analog TV support
#
CONFIG_VIDEO_IVTV=m
CONFIG_VIDEO_IVTV_ALSA=m
CONFIG_VIDEO_FB_IVTV=m
CONFIG_VIDEO_ZORAN=m
CONFIG_VIDEO_ZORAN_DC30=m
CONFIG_VIDEO_ZORAN_ZR36060=m
CONFIG_VIDEO_ZORAN_BUZ=m
CONFIG_VIDEO_ZORAN_DC10=m
CONFIG_VIDEO_ZORAN_LML33=m
CONFIG_VIDEO_ZORAN_LML33R10=m
CONFIG_VIDEO_ZORAN_AVS6EYES=m
CONFIG_VIDEO_HEXIUM_GEMINI=m
CONFIG_VIDEO_HEXIUM_ORION=m
CONFIG_VIDEO_MXB=m
CONFIG_VIDEO_SOLO6X10=m
CONFIG_VIDEO_TW68=m

#
# Media capture/analog/hybrid TV support
#
CONFIG_VIDEO_CX18=m
CONFIG_VIDEO_CX18_ALSA=m
CONFIG_VIDEO_CX23885=m
CONFIG_MEDIA_ALTERA_CI=m
# CONFIG_VIDEO_CX25821 is not set
CONFIG_VIDEO_CX88=m
CONFIG_VIDEO_CX88_ALSA=m
CONFIG_VIDEO_CX88_BLACKBIRD=m
CONFIG_VIDEO_CX88_DVB=m
CONFIG_VIDEO_CX88_ENABLE_VP3054=y
CONFIG_VIDEO_CX88_VP3054=m
CONFIG_VIDEO_CX88_MPEG=m
CONFIG_VIDEO_BT848=m
CONFIG_DVB_BT8XX=m
CONFIG_VIDEO_SAA7134=m
CONFIG_VIDEO_SAA7134_ALSA=m
CONFIG_VIDEO_SAA7134_RC=y
CONFIG_VIDEO_SAA7134_DVB=m
CONFIG_VIDEO_SAA7164=m

#
# Media digital TV PCI Adapters
#
CONFIG_DVB_AV7110_IR=y
CONFIG_DVB_AV7110=m
CONFIG_DVB_AV7110_OSD=y
CONFIG_DVB_BUDGET_CORE=m
CONFIG_DVB_BUDGET=m
CONFIG_DVB_BUDGET_CI=m
CONFIG_DVB_BUDGET_AV=m
CONFIG_DVB_BUDGET_PATCH=m
CONFIG_DVB_B2C2_FLEXCOP_PCI=m
# CONFIG_DVB_B2C2_FLEXCOP_PCI_DEBUG is not set
CONFIG_DVB_PLUTO2=m
CONFIG_DVB_DM1105=m
CONFIG_DVB_PT1=m
CONFIG_DVB_PT3=m
CONFIG_MANTIS_CORE=m
CONFIG_DVB_MANTIS=m
CONFIG_DVB_HOPPER=m
CONFIG_DVB_NGENE=m
CONFIG_DVB_DDBRIDGE=m
CONFIG_DVB_SMIPCIE=m
CONFIG_V4L_PLATFORM_DRIVERS=y
CONFIG_VIDEO_CAFE_CCIC=m
CONFIG_VIDEO_VIA_CAMERA=m
# CONFIG_SOC_CAMERA is not set
CONFIG_V4L_MEM2MEM_DRIVERS=y
# CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set
# CONFIG_VIDEO_SH_VEU is not set
CONFIG_V4L_TEST_DRIVERS=y
CONFIG_VIDEO_VIVID=m
# CONFIG_VIDEO_VIM2M is not set

#
# Supported MMC/SDIO adapters
#
CONFIG_SMS_SDIO_DRV=m
CONFIG_RADIO_ADAPTERS=y
CONFIG_RADIO_TEA575X=m
CONFIG_RADIO_SI470X=y
CONFIG_USB_SI470X=m
# CONFIG_I2C_SI470X is not set
# CONFIG_RADIO_SI4713 is not set
CONFIG_USB_MR800=m
CONFIG_USB_DSBR=m
CONFIG_RADIO_MAXIRADIO=m
CONFIG_RADIO_SHARK=m
CONFIG_RADIO_SHARK2=m
CONFIG_USB_KEENE=m
CONFIG_USB_RAREMONO=m
CONFIG_USB_MA901=m
# CONFIG_RADIO_TEA5764 is not set
# CONFIG_RADIO_SAA7706H is not set
# CONFIG_RADIO_TEF6862 is not set
# CONFIG_RADIO_WL1273 is not set

#
# Texas Instruments WL128x FM driver (ST based)
#

#
# Supported FireWire (IEEE 1394) Adapters
#
CONFIG_DVB_FIREDTV=m
CONFIG_DVB_FIREDTV_INPUT=y
CONFIG_MEDIA_COMMON_OPTIONS=y

#
# common driver options
#
CONFIG_VIDEO_CX2341X=m
CONFIG_VIDEO_TVEEPROM=m
CONFIG_CYPRESS_FIRMWARE=m
CONFIG_DVB_B2C2_FLEXCOP=m
CONFIG_VIDEO_SAA7146=m
CONFIG_VIDEO_SAA7146_VV=m
CONFIG_SMS_SIANO_MDTV=m
CONFIG_SMS_SIANO_RC=y
# CONFIG_SMS_SIANO_DEBUGFS is not set

#
# Media ancillary drivers (tuners, sensors, i2c, frontends)
#
CONFIG_MEDIA_SUBDRV_AUTOSELECT=y
CONFIG_MEDIA_ATTACH=y
CONFIG_VIDEO_IR_I2C=m

#
# Audio decoders, processors and mixers
#
CONFIG_VIDEO_TVAUDIO=m
CONFIG_VIDEO_TDA7432=m
CONFIG_VIDEO_TDA9840=m
CONFIG_VIDEO_TEA6415C=m
CONFIG_VIDEO_TEA6420=m
CONFIG_VIDEO_MSP3400=m
CONFIG_VIDEO_CS5345=m
CONFIG_VIDEO_CS53L32A=m
CONFIG_VIDEO_WM8775=m
CONFIG_VIDEO_WM8739=m
CONFIG_VIDEO_VP27SMPX=m

#
# RDS decoders
#
CONFIG_VIDEO_SAA6588=m

#
# Video decoders
#
CONFIG_VIDEO_BT819=m
CONFIG_VIDEO_BT856=m
CONFIG_VIDEO_BT866=m
CONFIG_VIDEO_KS0127=m
CONFIG_VIDEO_SAA7110=m
CONFIG_VIDEO_SAA711X=m
CONFIG_VIDEO_TVP5150=m
CONFIG_VIDEO_VPX3220=m

#
# Video and audio decoders
#
CONFIG_VIDEO_SAA717X=m
CONFIG_VIDEO_CX25840=m

#
# Video encoders
#
CONFIG_VIDEO_SAA7127=m
CONFIG_VIDEO_SAA7185=m
CONFIG_VIDEO_ADV7170=m
CONFIG_VIDEO_ADV7175=m

#
# Camera sensor devices
#
CONFIG_VIDEO_OV7670=m
CONFIG_VIDEO_MT9V011=m

#
# Flash devices
#

#
# Video improvement chips
#
CONFIG_VIDEO_UPD64031A=m
CONFIG_VIDEO_UPD64083=m

#
# Audio/Video compression chips
#
CONFIG_VIDEO_SAA6752HS=m

#
# Miscellaneous helper chips
#
CONFIG_VIDEO_M52790=m

#
# Sensors used on soc_camera driver
#
CONFIG_MEDIA_TUNER=m
CONFIG_MEDIA_TUNER_SIMPLE=m
CONFIG_MEDIA_TUNER_TDA8290=m
CONFIG_MEDIA_TUNER_TDA827X=m
CONFIG_MEDIA_TUNER_TDA18271=m
CONFIG_MEDIA_TUNER_TDA9887=m
CONFIG_MEDIA_TUNER_TEA5761=m
CONFIG_MEDIA_TUNER_TEA5767=m
CONFIG_MEDIA_TUNER_MSI001=m
CONFIG_MEDIA_TUNER_MT20XX=m
CONFIG_MEDIA_TUNER_MT2060=m
CONFIG_MEDIA_TUNER_MT2063=m
CONFIG_MEDIA_TUNER_MT2266=m
CONFIG_MEDIA_TUNER_MT2131=m
CONFIG_MEDIA_TUNER_QT1010=m
CONFIG_MEDIA_TUNER_XC2028=m
CONFIG_MEDIA_TUNER_XC5000=m
CONFIG_MEDIA_TUNER_XC4000=m
CONFIG_MEDIA_TUNER_MXL5005S=m
CONFIG_MEDIA_TUNER_MXL5007T=m
CONFIG_MEDIA_TUNER_MC44S803=m
CONFIG_MEDIA_TUNER_MAX2165=m
CONFIG_MEDIA_TUNER_TDA18218=m
CONFIG_MEDIA_TUNER_FC0011=m
CONFIG_MEDIA_TUNER_FC0012=m
CONFIG_MEDIA_TUNER_FC0013=m
CONFIG_MEDIA_TUNER_TDA18212=m
CONFIG_MEDIA_TUNER_E4000=m
CONFIG_MEDIA_TUNER_FC2580=m
CONFIG_MEDIA_TUNER_M88RS6000T=m
CONFIG_MEDIA_TUNER_TUA9001=m
CONFIG_MEDIA_TUNER_SI2157=m
CONFIG_MEDIA_TUNER_IT913X=m
CONFIG_MEDIA_TUNER_R820T=m
CONFIG_MEDIA_TUNER_MXL301RF=m
CONFIG_MEDIA_TUNER_QM1D1C0042=m

#
# Multistandard (satellite) frontends
#
CONFIG_DVB_STB0899=m
CONFIG_DVB_STB6100=m
CONFIG_DVB_STV090x=m
CONFIG_DVB_STV6110x=m
CONFIG_DVB_M88DS3103=m

#
# Multistandard (cable + terrestrial) frontends
#
CONFIG_DVB_DRXK=m
CONFIG_DVB_TDA18271C2DD=m
CONFIG_DVB_SI2165=m

#
# DVB-S (satellite) frontends
#
CONFIG_DVB_CX24110=m
CONFIG_DVB_CX24123=m
CONFIG_DVB_MT312=m
CONFIG_DVB_ZL10036=m
CONFIG_DVB_ZL10039=m
CONFIG_DVB_S5H1420=m
CONFIG_DVB_STV0288=m
CONFIG_DVB_STB6000=m
CONFIG_DVB_STV0299=m
CONFIG_DVB_STV6110=m
CONFIG_DVB_STV0900=m
CONFIG_DVB_TDA8083=m
CONFIG_DVB_TDA10086=m
CONFIG_DVB_TDA8261=m
CONFIG_DVB_VES1X93=m
CONFIG_DVB_TUNER_ITD1000=m
CONFIG_DVB_TUNER_CX24113=m
CONFIG_DVB_TDA826X=m
CONFIG_DVB_TUA6100=m
CONFIG_DVB_CX24116=m
CONFIG_DVB_CX24117=m
CONFIG_DVB_SI21XX=m
CONFIG_DVB_TS2020=m
CONFIG_DVB_DS3000=m
CONFIG_DVB_MB86A16=m
CONFIG_DVB_TDA10071=m

#
# DVB-T (terrestrial) frontends
#
CONFIG_DVB_SP8870=m
CONFIG_DVB_SP887X=m
CONFIG_DVB_CX22700=m
CONFIG_DVB_CX22702=m
CONFIG_DVB_DRXD=m
CONFIG_DVB_L64781=m
CONFIG_DVB_TDA1004X=m
CONFIG_DVB_NXT6000=m
CONFIG_DVB_MT352=m
CONFIG_DVB_ZL10353=m
CONFIG_DVB_DIB3000MB=m
CONFIG_DVB_DIB3000MC=m
CONFIG_DVB_DIB7000M=m
CONFIG_DVB_DIB7000P=m
CONFIG_DVB_TDA10048=m
CONFIG_DVB_AF9013=m
CONFIG_DVB_EC100=m
CONFIG_DVB_STV0367=m
CONFIG_DVB_CXD2820R=m
CONFIG_DVB_RTL2830=m
CONFIG_DVB_RTL2832=m
CONFIG_DVB_RTL2832_SDR=m
CONFIG_DVB_SI2168=m
CONFIG_DVB_AS102_FE=m

#
# DVB-C (cable) frontends
#
CONFIG_DVB_VES1820=m
CONFIG_DVB_TDA10021=m
CONFIG_DVB_TDA10023=m
CONFIG_DVB_STV0297=m

#
# ATSC (North American/Korean Terrestrial/Cable DTV) frontends
#
CONFIG_DVB_NXT200X=m
CONFIG_DVB_OR51211=m
CONFIG_DVB_OR51132=m
CONFIG_DVB_BCM3510=m
CONFIG_DVB_LGDT330X=m
CONFIG_DVB_LGDT3305=m
CONFIG_DVB_LGDT3306A=m
CONFIG_DVB_LG2160=m
CONFIG_DVB_S5H1409=m
CONFIG_DVB_AU8522=m
CONFIG_DVB_AU8522_DTV=m
CONFIG_DVB_AU8522_V4L=m
CONFIG_DVB_S5H1411=m

#
# ISDB-T (terrestrial) frontends
#
CONFIG_DVB_S921=m
CONFIG_DVB_DIB8000=m
CONFIG_DVB_MB86A20S=m

#
# ISDB-S (satellite) & ISDB-T (terrestrial) frontends
#
CONFIG_DVB_TC90522=m

#
# Digital terrestrial only tuners/PLL
#
CONFIG_DVB_PLL=m
CONFIG_DVB_TUNER_DIB0070=m
CONFIG_DVB_TUNER_DIB0090=m

#
# SEC control devices for DVB-S
#
CONFIG_DVB_DRX39XYJ=m
CONFIG_DVB_LNBP21=m
CONFIG_DVB_LNBP22=m
CONFIG_DVB_ISL6405=m
CONFIG_DVB_ISL6421=m
CONFIG_DVB_ISL6423=m
CONFIG_DVB_A8293=m
CONFIG_DVB_SP2=m
CONFIG_DVB_LGS8GXX=m
CONFIG_DVB_ATBM8830=m
CONFIG_DVB_TDA665x=m
CONFIG_DVB_IX2505V=m
CONFIG_DVB_M88RS2000=m
CONFIG_DVB_AF9033=m

#
# Tools to develop new frontends
#
# CONFIG_DVB_DUMMY_FE is not set

#
# Graphics support
#
CONFIG_AGP=y
CONFIG_AGP_AMD64=y
CONFIG_AGP_INTEL=y
CONFIG_AGP_SIS=y
CONFIG_AGP_VIA=y
CONFIG_INTEL_GTT=y
CONFIG_VGA_ARB=y
CONFIG_VGA_ARB_MAX_GPUS=16
CONFIG_VGA_SWITCHEROO=y

#
# Direct Rendering Manager
#
CONFIG_DRM=m
CONFIG_DRM_MIPI_DSI=y
CONFIG_DRM_KMS_HELPER=m
CONFIG_DRM_KMS_FB_HELPER=y
CONFIG_DRM_LOAD_EDID_FIRMWARE=y
CONFIG_DRM_TTM=m

#
# I2C encoder or helper chips
#
# CONFIG_DRM_I2C_ADV7511 is not set
CONFIG_DRM_I2C_CH7006=m
CONFIG_DRM_I2C_SIL164=m
# CONFIG_DRM_I2C_NXP_TDA998X is not set
CONFIG_DRM_TDFX=m
CONFIG_DRM_R128=m
CONFIG_DRM_RADEON=m
# CONFIG_DRM_RADEON_USERPTR is not set
# CONFIG_DRM_RADEON_UMS is not set
CONFIG_DRM_NOUVEAU=m
CONFIG_NOUVEAU_DEBUG=5
CONFIG_NOUVEAU_DEBUG_DEFAULT=3
CONFIG_DRM_NOUVEAU_BACKLIGHT=y
# CONFIG_DRM_I810 is not set
CONFIG_DRM_I915=m
CONFIG_DRM_I915_KMS=y
CONFIG_DRM_I915_FBDEV=y
# CONFIG_DRM_I915_PRELIMINARY_HW_SUPPORT is not set
CONFIG_DRM_MGA=m
CONFIG_DRM_SIS=m
CONFIG_DRM_VIA=m
CONFIG_DRM_SAVAGE=m
CONFIG_DRM_VGEM=m
CONFIG_DRM_VMWGFX=m
CONFIG_DRM_VMWGFX_FBCON=y
CONFIG_DRM_GMA500=m
CONFIG_DRM_GMA600=y
CONFIG_DRM_GMA3600=y
CONFIG_DRM_UDL=m
CONFIG_DRM_AST=m
CONFIG_DRM_MGAG200=m
CONFIG_DRM_CIRRUS_QEMU=m
CONFIG_DRM_QXL=m
CONFIG_DRM_BOCHS=m
CONFIG_DRM_PANEL=y

#
# Display Panels
#
# CONFIG_HSA_AMD is not set

#
# Frame buffer Devices
#
CONFIG_FB=y
CONFIG_FIRMWARE_EDID=y
CONFIG_FB_CMDLINE=y
CONFIG_FB_DDC=m
CONFIG_FB_BOOT_VESA_SUPPORT=y
CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y
# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
CONFIG_FB_SYS_FILLRECT=y
CONFIG_FB_SYS_COPYAREA=y
CONFIG_FB_SYS_IMAGEBLIT=y
# CONFIG_FB_FOREIGN_ENDIAN is not set
CONFIG_FB_SYS_FOPS=y
CONFIG_FB_DEFERRED_IO=y
CONFIG_FB_HECUBA=m
CONFIG_FB_SVGALIB=m
# CONFIG_FB_MACMODES is not set
CONFIG_FB_BACKLIGHT=y
CONFIG_FB_MODE_HELPERS=y
CONFIG_FB_TILEBLITTING=y

#
# Frame buffer hardware drivers
#
CONFIG_FB_CIRRUS=m
CONFIG_FB_PM2=m
CONFIG_FB_PM2_FIFO_DISCONNECT=y
CONFIG_FB_CYBER2000=m
CONFIG_FB_CYBER2000_DDC=y
CONFIG_FB_ARC=m
# CONFIG_FB_ASILIANT is not set
# CONFIG_FB_IMSTT is not set
CONFIG_FB_VGA16=m
CONFIG_FB_UVESA=m
CONFIG_FB_VESA=y
CONFIG_FB_EFI=y
CONFIG_FB_N411=m
CONFIG_FB_HGA=m
# CONFIG_FB_OPENCORES is not set
# CONFIG_FB_S1D13XXX is not set
# CONFIG_FB_NVIDIA is not set
# CONFIG_FB_RIVA is not set
# CONFIG_FB_I740 is not set
CONFIG_FB_LE80578=m
CONFIG_FB_CARILLO_RANCH=m
# CONFIG_FB_INTEL is not set
CONFIG_FB_MATROX=m
CONFIG_FB_MATROX_MILLENIUM=y
CONFIG_FB_MATROX_MYSTIQUE=y
CONFIG_FB_MATROX_G=y
CONFIG_FB_MATROX_I2C=m
CONFIG_FB_MATROX_MAVEN=m
CONFIG_FB_RADEON=m
CONFIG_FB_RADEON_I2C=y
CONFIG_FB_RADEON_BACKLIGHT=y
# CONFIG_FB_RADEON_DEBUG is not set
CONFIG_FB_ATY128=m
CONFIG_FB_ATY128_BACKLIGHT=y
CONFIG_FB_ATY=m
CONFIG_FB_ATY_CT=y
# CONFIG_FB_ATY_GENERIC_LCD is not set
CONFIG_FB_ATY_GX=y
CONFIG_FB_ATY_BACKLIGHT=y
CONFIG_FB_S3=m
CONFIG_FB_S3_DDC=y
CONFIG_FB_SAVAGE=m
# CONFIG_FB_SAVAGE_I2C is not set
# CONFIG_FB_SAVAGE_ACCEL is not set
CONFIG_FB_SIS=m
CONFIG_FB_SIS_300=y
CONFIG_FB_SIS_315=y
CONFIG_FB_VIA=m
# CONFIG_FB_VIA_DIRECT_PROCFS is not set
CONFIG_FB_VIA_X_COMPATIBILITY=y
CONFIG_FB_NEOMAGIC=m
CONFIG_FB_KYRO=m
CONFIG_FB_3DFX=m
# CONFIG_FB_3DFX_ACCEL is not set
CONFIG_FB_3DFX_I2C=y
CONFIG_FB_VOODOO1=m
CONFIG_FB_VT8623=m
CONFIG_FB_TRIDENT=m
CONFIG_FB_ARK=m
CONFIG_FB_PM3=m
# CONFIG_FB_CARMINE is not set
CONFIG_FB_SMSCUFX=m
CONFIG_FB_UDL=m
CONFIG_FB_VIRTUAL=m
CONFIG_XEN_FBDEV_FRONTEND=y
# CONFIG_FB_METRONOME is not set
CONFIG_FB_MB862XX=m
CONFIG_FB_MB862XX_PCI_GDC=y
CONFIG_FB_MB862XX_I2C=y
# CONFIG_FB_BROADSHEET is not set
# CONFIG_FB_AUO_K190X is not set
CONFIG_FB_HYPERV=m
CONFIG_FB_SIMPLE=y
CONFIG_BACKLIGHT_LCD_SUPPORT=y
# CONFIG_LCD_CLASS_DEVICE is not set
CONFIG_BACKLIGHT_CLASS_DEVICE=y
# CONFIG_BACKLIGHT_GENERIC is not set
CONFIG_BACKLIGHT_APPLE=m
# CONFIG_BACKLIGHT_SAHARA is not set
# CONFIG_BACKLIGHT_ADP8860 is not set
# CONFIG_BACKLIGHT_ADP8870 is not set
# CONFIG_BACKLIGHT_LM3639 is not set
# CONFIG_BACKLIGHT_GPIO is not set
# CONFIG_BACKLIGHT_LV5207LP is not set
# CONFIG_BACKLIGHT_BD6107 is not set
CONFIG_VGASTATE=m
CONFIG_HDMI=y

#
# Console display driver support
#
CONFIG_VGA_CONSOLE=y
# CONFIG_VGACON_SOFT_SCROLLBACK is not set
CONFIG_DUMMY_CONSOLE=y
CONFIG_DUMMY_CONSOLE_COLUMNS=80
CONFIG_DUMMY_CONSOLE_ROWS=25
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
# CONFIG_LOGO is not set
CONFIG_SOUND=m
CONFIG_SOUND_OSS_CORE=y
# CONFIG_SOUND_OSS_CORE_PRECLAIM is not set
CONFIG_SND=m
CONFIG_SND_TIMER=m
CONFIG_SND_PCM=m
CONFIG_SND_HWDEP=m
CONFIG_SND_RAWMIDI=m
CONFIG_SND_COMPRESS_OFFLOAD=m
CONFIG_SND_JACK=y
CONFIG_SND_SEQUENCER=m
CONFIG_SND_SEQ_DUMMY=m
CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=m
CONFIG_SND_PCM_OSS=m
CONFIG_SND_PCM_OSS_PLUGINS=y
# CONFIG_SND_SEQUENCER_OSS is not set
CONFIG_SND_HRTIMER=m
CONFIG_SND_SEQ_HRTIMER_DEFAULT=y
CONFIG_SND_DYNAMIC_MINORS=y
CONFIG_SND_MAX_CARDS=32
CONFIG_SND_SUPPORT_OLD_API=y
CONFIG_SND_VERBOSE_PROCFS=y
# CONFIG_SND_VERBOSE_PRINTK is not set
# CONFIG_SND_DEBUG is not set
CONFIG_SND_VMASTER=y
CONFIG_SND_KCTL_JACK=y
CONFIG_SND_DMA_SGBUF=y
CONFIG_SND_RAWMIDI_SEQ=m
CONFIG_SND_OPL3_LIB_SEQ=m
# CONFIG_SND_OPL4_LIB_SEQ is not set
# CONFIG_SND_SBAWE_SEQ is not set
CONFIG_SND_EMU10K1_SEQ=m
CONFIG_SND_MPU401_UART=m
CONFIG_SND_OPL3_LIB=m
CONFIG_SND_VX_LIB=m
CONFIG_SND_AC97_CODEC=m
CONFIG_SND_DRIVERS=y
CONFIG_SND_PCSP=m
CONFIG_SND_DUMMY=m
CONFIG_SND_ALOOP=m
CONFIG_SND_VIRMIDI=m
CONFIG_SND_MTPAV=m
CONFIG_SND_MTS64=m
CONFIG_SND_SERIAL_U16550=m
CONFIG_SND_MPU401=m
CONFIG_SND_PORTMAN2X4=m
CONFIG_SND_AC97_POWER_SAVE=y
CONFIG_SND_AC97_POWER_SAVE_DEFAULT=0
CONFIG_SND_SB_COMMON=m
CONFIG_SND_PCI=y
CONFIG_SND_AD1889=m
CONFIG_SND_ALS300=m
CONFIG_SND_ALS4000=m
CONFIG_SND_ALI5451=m
CONFIG_SND_ASIHPI=m
CONFIG_SND_ATIIXP=m
CONFIG_SND_ATIIXP_MODEM=m
CONFIG_SND_AU8810=m
CONFIG_SND_AU8820=m
CONFIG_SND_AU8830=m
# CONFIG_SND_AW2 is not set
CONFIG_SND_AZT3328=m
CONFIG_SND_BT87X=m
# CONFIG_SND_BT87X_OVERCLOCK is not set
CONFIG_SND_CA0106=m
CONFIG_SND_CMIPCI=m
CONFIG_SND_OXYGEN_LIB=m
CONFIG_SND_OXYGEN=m
CONFIG_SND_CS4281=m
CONFIG_SND_CS46XX=m
CONFIG_SND_CS46XX_NEW_DSP=y
CONFIG_SND_CTXFI=m
CONFIG_SND_DARLA20=m
CONFIG_SND_GINA20=m
CONFIG_SND_LAYLA20=m
CONFIG_SND_DARLA24=m
CONFIG_SND_GINA24=m
CONFIG_SND_LAYLA24=m
CONFIG_SND_MONA=m
CONFIG_SND_MIA=m
CONFIG_SND_ECHO3G=m
CONFIG_SND_INDIGO=m
CONFIG_SND_INDIGOIO=m
CONFIG_SND_INDIGODJ=m
CONFIG_SND_INDIGOIOX=m
CONFIG_SND_INDIGODJX=m
CONFIG_SND_EMU10K1=m
CONFIG_SND_EMU10K1X=m
CONFIG_SND_ENS1370=m
CONFIG_SND_ENS1371=m
CONFIG_SND_ES1938=m
CONFIG_SND_ES1968=m
CONFIG_SND_ES1968_INPUT=y
CONFIG_SND_ES1968_RADIO=y
CONFIG_SND_FM801=m
CONFIG_SND_FM801_TEA575X_BOOL=y
CONFIG_SND_HDSP=m
CONFIG_SND_HDSPM=m
CONFIG_SND_ICE1712=m
CONFIG_SND_ICE1724=m
CONFIG_SND_INTEL8X0=m
CONFIG_SND_INTEL8X0M=m
CONFIG_SND_KORG1212=m
CONFIG_SND_LOLA=m
CONFIG_SND_LX6464ES=m
CONFIG_SND_MAESTRO3=m
CONFIG_SND_MAESTRO3_INPUT=y
CONFIG_SND_MIXART=m
CONFIG_SND_NM256=m
CONFIG_SND_PCXHR=m
CONFIG_SND_RIPTIDE=m
CONFIG_SND_RME32=m
CONFIG_SND_RME96=m
CONFIG_SND_RME9652=m
CONFIG_SND_SONICVIBES=m
CONFIG_SND_TRIDENT=m
CONFIG_SND_VIA82XX=m
CONFIG_SND_VIA82XX_MODEM=m
CONFIG_SND_VIRTUOSO=m
CONFIG_SND_VX222=m
CONFIG_SND_YMFPCI=m

#
# HD-Audio
#
CONFIG_SND_HDA=m
CONFIG_SND_HDA_INTEL=m
CONFIG_SND_HDA_DSP_LOADER=y
CONFIG_SND_HDA_PREALLOC_SIZE=64
CONFIG_SND_HDA_HWDEP=y
CONFIG_SND_HDA_RECONFIG=y
CONFIG_SND_HDA_INPUT_BEEP=y
CONFIG_SND_HDA_INPUT_BEEP_MODE=1
CONFIG_SND_HDA_INPUT_JACK=y
CONFIG_SND_HDA_PATCH_LOADER=y
CONFIG_SND_HDA_CODEC_REALTEK=m
CONFIG_SND_HDA_CODEC_ANALOG=m
CONFIG_SND_HDA_CODEC_SIGMATEL=m
CONFIG_SND_HDA_CODEC_VIA=m
CONFIG_SND_HDA_CODEC_HDMI=m
CONFIG_SND_HDA_I915=y
CONFIG_SND_HDA_CODEC_CIRRUS=m
CONFIG_SND_HDA_CODEC_CONEXANT=m
CONFIG_SND_HDA_CODEC_CA0110=m
CONFIG_SND_HDA_CODEC_CA0132=m
CONFIG_SND_HDA_CODEC_CA0132_DSP=y
CONFIG_SND_HDA_CODEC_CMEDIA=m
CONFIG_SND_HDA_CODEC_SI3054=m
CONFIG_SND_HDA_GENERIC=m
CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0
CONFIG_SND_HDA_CORE=m
CONFIG_SND_SPI=y
CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=m
CONFIG_SND_USB_UA101=m
CONFIG_SND_USB_USX2Y=m
CONFIG_SND_USB_CAIAQ=m
CONFIG_SND_USB_CAIAQ_INPUT=y
CONFIG_SND_USB_US122L=m
CONFIG_SND_USB_6FIRE=m
CONFIG_SND_USB_HIFACE=m
CONFIG_SND_BCD2000=m
CONFIG_SND_USB_LINE6=m
CONFIG_SND_USB_POD=m
CONFIG_SND_USB_PODHD=m
CONFIG_SND_USB_TONEPORT=m
CONFIG_SND_USB_VARIAX=m
CONFIG_SND_FIREWIRE=y
CONFIG_SND_FIREWIRE_LIB=m
CONFIG_SND_DICE=m
CONFIG_SND_OXFW=m
CONFIG_SND_ISIGHT=m
CONFIG_SND_SCS1X=m
CONFIG_SND_FIREWORKS=m
CONFIG_SND_BEBOB=m
CONFIG_SND_PCMCIA=y
CONFIG_SND_VXPOCKET=m
CONFIG_SND_PDAUDIOCF=m
CONFIG_SND_SOC=m
# CONFIG_SND_ATMEL_SOC is not set
# CONFIG_SND_DESIGNWARE_I2S is not set

#
# SoC Audio for Freescale CPUs
#

#
# Common SoC Audio options for Freescale CPUs:
#
# CONFIG_SND_SOC_FSL_ASRC is not set
# CONFIG_SND_SOC_FSL_SAI is not set
# CONFIG_SND_SOC_FSL_SSI is not set
# CONFIG_SND_SOC_FSL_SPDIF is not set
# CONFIG_SND_SOC_FSL_ESAI is not set
# CONFIG_SND_SOC_IMX_AUDMUX is not set
CONFIG_SND_SOC_INTEL_SST=m
CONFIG_SND_SOC_INTEL_SST_ACPI=m
CONFIG_SND_SOC_INTEL_HASWELL=m
CONFIG_SND_SOC_INTEL_BAYTRAIL=m
CONFIG_SND_SOC_INTEL_HASWELL_MACH=m
CONFIG_SND_SOC_INTEL_BYT_RT5640_MACH=m
CONFIG_SND_SOC_INTEL_BYT_MAX98090_MACH=m
CONFIG_SND_SOC_INTEL_BROADWELL_MACH=m
# CONFIG_SND_SOC_INTEL_BYTCR_RT5640_MACH is not set
# CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH is not set
# CONFIG_SND_SOC_INTEL_CHT_BSW_RT5645_MACH is not set
# CONFIG_SND_SOC_QCOM is not set
# CONFIG_SND_SOC_XTFPGA_I2S is not set
CONFIG_SND_SOC_I2C_AND_SPI=m

#
# CODEC drivers
#
# CONFIG_SND_SOC_ADAU1701 is not set
# CONFIG_SND_SOC_AK4104 is not set
# CONFIG_SND_SOC_AK4554 is not set
# CONFIG_SND_SOC_AK4642 is not set
# CONFIG_SND_SOC_AK5386 is not set
# CONFIG_SND_SOC_ALC5623 is not set
# CONFIG_SND_SOC_CS35L32 is not set
# CONFIG_SND_SOC_CS42L51_I2C is not set
# CONFIG_SND_SOC_CS42L52 is not set
# CONFIG_SND_SOC_CS42L56 is not set
# CONFIG_SND_SOC_CS42L73 is not set
# CONFIG_SND_SOC_CS4265 is not set
# CONFIG_SND_SOC_CS4270 is not set
# CONFIG_SND_SOC_CS4271_I2C is not set
# CONFIG_SND_SOC_CS4271_SPI is not set
# CONFIG_SND_SOC_CS42XX8_I2C is not set
# CONFIG_SND_SOC_HDMI_CODEC is not set
# CONFIG_SND_SOC_ES8328 is not set
CONFIG_SND_SOC_MAX98090=m
# CONFIG_SND_SOC_PCM1681 is not set
# CONFIG_SND_SOC_PCM1792A is not set
# CONFIG_SND_SOC_PCM512x_I2C is not set
# CONFIG_SND_SOC_PCM512x_SPI is not set
CONFIG_SND_SOC_RL6231=m
CONFIG_SND_SOC_RT286=m
# CONFIG_SND_SOC_RT5631 is not set
CONFIG_SND_SOC_RT5640=m
# CONFIG_SND_SOC_RT5677_SPI is not set
# CONFIG_SND_SOC_SGTL5000 is not set
# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set
# CONFIG_SND_SOC_SPDIF is not set
# CONFIG_SND_SOC_SSM2602_SPI is not set
# CONFIG_SND_SOC_SSM2602_I2C is not set
# CONFIG_SND_SOC_SSM4567 is not set
# CONFIG_SND_SOC_STA32X is not set
# CONFIG_SND_SOC_STA350 is not set
# CONFIG_SND_SOC_TAS2552 is not set
# CONFIG_SND_SOC_TAS5086 is not set
# CONFIG_SND_SOC_TFA9879 is not set
# CONFIG_SND_SOC_TLV320AIC23_I2C is not set
# CONFIG_SND_SOC_TLV320AIC23_SPI is not set
# CONFIG_SND_SOC_TLV320AIC31XX is not set
# CONFIG_SND_SOC_TLV320AIC3X is not set
# CONFIG_SND_SOC_TS3A227E is not set
# CONFIG_SND_SOC_WM8510 is not set
# CONFIG_SND_SOC_WM8523 is not set
# CONFIG_SND_SOC_WM8580 is not set
# CONFIG_SND_SOC_WM8711 is not set
# CONFIG_SND_SOC_WM8728 is not set
# CONFIG_SND_SOC_WM8731 is not set
# CONFIG_SND_SOC_WM8737 is not set
# CONFIG_SND_SOC_WM8741 is not set
# CONFIG_SND_SOC_WM8750 is not set
# CONFIG_SND_SOC_WM8753 is not set
# CONFIG_SND_SOC_WM8770 is not set
# CONFIG_SND_SOC_WM8776 is not set
# CONFIG_SND_SOC_WM8804_I2C is not set
# CONFIG_SND_SOC_WM8804_SPI is not set
# CONFIG_SND_SOC_WM8903 is not set
# CONFIG_SND_SOC_WM8962 is not set
# CONFIG_SND_SOC_WM8978 is not set
# CONFIG_SND_SOC_TPA6130A2 is not set
# CONFIG_SND_SIMPLE_CARD is not set
# CONFIG_SOUND_PRIME is not set
CONFIG_AC97_BUS=m

#
# HID support
#
CONFIG_HID=m
CONFIG_HID_BATTERY_STRENGTH=y
CONFIG_HIDRAW=y
CONFIG_UHID=m
CONFIG_HID_GENERIC=m

#
# Special HID drivers
#
CONFIG_HID_A4TECH=m
CONFIG_HID_ACRUX=m
CONFIG_HID_ACRUX_FF=y
CONFIG_HID_APPLE=m
CONFIG_HID_APPLEIR=m
CONFIG_HID_AUREAL=m
CONFIG_HID_BELKIN=m
# CONFIG_HID_BETOP_FF is not set
CONFIG_HID_CHERRY=m
CONFIG_HID_CHICONY=m
CONFIG_HID_PRODIKEYS=m
CONFIG_HID_CP2112=m
CONFIG_HID_CYPRESS=m
CONFIG_HID_DRAGONRISE=m
CONFIG_DRAGONRISE_FF=y
CONFIG_HID_EMS_FF=m
CONFIG_HID_ELECOM=m
CONFIG_HID_ELO=m
CONFIG_HID_EZKEY=m
CONFIG_HID_HOLTEK=m
CONFIG_HOLTEK_FF=y
# CONFIG_HID_GT683R is not set
CONFIG_HID_KEYTOUCH=m
CONFIG_HID_KYE=m
CONFIG_HID_UCLOGIC=m
CONFIG_HID_WALTOP=m
CONFIG_HID_GYRATION=m
CONFIG_HID_ICADE=m
CONFIG_HID_TWINHAN=m
CONFIG_HID_KENSINGTON=m
CONFIG_HID_LCPOWER=m
CONFIG_HID_LENOVO=m
CONFIG_HID_LOGITECH=m
CONFIG_HID_LOGITECH_DJ=m
CONFIG_HID_LOGITECH_HIDPP=m
CONFIG_LOGITECH_FF=y
CONFIG_LOGIRUMBLEPAD2_FF=y
CONFIG_LOGIG940_FF=y
CONFIG_LOGIWHEELS_FF=y
CONFIG_HID_MAGICMOUSE=m
CONFIG_HID_MICROSOFT=m
CONFIG_HID_MONTEREY=m
CONFIG_HID_MULTITOUCH=m
CONFIG_HID_NTRIG=m
CONFIG_HID_ORTEK=m
CONFIG_HID_PANTHERLORD=m
CONFIG_PANTHERLORD_FF=y
CONFIG_HID_PENMOUNT=m
CONFIG_HID_PETALYNX=m
CONFIG_HID_PICOLCD=m
CONFIG_HID_PICOLCD_FB=y
CONFIG_HID_PICOLCD_BACKLIGHT=y
CONFIG_HID_PICOLCD_LEDS=y
CONFIG_HID_PICOLCD_CIR=y
# CONFIG_HID_PLANTRONICS is not set
CONFIG_HID_PRIMAX=m
CONFIG_HID_ROCCAT=m
CONFIG_HID_SAITEK=m
CONFIG_HID_SAMSUNG=m
CONFIG_HID_SONY=m
CONFIG_SONY_FF=y
CONFIG_HID_SPEEDLINK=m
CONFIG_HID_STEELSERIES=m
CONFIG_HID_SUNPLUS=m
CONFIG_HID_RMI=m
CONFIG_HID_GREENASIA=m
CONFIG_GREENASIA_FF=y
CONFIG_HID_HYPERV_MOUSE=m
CONFIG_HID_SMARTJOYPLUS=m
CONFIG_SMARTJOYPLUS_FF=y
CONFIG_HID_TIVO=m
CONFIG_HID_TOPSEED=m
CONFIG_HID_THINGM=m
CONFIG_HID_THRUSTMASTER=m
CONFIG_THRUSTMASTER_FF=y
CONFIG_HID_WACOM=m
CONFIG_HID_WIIMOTE=m
CONFIG_HID_XINMO=m
CONFIG_HID_ZEROPLUS=m
CONFIG_ZEROPLUS_FF=y
CONFIG_HID_ZYDACRON=m
CONFIG_HID_SENSOR_HUB=m
# CONFIG_HID_SENSOR_CUSTOM_SENSOR is not set

#
# USB HID support
#
CONFIG_USB_HID=m
CONFIG_HID_PID=y
CONFIG_USB_HIDDEV=y

#
# USB HID Boot Protocol drivers
#
# CONFIG_USB_KBD is not set
# CONFIG_USB_MOUSE is not set

#
# I2C HID support
#
CONFIG_I2C_HID=m
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
CONFIG_USB_SUPPORT=y
CONFIG_USB_COMMON=m
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB=m
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y

#
# Miscellaneous USB options
#
CONFIG_USB_DEFAULT_PERSIST=y
CONFIG_USB_DYNAMIC_MINORS=y
# CONFIG_USB_OTG is not set
# CONFIG_USB_OTG_WHITELIST is not set
# CONFIG_USB_OTG_BLACKLIST_HUB is not set
# CONFIG_USB_OTG_FSM is not set
CONFIG_USB_MON=m
CONFIG_USB_WUSB=m
CONFIG_USB_WUSB_CBAF=m
# CONFIG_USB_WUSB_CBAF_DEBUG is not set

#
# USB Host Controller Drivers
#
# CONFIG_USB_C67X00_HCD is not set
CONFIG_USB_XHCI_HCD=m
CONFIG_USB_XHCI_PCI=m
CONFIG_USB_EHCI_HCD=m
CONFIG_USB_EHCI_ROOT_HUB_TT=y
CONFIG_USB_EHCI_TT_NEWSCHED=y
CONFIG_USB_EHCI_PCI=m
# CONFIG_USB_EHCI_HCD_PLATFORM is not set
# CONFIG_USB_OXU210HP_HCD is not set
# CONFIG_USB_ISP116X_HCD is not set
# CONFIG_USB_ISP1362_HCD is not set
# CONFIG_USB_FUSBH200_HCD is not set
# CONFIG_USB_FOTG210_HCD is not set
# CONFIG_USB_MAX3421_HCD is not set
CONFIG_USB_OHCI_HCD=m
CONFIG_USB_OHCI_HCD_PCI=m
# CONFIG_USB_OHCI_HCD_SSB is not set
# CONFIG_USB_OHCI_HCD_PLATFORM is not set
CONFIG_USB_UHCI_HCD=m
CONFIG_USB_U132_HCD=m
CONFIG_USB_SL811_HCD=m
# CONFIG_USB_SL811_HCD_ISO is not set
CONFIG_USB_SL811_CS=m
# CONFIG_USB_R8A66597_HCD is not set
CONFIG_USB_WHCI_HCD=m
CONFIG_USB_HWA_HCD=m
# CONFIG_USB_HCD_BCMA is not set
# CONFIG_USB_HCD_SSB is not set
# CONFIG_USB_HCD_TEST_MODE is not set

#
# USB Device Class drivers
#
CONFIG_USB_ACM=m
CONFIG_USB_PRINTER=m
CONFIG_USB_WDM=m
CONFIG_USB_TMC=m

#
# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
#

#
# also be needed; see USB_STORAGE Help for more info
#
CONFIG_USB_STORAGE=m
# CONFIG_USB_STORAGE_DEBUG is not set
CONFIG_USB_STORAGE_REALTEK=m
CONFIG_REALTEK_AUTOPM=y
CONFIG_USB_STORAGE_DATAFAB=m
CONFIG_USB_STORAGE_FREECOM=m
CONFIG_USB_STORAGE_ISD200=m
CONFIG_USB_STORAGE_USBAT=m
CONFIG_USB_STORAGE_SDDR09=m
CONFIG_USB_STORAGE_SDDR55=m
CONFIG_USB_STORAGE_JUMPSHOT=m
CONFIG_USB_STORAGE_ALAUDA=m
CONFIG_USB_STORAGE_ONETOUCH=m
CONFIG_USB_STORAGE_KARMA=m
CONFIG_USB_STORAGE_CYPRESS_ATACB=m
CONFIG_USB_STORAGE_ENE_UB6250=m
CONFIG_USB_UAS=m

#
# USB Imaging devices
#
CONFIG_USB_MDC800=m
CONFIG_USB_MICROTEK=m
CONFIG_USBIP_CORE=m
CONFIG_USBIP_VHCI_HCD=m
CONFIG_USBIP_HOST=m
# CONFIG_USBIP_DEBUG is not set
# CONFIG_USB_MUSB_HDRC is not set
# CONFIG_USB_DWC3 is not set
# CONFIG_USB_DWC2 is not set
# CONFIG_USB_CHIPIDEA is not set
# CONFIG_USB_ISP1760 is not set

#
# USB port drivers
#
CONFIG_USB_USS720=m
CONFIG_USB_SERIAL=m
CONFIG_USB_SERIAL_GENERIC=y
CONFIG_USB_SERIAL_SIMPLE=m
CONFIG_USB_SERIAL_AIRCABLE=m
CONFIG_USB_SERIAL_ARK3116=m
CONFIG_USB_SERIAL_BELKIN=m
CONFIG_USB_SERIAL_CH341=m
CONFIG_USB_SERIAL_WHITEHEAT=m
CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
CONFIG_USB_SERIAL_CP210X=m
CONFIG_USB_SERIAL_CYPRESS_M8=m
CONFIG_USB_SERIAL_EMPEG=m
CONFIG_USB_SERIAL_FTDI_SIO=m
CONFIG_USB_SERIAL_VISOR=m
CONFIG_USB_SERIAL_IPAQ=m
CONFIG_USB_SERIAL_IR=m
CONFIG_USB_SERIAL_EDGEPORT=m
CONFIG_USB_SERIAL_EDGEPORT_TI=m
CONFIG_USB_SERIAL_F81232=m
CONFIG_USB_SERIAL_GARMIN=m
CONFIG_USB_SERIAL_IPW=m
CONFIG_USB_SERIAL_IUU=m
CONFIG_USB_SERIAL_KEYSPAN_PDA=m
CONFIG_USB_SERIAL_KEYSPAN=m
CONFIG_USB_SERIAL_KLSI=m
CONFIG_USB_SERIAL_KOBIL_SCT=m
CONFIG_USB_SERIAL_MCT_U232=m
CONFIG_USB_SERIAL_METRO=m
CONFIG_USB_SERIAL_MOS7720=m
CONFIG_USB_SERIAL_MOS7715_PARPORT=y
CONFIG_USB_SERIAL_MOS7840=m
CONFIG_USB_SERIAL_MXUPORT=m
CONFIG_USB_SERIAL_NAVMAN=m
CONFIG_USB_SERIAL_PL2303=m
CONFIG_USB_SERIAL_OTI6858=m
CONFIG_USB_SERIAL_QCAUX=m
CONFIG_USB_SERIAL_QUALCOMM=m
CONFIG_USB_SERIAL_SPCP8X5=m
CONFIG_USB_SERIAL_SAFE=m
# CONFIG_USB_SERIAL_SAFE_PADDED is not set
CONFIG_USB_SERIAL_SIERRAWIRELESS=m
CONFIG_USB_SERIAL_SYMBOL=m
CONFIG_USB_SERIAL_TI=m
CONFIG_USB_SERIAL_CYBERJACK=m
CONFIG_USB_SERIAL_XIRCOM=m
CONFIG_USB_SERIAL_WWAN=m
CONFIG_USB_SERIAL_OPTION=m
CONFIG_USB_SERIAL_OMNINET=m
CONFIG_USB_SERIAL_OPTICON=m
CONFIG_USB_SERIAL_XSENS_MT=m
CONFIG_USB_SERIAL_WISHBONE=m
CONFIG_USB_SERIAL_SSU100=m
CONFIG_USB_SERIAL_QT2=m
CONFIG_USB_SERIAL_DEBUG=m

#
# USB Miscellaneous drivers
#
CONFIG_USB_EMI62=m
CONFIG_USB_EMI26=m
CONFIG_USB_ADUTUX=m
CONFIG_USB_SEVSEG=m
CONFIG_USB_RIO500=m
CONFIG_USB_LEGOTOWER=m
CONFIG_USB_LCD=m
CONFIG_USB_LED=m
CONFIG_USB_CYPRESS_CY7C63=m
CONFIG_USB_CYTHERM=m
CONFIG_USB_IDMOUSE=m
CONFIG_USB_FTDI_ELAN=m
CONFIG_USB_APPLEDISPLAY=m
CONFIG_USB_SISUSBVGA=m
CONFIG_USB_SISUSBVGA_CON=y
CONFIG_USB_LD=m
CONFIG_USB_TRANCEVIBRATOR=m
CONFIG_USB_IOWARRIOR=m
CONFIG_USB_TEST=m
CONFIG_USB_EHSET_TEST_FIXTURE=m
CONFIG_USB_ISIGHTFW=m
CONFIG_USB_YUREX=m
CONFIG_USB_EZUSB_FX2=m
# CONFIG_USB_HSIC_USB3503 is not set
# CONFIG_USB_LINK_LAYER_TEST is not set
# CONFIG_USB_CHAOSKEY is not set
CONFIG_USB_ATM=m
CONFIG_USB_SPEEDTOUCH=m
CONFIG_USB_CXACRU=m
CONFIG_USB_UEAGLEATM=m
CONFIG_USB_XUSBATM=m

#
# USB Physical Layer drivers
#
# CONFIG_USB_PHY is not set
# CONFIG_NOP_USB_XCEIV is not set
# CONFIG_USB_GPIO_VBUS is not set
# CONFIG_USB_ISP1301 is not set
CONFIG_USB_GADGET=m
# CONFIG_USB_GADGET_DEBUG is not set
# CONFIG_USB_GADGET_DEBUG_FILES is not set
# CONFIG_USB_GADGET_DEBUG_FS is not set
CONFIG_USB_GADGET_VBUS_DRAW=2
CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2

#
# USB Peripheral Controller
#
# CONFIG_USB_FOTG210_UDC is not set
# CONFIG_USB_GR_UDC is not set
# CONFIG_USB_R8A66597 is not set
# CONFIG_USB_PXA27X is not set
# CONFIG_USB_MV_UDC is not set
# CONFIG_USB_MV_U3D is not set
# CONFIG_USB_M66592 is not set
# CONFIG_USB_BDC_UDC is not set
# CONFIG_USB_AMD5536UDC is not set
# CONFIG_USB_NET2272 is not set
CONFIG_USB_NET2280=m
# CONFIG_USB_GOKU is not set
CONFIG_USB_EG20T=m
# CONFIG_USB_DUMMY_HCD is not set
# CONFIG_USB_CONFIGFS is not set
# CONFIG_USB_ZERO is not set
# CONFIG_USB_AUDIO is not set
# CONFIG_USB_ETH is not set
# CONFIG_USB_G_NCM is not set
# CONFIG_USB_GADGETFS is not set
# CONFIG_USB_FUNCTIONFS is not set
# CONFIG_USB_MASS_STORAGE is not set
# CONFIG_USB_GADGET_TARGET is not set
# CONFIG_USB_G_SERIAL is not set
# CONFIG_USB_MIDI_GADGET is not set
# CONFIG_USB_G_PRINTER is not set
# CONFIG_USB_CDC_COMPOSITE is not set
# CONFIG_USB_G_NOKIA is not set
# CONFIG_USB_G_ACM_MS is not set
# CONFIG_USB_G_MULTI is not set
# CONFIG_USB_G_HID is not set
# CONFIG_USB_G_DBGP is not set
# CONFIG_USB_G_WEBCAM is not set
CONFIG_USB_LED_TRIG=y
CONFIG_UWB=m
CONFIG_UWB_HWA=m
CONFIG_UWB_WHCI=m
CONFIG_UWB_I1480U=m
CONFIG_MMC=m
# CONFIG_MMC_DEBUG is not set
# CONFIG_MMC_CLKGATE is not set

#
# MMC/SD/SDIO Card Drivers
#
CONFIG_MMC_BLOCK=m
CONFIG_MMC_BLOCK_MINORS=256
CONFIG_MMC_BLOCK_BOUNCE=y
CONFIG_SDIO_UART=m
# CONFIG_MMC_TEST is not set

#
# MMC/SD/SDIO Host Controller Drivers
#
CONFIG_MMC_SDHCI=m
CONFIG_MMC_SDHCI_PCI=m
CONFIG_MMC_RICOH_MMC=y
CONFIG_MMC_SDHCI_ACPI=m
# CONFIG_MMC_SDHCI_PLTFM is not set
CONFIG_MMC_WBSD=m
CONFIG_MMC_TIFM_SD=m
# CONFIG_MMC_SPI is not set
CONFIG_MMC_SDRICOH_CS=m
CONFIG_MMC_CB710=m
CONFIG_MMC_VIA_SDMMC=m
CONFIG_MMC_VUB300=m
CONFIG_MMC_USHC=m
# CONFIG_MMC_USDHI6ROL0 is not set
CONFIG_MMC_REALTEK_PCI=m
CONFIG_MMC_REALTEK_USB=m
CONFIG_MMC_TOSHIBA_PCI=m
CONFIG_MEMSTICK=m
# CONFIG_MEMSTICK_DEBUG is not set

#
# MemoryStick drivers
#
# CONFIG_MEMSTICK_UNSAFE_RESUME is not set
CONFIG_MSPRO_BLOCK=m
# CONFIG_MS_BLOCK is not set

#
# MemoryStick Host Controller Drivers
#
CONFIG_MEMSTICK_TIFM_MS=m
CONFIG_MEMSTICK_JMICRON_38X=m
CONFIG_MEMSTICK_R592=m
CONFIG_MEMSTICK_REALTEK_PCI=m
CONFIG_MEMSTICK_REALTEK_USB=m
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y
# CONFIG_LEDS_CLASS_FLASH is not set

#
# LED drivers
#
# CONFIG_LEDS_LM3530 is not set
# CONFIG_LEDS_LM3642 is not set
# CONFIG_LEDS_PCA9532 is not set
# CONFIG_LEDS_GPIO is not set
CONFIG_LEDS_LP3944=m
# CONFIG_LEDS_LP5521 is not set
# CONFIG_LEDS_LP5523 is not set
# CONFIG_LEDS_LP5562 is not set
# CONFIG_LEDS_LP8501 is not set
# CONFIG_LEDS_LP8860 is not set
CONFIG_LEDS_CLEVO_MAIL=m
CONFIG_LEDS_PCA955X=m
# CONFIG_LEDS_PCA963X is not set
CONFIG_LEDS_DAC124S085=m
CONFIG_LEDS_BD2802=m
CONFIG_LEDS_INTEL_SS4200=m
CONFIG_LEDS_LT3593=m
CONFIG_LEDS_DELL_NETBOOKS=m
# CONFIG_LEDS_TCA6507 is not set
# CONFIG_LEDS_LM355x is not set
CONFIG_LEDS_MENF21BMC=m

#
# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM)
#
# CONFIG_LEDS_BLINKM is not set
# CONFIG_LEDS_PM8941_WLED is not set

#
# LED Triggers
#
CONFIG_LEDS_TRIGGERS=y
CONFIG_LEDS_TRIGGER_TIMER=m
CONFIG_LEDS_TRIGGER_ONESHOT=m
CONFIG_LEDS_TRIGGER_HEARTBEAT=m
CONFIG_LEDS_TRIGGER_BACKLIGHT=m
CONFIG_LEDS_TRIGGER_CPU=y
CONFIG_LEDS_TRIGGER_GPIO=m
CONFIG_LEDS_TRIGGER_DEFAULT_ON=m

#
# iptables trigger is under Netfilter config (LED target)
#
CONFIG_LEDS_TRIGGER_TRANSIENT=m
CONFIG_LEDS_TRIGGER_CAMERA=m
CONFIG_ACCESSIBILITY=y
CONFIG_A11Y_BRAILLE_CONSOLE=y
CONFIG_INFINIBAND=m
CONFIG_INFINIBAND_USER_MAD=m
CONFIG_INFINIBAND_USER_ACCESS=m
CONFIG_INFINIBAND_USER_MEM=y
CONFIG_INFINIBAND_ON_DEMAND_PAGING=y
CONFIG_INFINIBAND_ADDR_TRANS=y
CONFIG_INFINIBAND_MTHCA=m
CONFIG_INFINIBAND_MTHCA_DEBUG=y
CONFIG_INFINIBAND_IPATH=m
CONFIG_INFINIBAND_QIB=m
CONFIG_INFINIBAND_QIB_DCA=y
CONFIG_INFINIBAND_AMSO1100=m
# CONFIG_INFINIBAND_AMSO1100_DEBUG is not set
CONFIG_INFINIBAND_CXGB3=m
# CONFIG_INFINIBAND_CXGB3_DEBUG is not set
CONFIG_INFINIBAND_CXGB4=m
CONFIG_MLX4_INFINIBAND=m
CONFIG_MLX5_INFINIBAND=m
CONFIG_INFINIBAND_NES=m
# CONFIG_INFINIBAND_NES_DEBUG is not set
CONFIG_INFINIBAND_OCRDMA=m
# CONFIG_INFINIBAND_USNIC is not set
CONFIG_INFINIBAND_IPOIB=m
CONFIG_INFINIBAND_IPOIB_CM=y
CONFIG_INFINIBAND_IPOIB_DEBUG=y
# CONFIG_INFINIBAND_IPOIB_DEBUG_DATA is not set
CONFIG_INFINIBAND_SRP=m
CONFIG_INFINIBAND_SRPT=m
CONFIG_INFINIBAND_ISER=m
CONFIG_INFINIBAND_ISERT=m
CONFIG_EDAC=y
CONFIG_EDAC_LEGACY_SYSFS=y
# CONFIG_EDAC_DEBUG is not set
CONFIG_EDAC_DECODE_MCE=m
# CONFIG_EDAC_MCE_INJ is not set
CONFIG_EDAC_MM_EDAC=m
CONFIG_EDAC_AMD64=m
# CONFIG_EDAC_AMD64_ERROR_INJECTION is not set
CONFIG_EDAC_E752X=m
CONFIG_EDAC_I82975X=m
CONFIG_EDAC_I3000=m
CONFIG_EDAC_I3200=m
CONFIG_EDAC_IE31200=m
CONFIG_EDAC_X38=m
CONFIG_EDAC_I5400=m
CONFIG_EDAC_I7CORE=m
CONFIG_EDAC_I5000=m
CONFIG_EDAC_I5100=m
CONFIG_EDAC_I7300=m
CONFIG_EDAC_SBRIDGE=m
CONFIG_RTC_LIB=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_HCTOSYS=y
CONFIG_RTC_SYSTOHC=y
CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
# CONFIG_RTC_DEBUG is not set

#
# RTC interfaces
#
CONFIG_RTC_INTF_SYSFS=y
CONFIG_RTC_INTF_PROC=y
CONFIG_RTC_INTF_DEV=y
# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
# CONFIG_RTC_DRV_TEST is not set

#
# I2C RTC drivers
#
# CONFIG_RTC_DRV_ABB5ZES3 is not set
# CONFIG_RTC_DRV_ABX80X is not set
# CONFIG_RTC_DRV_DS1307 is not set
# CONFIG_RTC_DRV_DS1374 is not set
# CONFIG_RTC_DRV_DS1672 is not set
# CONFIG_RTC_DRV_DS3232 is not set
# CONFIG_RTC_DRV_MAX6900 is not set
# CONFIG_RTC_DRV_RS5C372 is not set
# CONFIG_RTC_DRV_ISL1208 is not set
# CONFIG_RTC_DRV_ISL12022 is not set
# CONFIG_RTC_DRV_ISL12057 is not set
# CONFIG_RTC_DRV_X1205 is not set
# CONFIG_RTC_DRV_PCF2127 is not set
# CONFIG_RTC_DRV_PCF8523 is not set
# CONFIG_RTC_DRV_PCF8563 is not set
# CONFIG_RTC_DRV_PCF85063 is not set
# CONFIG_RTC_DRV_PCF8583 is not set
# CONFIG_RTC_DRV_M41T80 is not set
# CONFIG_RTC_DRV_BQ32K is not set
# CONFIG_RTC_DRV_S35390A is not set
# CONFIG_RTC_DRV_FM3130 is not set
# CONFIG_RTC_DRV_RX8581 is not set
# CONFIG_RTC_DRV_RX8025 is not set
# CONFIG_RTC_DRV_EM3027 is not set
# CONFIG_RTC_DRV_RV3029C2 is not set

#
# SPI RTC drivers
#
# CONFIG_RTC_DRV_M41T93 is not set
# CONFIG_RTC_DRV_M41T94 is not set
# CONFIG_RTC_DRV_DS1305 is not set
# CONFIG_RTC_DRV_DS1343 is not set
# CONFIG_RTC_DRV_DS1347 is not set
# CONFIG_RTC_DRV_DS1390 is not set
# CONFIG_RTC_DRV_MAX6902 is not set
# CONFIG_RTC_DRV_R9701 is not set
# CONFIG_RTC_DRV_RS5C348 is not set
# CONFIG_RTC_DRV_DS3234 is not set
# CONFIG_RTC_DRV_PCF2123 is not set
# CONFIG_RTC_DRV_RX4581 is not set
# CONFIG_RTC_DRV_MCP795 is not set

#
# Platform RTC drivers
#
CONFIG_RTC_DRV_CMOS=y
# CONFIG_RTC_DRV_DS1286 is not set
# CONFIG_RTC_DRV_DS1511 is not set
# CONFIG_RTC_DRV_DS1553 is not set
# CONFIG_RTC_DRV_DS1685_FAMILY is not set
# CONFIG_RTC_DRV_DS1742 is not set
# CONFIG_RTC_DRV_DS2404 is not set
# CONFIG_RTC_DRV_STK17TA8 is not set
# CONFIG_RTC_DRV_M48T86 is not set
# CONFIG_RTC_DRV_M48T35 is not set
# CONFIG_RTC_DRV_M48T59 is not set
# CONFIG_RTC_DRV_MSM6242 is not set
# CONFIG_RTC_DRV_BQ4802 is not set
# CONFIG_RTC_DRV_RP5C01 is not set
# CONFIG_RTC_DRV_V3020 is not set

#
# on-CPU RTC drivers
#
# CONFIG_RTC_DRV_XGENE is not set

#
# HID Sensor RTC drivers
#
# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set
CONFIG_DMADEVICES=y
# CONFIG_DMADEVICES_DEBUG is not set

#
# DMA Devices
#
# CONFIG_INTEL_MIC_X100_DMA is not set
CONFIG_INTEL_IOATDMA=m
CONFIG_DW_DMAC_CORE=m
CONFIG_DW_DMAC=m
# CONFIG_DW_DMAC_PCI is not set
# CONFIG_HSU_DMA_PCI is not set
CONFIG_DMA_ENGINE=y
CONFIG_DMA_ACPI=y

#
# DMA Clients
#
CONFIG_ASYNC_TX_DMA=y
# CONFIG_DMATEST is not set
CONFIG_DMA_ENGINE_RAID=y
CONFIG_DCA=m
# CONFIG_AUXDISPLAY is not set
CONFIG_UIO=m
CONFIG_UIO_CIF=m
# CONFIG_UIO_PDRV_GENIRQ is not set
# CONFIG_UIO_DMEM_GENIRQ is not set
CONFIG_UIO_AEC=m
CONFIG_UIO_SERCOS3=m
CONFIG_UIO_PCI_GENERIC=m
CONFIG_UIO_NETX=m
CONFIG_UIO_MF624=m
CONFIG_VFIO_IOMMU_TYPE1=m
CONFIG_VFIO_VIRQFD=m
CONFIG_VFIO=m
CONFIG_VFIO_PCI=m
CONFIG_VFIO_PCI_VGA=y
CONFIG_VFIO_PCI_MMAP=y
CONFIG_VFIO_PCI_INTX=y
CONFIG_VIRT_DRIVERS=y
CONFIG_VIRTIO=m

#
# Virtio drivers
#
CONFIG_VIRTIO_PCI=m
CONFIG_VIRTIO_PCI_LEGACY=y
CONFIG_VIRTIO_BALLOON=m
CONFIG_VIRTIO_INPUT=m
# CONFIG_VIRTIO_MMIO is not set

#
# Microsoft Hyper-V guest support
#
CONFIG_HYPERV=m
CONFIG_HYPERV_UTILS=m
CONFIG_HYPERV_BALLOON=m

#
# Xen driver support
#
CONFIG_XEN_BALLOON=y
# CONFIG_XEN_BALLOON_MEMORY_HOTPLUG is not set
CONFIG_XEN_SCRUB_PAGES=y
CONFIG_XEN_DEV_EVTCHN=m
CONFIG_XEN_BACKEND=y
CONFIG_XENFS=m
CONFIG_XEN_COMPAT_XENFS=y
CONFIG_XEN_SYS_HYPERVISOR=y
CONFIG_XEN_XENBUS_FRONTEND=y
CONFIG_XEN_GNTDEV=m
CONFIG_XEN_GRANT_DEV_ALLOC=m
CONFIG_SWIOTLB_XEN=y
CONFIG_XEN_TMEM=m
CONFIG_XEN_PCIDEV_BACKEND=m
CONFIG_XEN_SCSI_BACKEND=m
CONFIG_XEN_PRIVCMD=m
CONFIG_XEN_ACPI_PROCESSOR=m
CONFIG_XEN_MCE_LOG=y
CONFIG_XEN_HAVE_PVMMU=y
CONFIG_XEN_EFI=y
CONFIG_XEN_AUTO_XLATE=y
CONFIG_XEN_ACPI=y
CONFIG_STAGING=y
# CONFIG_SLICOSS is not set
CONFIG_PRISM2_USB=m
CONFIG_COMEDI=m
# CONFIG_COMEDI_DEBUG is not set
CONFIG_COMEDI_DEFAULT_BUF_SIZE_KB=2048
CONFIG_COMEDI_DEFAULT_BUF_MAXSIZE_KB=20480
CONFIG_COMEDI_MISC_DRIVERS=y
CONFIG_COMEDI_BOND=m
CONFIG_COMEDI_TEST=m
CONFIG_COMEDI_PARPORT=m
CONFIG_COMEDI_SERIAL2002=m
# CONFIG_COMEDI_ISA_DRIVERS is not set
CONFIG_COMEDI_PCI_DRIVERS=m
CONFIG_COMEDI_8255_PCI=m
CONFIG_COMEDI_ADDI_WATCHDOG=m
CONFIG_COMEDI_ADDI_APCI_1032=m
CONFIG_COMEDI_ADDI_APCI_1500=m
CONFIG_COMEDI_ADDI_APCI_1516=m
CONFIG_COMEDI_ADDI_APCI_1564=m
CONFIG_COMEDI_ADDI_APCI_16XX=m
CONFIG_COMEDI_ADDI_APCI_2032=m
CONFIG_COMEDI_ADDI_APCI_2200=m
CONFIG_COMEDI_ADDI_APCI_3120=m
CONFIG_COMEDI_ADDI_APCI_3501=m
CONFIG_COMEDI_ADDI_APCI_3XXX=m
CONFIG_COMEDI_ADL_PCI6208=m
CONFIG_COMEDI_ADL_PCI7X3X=m
CONFIG_COMEDI_ADL_PCI8164=m
CONFIG_COMEDI_ADL_PCI9111=m
CONFIG_COMEDI_ADL_PCI9118=m
CONFIG_COMEDI_ADV_PCI1710=m
CONFIG_COMEDI_ADV_PCI1723=m
CONFIG_COMEDI_ADV_PCI1724=m
CONFIG_COMEDI_ADV_PCI_DIO=m
CONFIG_COMEDI_AMPLC_DIO200_PCI=m
CONFIG_COMEDI_AMPLC_PC236_PCI=m
CONFIG_COMEDI_AMPLC_PC263_PCI=m
CONFIG_COMEDI_AMPLC_PCI224=m
CONFIG_COMEDI_AMPLC_PCI230=m
CONFIG_COMEDI_CONTEC_PCI_DIO=m
CONFIG_COMEDI_DAS08_PCI=m
CONFIG_COMEDI_DT3000=m
CONFIG_COMEDI_DYNA_PCI10XX=m
CONFIG_COMEDI_GSC_HPDI=m
CONFIG_COMEDI_MF6X4=m
CONFIG_COMEDI_ICP_MULTI=m
CONFIG_COMEDI_DAQBOARD2000=m
CONFIG_COMEDI_JR3_PCI=m
CONFIG_COMEDI_KE_COUNTER=m
CONFIG_COMEDI_CB_PCIDAS64=m
CONFIG_COMEDI_CB_PCIDAS=m
CONFIG_COMEDI_CB_PCIDDA=m
CONFIG_COMEDI_CB_PCIMDAS=m
CONFIG_COMEDI_CB_PCIMDDA=m
CONFIG_COMEDI_ME4000=m
CONFIG_COMEDI_ME_DAQ=m
CONFIG_COMEDI_NI_6527=m
CONFIG_COMEDI_NI_65XX=m
CONFIG_COMEDI_NI_660X=m
CONFIG_COMEDI_NI_670X=m
CONFIG_COMEDI_NI_LABPC_PCI=m
CONFIG_COMEDI_NI_PCIDIO=m
CONFIG_COMEDI_NI_PCIMIO=m
CONFIG_COMEDI_RTD520=m
CONFIG_COMEDI_S626=m
CONFIG_COMEDI_MITE=m
CONFIG_COMEDI_NI_TIOCMD=m
CONFIG_COMEDI_PCMCIA_DRIVERS=m
CONFIG_COMEDI_CB_DAS16_CS=m
CONFIG_COMEDI_DAS08_CS=m
CONFIG_COMEDI_NI_DAQ_700_CS=m
CONFIG_COMEDI_NI_DAQ_DIO24_CS=m
CONFIG_COMEDI_NI_LABPC_CS=m
CONFIG_COMEDI_NI_MIO_CS=m
CONFIG_COMEDI_QUATECH_DAQP_CS=m
CONFIG_COMEDI_USB_DRIVERS=m
CONFIG_COMEDI_DT9812=m
CONFIG_COMEDI_NI_USB6501=m
CONFIG_COMEDI_USBDUX=m
CONFIG_COMEDI_USBDUXFAST=m
CONFIG_COMEDI_USBDUXSIGMA=m
CONFIG_COMEDI_VMK80XX=m
CONFIG_COMEDI_8254=m
CONFIG_COMEDI_8255=m
CONFIG_COMEDI_KCOMEDILIB=m
CONFIG_COMEDI_AMPLC_DIO200=m
CONFIG_COMEDI_AMPLC_PC236=m
CONFIG_COMEDI_DAS08=m
CONFIG_COMEDI_NI_LABPC=m
CONFIG_COMEDI_NI_TIO=m
# CONFIG_PANEL is not set
CONFIG_RTL8192U=m
CONFIG_RTLLIB=m
CONFIG_RTLLIB_CRYPTO_CCMP=m
CONFIG_RTLLIB_CRYPTO_TKIP=m
CONFIG_RTLLIB_CRYPTO_WEP=m
CONFIG_RTL8192E=m
CONFIG_R8712U=m
CONFIG_R8188EU=m
CONFIG_88EU_AP_MODE=y
CONFIG_R8723AU=m
CONFIG_8723AU_AP_MODE=y
CONFIG_8723AU_BT_COEXIST=y
CONFIG_RTS5208=m
# CONFIG_VT6655 is not set
CONFIG_VT6656=m

#
# IIO staging drivers
#

#
# Accelerometers
#
# CONFIG_ADIS16201 is not set
# CONFIG_ADIS16203 is not set
# CONFIG_ADIS16204 is not set
# CONFIG_ADIS16209 is not set
# CONFIG_ADIS16220 is not set
# CONFIG_ADIS16240 is not set
# CONFIG_LIS3L02DQ is not set
# CONFIG_SCA3000 is not set

#
# Analog to digital converters
#
# CONFIG_AD7606 is not set
# CONFIG_AD7780 is not set
# CONFIG_AD7816 is not set
# CONFIG_AD7192 is not set
# CONFIG_AD7280 is not set

#
# Analog digital bi-direction converters
#
# CONFIG_ADT7316 is not set

#
# Capacitance to digital converters
#
# CONFIG_AD7150 is not set
# CONFIG_AD7152 is not set
# CONFIG_AD7746 is not set

#
# Direct Digital Synthesis
#
# CONFIG_AD9832 is not set
# CONFIG_AD9834 is not set

#
# Digital gyroscope sensors
#
# CONFIG_ADIS16060 is not set

#
# Network Analyzer, Impedance Converters
#
# CONFIG_AD5933 is not set

#
# Light sensors
#
CONFIG_SENSORS_ISL29018=m
# CONFIG_SENSORS_ISL29028 is not set
CONFIG_TSL2583=m
# CONFIG_TSL2x7x is not set

#
# Magnetometer sensors
#
# CONFIG_SENSORS_HMC5843_I2C is not set
# CONFIG_SENSORS_HMC5843_SPI is not set

#
# Active energy metering IC
#
# CONFIG_ADE7753 is not set
# CONFIG_ADE7754 is not set
# CONFIG_ADE7758 is not set
# CONFIG_ADE7759 is not set
# CONFIG_ADE7854 is not set

#
# Resolver to digital converters
#
# CONFIG_AD2S90 is not set
# CONFIG_AD2S1200 is not set
# CONFIG_AD2S1210 is not set

#
# Triggers - standalone
#
# CONFIG_IIO_PERIODIC_RTC_TRIGGER is not set
# CONFIG_IIO_SIMPLE_DUMMY is not set
# CONFIG_FB_SM7XX is not set
# CONFIG_FB_SM750 is not set
# CONFIG_FB_XGI is not set
# CONFIG_FT1000 is not set

#
# Speakup console speech
#
CONFIG_SPEAKUP=m
CONFIG_SPEAKUP_SYNTH_ACNTSA=m
CONFIG_SPEAKUP_SYNTH_APOLLO=m
CONFIG_SPEAKUP_SYNTH_AUDPTR=m
CONFIG_SPEAKUP_SYNTH_BNS=m
CONFIG_SPEAKUP_SYNTH_DECTLK=m
CONFIG_SPEAKUP_SYNTH_DECEXT=m
CONFIG_SPEAKUP_SYNTH_LTLK=m
CONFIG_SPEAKUP_SYNTH_SOFT=m
CONFIG_SPEAKUP_SYNTH_SPKOUT=m
CONFIG_SPEAKUP_SYNTH_TXPRT=m
CONFIG_SPEAKUP_SYNTH_DUMMY=m
# CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4 is not set
CONFIG_STAGING_MEDIA=y
# CONFIG_I2C_BCM2048 is not set
# CONFIG_DVB_CXD2099 is not set
# CONFIG_VIDEO_DT3155 is not set
# CONFIG_DVB_MN88472 is not set
# CONFIG_DVB_MN88473 is not set
CONFIG_LIRC_STAGING=y
CONFIG_LIRC_BT829=m
CONFIG_LIRC_IMON=m
# CONFIG_LIRC_PARALLEL is not set
CONFIG_LIRC_SASEM=m
CONFIG_LIRC_SERIAL=m
CONFIG_LIRC_SERIAL_TRANSMITTER=y
CONFIG_LIRC_SIR=m
CONFIG_LIRC_ZILOG=m

#
# Android
#
# CONFIG_USB_WPAN_HCD is not set
CONFIG_WIMAX_GDM72XX=m
# CONFIG_WIMAX_GDM72XX_QOS is not set
# CONFIG_WIMAX_GDM72XX_K_MODE is not set
# CONFIG_WIMAX_GDM72XX_WIMAX2 is not set
CONFIG_WIMAX_GDM72XX_USB=y
# CONFIG_WIMAX_GDM72XX_SDIO is not set
CONFIG_WIMAX_GDM72XX_USB_PM=y
# CONFIG_LTE_GDM724X is not set
# CONFIG_FIREWIRE_SERIAL is not set
# CONFIG_MTD_SPINAND_MT29F is not set
CONFIG_LUSTRE_FS=m
CONFIG_LUSTRE_OBD_MAX_IOCTL_BUFFER=8192
# CONFIG_LUSTRE_DEBUG_EXPENSIVE_CHECK is not set
CONFIG_LUSTRE_LLITE_LLOOP=m
CONFIG_LNET=m
CONFIG_LNET_MAX_PAYLOAD=1048576
# CONFIG_LNET_SELFTEST is not set
CONFIG_LNET_XPRT_IB=m
# CONFIG_DGNC is not set
# CONFIG_DGAP is not set
# CONFIG_GS_FPGABOOT is not set
# CONFIG_CRYPTO_SKEIN is not set
# CONFIG_UNISYSSPAR is not set
# CONFIG_FB_TFT is not set
# CONFIG_I2O is not set
CONFIG_X86_PLATFORM_DEVICES=y
CONFIG_ACER_WMI=m
CONFIG_ACERHDF=m
CONFIG_ALIENWARE_WMI=m
CONFIG_ASUS_LAPTOP=m
CONFIG_DELL_LAPTOP=m
CONFIG_DELL_WMI=m
CONFIG_DELL_WMI_AIO=m
CONFIG_DELL_SMO8800=m
CONFIG_FUJITSU_LAPTOP=m
# CONFIG_FUJITSU_LAPTOP_DEBUG is not set
CONFIG_FUJITSU_TABLET=m
CONFIG_AMILO_RFKILL=m
CONFIG_HP_ACCEL=m
CONFIG_HP_WIRELESS=m
CONFIG_HP_WMI=m
CONFIG_MSI_LAPTOP=m
CONFIG_PANASONIC_LAPTOP=m
CONFIG_COMPAL_LAPTOP=m
CONFIG_SONY_LAPTOP=m
CONFIG_SONYPI_COMPAT=y
CONFIG_IDEAPAD_LAPTOP=m
CONFIG_THINKPAD_ACPI=m
CONFIG_THINKPAD_ACPI_ALSA_SUPPORT=y
# CONFIG_THINKPAD_ACPI_DEBUGFACILITIES is not set
# CONFIG_THINKPAD_ACPI_DEBUG is not set
# CONFIG_THINKPAD_ACPI_UNSAFE_LEDS is not set
CONFIG_THINKPAD_ACPI_VIDEO=y
CONFIG_THINKPAD_ACPI_HOTKEY_POLL=y
CONFIG_SENSORS_HDAPS=m
# CONFIG_INTEL_MENLOW is not set
CONFIG_EEEPC_LAPTOP=m
CONFIG_ASUS_WMI=m
CONFIG_ASUS_NB_WMI=m
CONFIG_EEEPC_WMI=m
CONFIG_ACPI_WMI=m
CONFIG_MSI_WMI=m
CONFIG_TOPSTAR_LAPTOP=m
CONFIG_ACPI_TOSHIBA=m
CONFIG_TOSHIBA_BT_RFKILL=m
CONFIG_TOSHIBA_HAPS=m
CONFIG_ACPI_CMPC=m
CONFIG_INTEL_IPS=m
CONFIG_IBM_RTL=m
CONFIG_SAMSUNG_LAPTOP=m
CONFIG_MXM_WMI=m
CONFIG_INTEL_OAKTRAIL=m
CONFIG_SAMSUNG_Q10=m
CONFIG_APPLE_GMUX=m
CONFIG_INTEL_RST=m
CONFIG_INTEL_SMARTCONNECT=m
CONFIG_PVPANIC=m
CONFIG_CHROME_PLATFORMS=y
CONFIG_CHROMEOS_LAPTOP=m
CONFIG_CHROMEOS_PSTORE=m
CONFIG_CLKDEV_LOOKUP=y
CONFIG_HAVE_CLK_PREPARE=y
CONFIG_COMMON_CLK=y

#
# Common Clock Framework
#
# CONFIG_COMMON_CLK_SI5351 is not set
# CONFIG_COMMON_CLK_PXA is not set
# CONFIG_COMMON_CLK_CDCE706 is not set

#
# Hardware Spinlock drivers
#

#
# Clock Source drivers
#
CONFIG_CLKEVT_I8253=y
CONFIG_I8253_LOCK=y
CONFIG_CLKBLD_I8253=y
# CONFIG_ATMEL_PIT is not set
# CONFIG_SH_TIMER_CMT is not set
# CONFIG_SH_TIMER_MTU2 is not set
# CONFIG_SH_TIMER_TMU is not set
# CONFIG_EM_TIMER_STI is not set
# CONFIG_MAILBOX is not set
CONFIG_IOMMU_API=y
CONFIG_IOMMU_SUPPORT=y

#
# Generic IOMMU Pagetable Support
#
CONFIG_IOMMU_IOVA=y
CONFIG_AMD_IOMMU=y
# CONFIG_AMD_IOMMU_STATS is not set
CONFIG_AMD_IOMMU_V2=y
CONFIG_DMAR_TABLE=y
CONFIG_INTEL_IOMMU=y
# CONFIG_INTEL_IOMMU_DEFAULT_ON is not set
CONFIG_INTEL_IOMMU_FLOPPY_WA=y
CONFIG_IRQ_REMAP=y

#
# Remoteproc drivers
#
# CONFIG_STE_MODEM_RPROC is not set

#
# Rpmsg drivers
#

#
# SOC (System On Chip) specific Drivers
#
# CONFIG_SOC_TI is not set
CONFIG_PM_DEVFREQ=y

#
# DEVFREQ Governors
#
CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=m
# CONFIG_DEVFREQ_GOV_PERFORMANCE is not set
# CONFIG_DEVFREQ_GOV_POWERSAVE is not set
# CONFIG_DEVFREQ_GOV_USERSPACE is not set

#
# DEVFREQ Drivers
#
# CONFIG_PM_DEVFREQ_EVENT is not set
# CONFIG_EXTCON is not set
CONFIG_MEMORY=y
CONFIG_IIO=m
CONFIG_IIO_BUFFER=y
# CONFIG_IIO_BUFFER_CB is not set
CONFIG_IIO_KFIFO_BUF=m
CONFIG_IIO_TRIGGERED_BUFFER=m
CONFIG_IIO_TRIGGER=y
CONFIG_IIO_CONSUMERS_PER_TRIGGER=2

#
# Accelerometers
#
# CONFIG_BMA180 is not set
CONFIG_BMC150_ACCEL=m
CONFIG_HID_SENSOR_ACCEL_3D=m
# CONFIG_IIO_ST_ACCEL_3AXIS is not set
# CONFIG_KXSD9 is not set
# CONFIG_MMA8452 is not set
CONFIG_KXCJK1013=m
CONFIG_MMA9551_CORE=m
CONFIG_MMA9551=m
CONFIG_MMA9553=m

#
# Analog to digital converters
#
# CONFIG_AD7266 is not set
# CONFIG_AD7291 is not set
# CONFIG_AD7298 is not set
# CONFIG_AD7476 is not set
# CONFIG_AD7791 is not set
# CONFIG_AD7793 is not set
# CONFIG_AD7887 is not set
# CONFIG_AD7923 is not set
# CONFIG_AD799X is not set
# CONFIG_MAX1027 is not set
# CONFIG_MAX1363 is not set
# CONFIG_MCP320X is not set
# CONFIG_MCP3422 is not set
# CONFIG_NAU7802 is not set
# CONFIG_TI_ADC081C is not set
# CONFIG_TI_ADC128S052 is not set
CONFIG_VIPERBOARD_ADC=m

#
# Amplifiers
#
# CONFIG_AD8366 is not set

#
# Hid Sensor IIO Common
#
CONFIG_HID_SENSOR_IIO_COMMON=m
CONFIG_HID_SENSOR_IIO_TRIGGER=m

#
# SSP Sensor Common
#
# CONFIG_IIO_SSP_SENSORHUB is not set

#
# Digital to analog converters
#
# CONFIG_AD5064 is not set
# CONFIG_AD5360 is not set
# CONFIG_AD5380 is not set
# CONFIG_AD5421 is not set
# CONFIG_AD5446 is not set
# CONFIG_AD5449 is not set
# CONFIG_AD5504 is not set
# CONFIG_AD5624R_SPI is not set
# CONFIG_AD5686 is not set
# CONFIG_AD5755 is not set
# CONFIG_AD5764 is not set
# CONFIG_AD5791 is not set
# CONFIG_AD7303 is not set
# CONFIG_MAX517 is not set
# CONFIG_MCP4725 is not set
# CONFIG_MCP4922 is not set

#
# Frequency Synthesizers DDS/PLL
#

#
# Clock Generator/Distribution
#
# CONFIG_AD9523 is not set

#
# Phase-Locked Loop (PLL) frequency synthesizers
#
# CONFIG_ADF4350 is not set

#
# Digital gyroscope sensors
#
# CONFIG_ADIS16080 is not set
# CONFIG_ADIS16130 is not set
# CONFIG_ADIS16136 is not set
# CONFIG_ADIS16260 is not set
# CONFIG_ADXRS450 is not set
CONFIG_BMG160=m
CONFIG_HID_SENSOR_GYRO_3D=m
# CONFIG_IIO_ST_GYRO_3AXIS is not set
# CONFIG_ITG3200 is not set

#
# Humidity sensors
#
# CONFIG_DHT11 is not set
# CONFIG_SI7005 is not set
# CONFIG_SI7020 is not set

#
# Inertial measurement units
#
# CONFIG_ADIS16400 is not set
# CONFIG_ADIS16480 is not set
CONFIG_KMX61=m
CONFIG_INV_MPU6050_IIO=m

#
# Light sensors
#
# CONFIG_ADJD_S311 is not set
# CONFIG_AL3320A is not set
# CONFIG_APDS9300 is not set
# CONFIG_CM32181 is not set
# CONFIG_CM3232 is not set
# CONFIG_CM3323 is not set
# CONFIG_CM36651 is not set
# CONFIG_GP2AP020A00F is not set
# CONFIG_ISL29125 is not set
CONFIG_HID_SENSOR_ALS=m
CONFIG_HID_SENSOR_PROX=m
CONFIG_JSA1212=m
# CONFIG_LTR501 is not set
# CONFIG_TCS3414 is not set
# CONFIG_TCS3472 is not set
CONFIG_SENSORS_TSL2563=m
# CONFIG_TSL4531 is not set
# CONFIG_VCNL4000 is not set

#
# Magnetometer sensors
#
CONFIG_AK8975=m
# CONFIG_AK09911 is not set
# CONFIG_MAG3110 is not set
CONFIG_HID_SENSOR_MAGNETOMETER_3D=m
# CONFIG_IIO_ST_MAGN_3AXIS is not set

#
# Inclinometer sensors
#
CONFIG_HID_SENSOR_INCLINOMETER_3D=m
CONFIG_HID_SENSOR_DEVICE_ROTATION=m

#
# Triggers - standalone
#
# CONFIG_IIO_INTERRUPT_TRIGGER is not set
# CONFIG_IIO_SYSFS_TRIGGER is not set

#
# Pressure sensors
#
CONFIG_BMP280=m
CONFIG_HID_SENSOR_PRESS=m
# CONFIG_MPL115 is not set
# CONFIG_MPL3115 is not set
# CONFIG_MS5611 is not set
# CONFIG_IIO_ST_PRESS is not set
# CONFIG_T5403 is not set

#
# Lightning sensors
#
# CONFIG_AS3935 is not set

#
# Proximity sensors
#
CONFIG_SX9500=m

#
# Temperature sensors
#
# CONFIG_MLX90614 is not set
# CONFIG_TMP006 is not set
# CONFIG_NTB is not set
# CONFIG_VME_BUS is not set
# CONFIG_PWM is not set
# CONFIG_IPACK_BUS is not set
# CONFIG_RESET_CONTROLLER is not set
# CONFIG_FMC is not set

#
# PHY Subsystem
#
CONFIG_GENERIC_PHY=y
# CONFIG_BCM_KONA_USB2_PHY is not set
CONFIG_POWERCAP=y
CONFIG_INTEL_RAPL=m
# CONFIG_MCB is not set
CONFIG_RAS=y
CONFIG_THUNDERBOLT=m

#
# Android
#
# CONFIG_ANDROID is not set

#
# Firmware Drivers
#
CONFIG_EDD=m
# CONFIG_EDD_OFF is not set
CONFIG_FIRMWARE_MEMMAP=y
CONFIG_DELL_RBU=m
CONFIG_DCDBAS=m
CONFIG_DMIID=y
CONFIG_DMI_SYSFS=y
CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y
CONFIG_ISCSI_IBFT_FIND=y
CONFIG_ISCSI_IBFT=m
# CONFIG_GOOGLE_FIRMWARE is not set

#
# EFI (Extensible Firmware Interface) Support
#
CONFIG_EFI_VARS=m
CONFIG_EFI_VARS_PSTORE=m
# CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE is not set
CONFIG_EFI_RUNTIME_MAP=y
CONFIG_EFI_RUNTIME_WRAPPERS=y
CONFIG_UEFI_CPER=y

#
# File systems
#
CONFIG_DCACHE_WORD_ACCESS=y
# CONFIG_EXT2_FS is not set
# CONFIG_EXT3_FS is not set
CONFIG_EXT4_FS=m
CONFIG_EXT4_USE_FOR_EXT23=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EXT4_FS_SECURITY=y
# CONFIG_EXT4_ENCRYPTION is not set
# CONFIG_EXT4_DEBUG is not set
CONFIG_JBD2=m
# CONFIG_JBD2_DEBUG is not set
CONFIG_FS_MBCACHE=m
CONFIG_REISERFS_FS=m
# CONFIG_REISERFS_CHECK is not set
# CONFIG_REISERFS_PROC_INFO is not set
CONFIG_REISERFS_FS_XATTR=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_REISERFS_FS_SECURITY=y
CONFIG_JFS_FS=m
CONFIG_JFS_POSIX_ACL=y
CONFIG_JFS_SECURITY=y
# CONFIG_JFS_DEBUG is not set
# CONFIG_JFS_STATISTICS is not set
CONFIG_XFS_FS=m
CONFIG_XFS_QUOTA=y
CONFIG_XFS_POSIX_ACL=y
CONFIG_XFS_RT=y
# CONFIG_XFS_WARN is not set
# CONFIG_XFS_DEBUG is not set
CONFIG_GFS2_FS=m
CONFIG_GFS2_FS_LOCKING_DLM=y
CONFIG_OCFS2_FS=m
CONFIG_OCFS2_FS_O2CB=m
CONFIG_OCFS2_FS_USERSPACE_CLUSTER=m
CONFIG_OCFS2_FS_STATS=y
CONFIG_OCFS2_DEBUG_MASKLOG=y
# CONFIG_OCFS2_DEBUG_FS is not set
CONFIG_BTRFS_FS=m
CONFIG_BTRFS_FS_POSIX_ACL=y
# CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set
# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set
# CONFIG_BTRFS_DEBUG is not set
# CONFIG_BTRFS_ASSERT is not set
CONFIG_NILFS2_FS=m
CONFIG_F2FS_FS=m
CONFIG_F2FS_STAT_FS=y
CONFIG_F2FS_FS_XATTR=y
CONFIG_F2FS_FS_POSIX_ACL=y
CONFIG_F2FS_FS_SECURITY=y
# CONFIG_F2FS_CHECK_FS is not set
# CONFIG_F2FS_IO_TRACE is not set
# CONFIG_FS_DAX is not set
CONFIG_FS_POSIX_ACL=y
CONFIG_EXPORTFS=y
CONFIG_FILE_LOCKING=y
CONFIG_FSNOTIFY=y
CONFIG_DNOTIFY=y
CONFIG_INOTIFY_USER=y
CONFIG_FANOTIFY=y
# CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set
CONFIG_QUOTA=y
CONFIG_QUOTA_NETLINK_INTERFACE=y
CONFIG_PRINT_QUOTA_WARNING=y
# CONFIG_QUOTA_DEBUG is not set
CONFIG_QUOTA_TREE=m
CONFIG_QFMT_V1=m
CONFIG_QFMT_V2=m
CONFIG_QUOTACTL=y
CONFIG_QUOTACTL_COMPAT=y
CONFIG_AUTOFS4_FS=m
CONFIG_FUSE_FS=m
CONFIG_CUSE=m
CONFIG_OVERLAY_FS=m

#
# Caches
#
CONFIG_FSCACHE=m
CONFIG_FSCACHE_STATS=y
# CONFIG_FSCACHE_HISTOGRAM is not set
# CONFIG_FSCACHE_DEBUG is not set
# CONFIG_FSCACHE_OBJECT_LIST is not set
CONFIG_CACHEFILES=m
# CONFIG_CACHEFILES_DEBUG is not set
# CONFIG_CACHEFILES_HISTOGRAM is not set

#
# CD-ROM/DVD Filesystems
#
CONFIG_ISO9660_FS=m
CONFIG_JOLIET=y
CONFIG_ZISOFS=y
CONFIG_UDF_FS=m
CONFIG_UDF_NLS=y

#
# DOS/FAT/NT Filesystems
#
CONFIG_FAT_FS=m
CONFIG_MSDOS_FS=m
CONFIG_VFAT_FS=m
CONFIG_FAT_DEFAULT_CODEPAGE=437
CONFIG_FAT_DEFAULT_IOCHARSET="utf8"
CONFIG_NTFS_FS=m
# CONFIG_NTFS_DEBUG is not set
CONFIG_NTFS_RW=y

#
# Pseudo filesystems
#
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_PROC_VMCORE=y
CONFIG_PROC_SYSCTL=y
CONFIG_PROC_PAGE_MONITOR=y
CONFIG_KERNFS=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_TMPFS_XATTR=y
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_CONFIGFS_FS=m
CONFIG_EFIVAR_FS=m
CONFIG_MISC_FILESYSTEMS=y
CONFIG_ADFS_FS=m
# CONFIG_ADFS_FS_RW is not set
CONFIG_AFFS_FS=m
CONFIG_ECRYPT_FS=m
CONFIG_ECRYPT_FS_MESSAGING=y
CONFIG_HFS_FS=m
CONFIG_HFSPLUS_FS=m
# CONFIG_HFSPLUS_FS_POSIX_ACL is not set
CONFIG_BEFS_FS=m
# CONFIG_BEFS_DEBUG is not set
CONFIG_BFS_FS=m
CONFIG_EFS_FS=m
CONFIG_JFFS2_FS=m
CONFIG_JFFS2_FS_DEBUG=0
CONFIG_JFFS2_FS_WRITEBUFFER=y
# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
CONFIG_JFFS2_SUMMARY=y
CONFIG_JFFS2_FS_XATTR=y
CONFIG_JFFS2_FS_POSIX_ACL=y
CONFIG_JFFS2_FS_SECURITY=y
CONFIG_JFFS2_COMPRESSION_OPTIONS=y
CONFIG_JFFS2_ZLIB=y
CONFIG_JFFS2_LZO=y
CONFIG_JFFS2_RTIME=y
# CONFIG_JFFS2_RUBIN is not set
# CONFIG_JFFS2_CMODE_NONE is not set
CONFIG_JFFS2_CMODE_PRIORITY=y
# CONFIG_JFFS2_CMODE_SIZE is not set
# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
CONFIG_UBIFS_FS=m
CONFIG_UBIFS_FS_ADVANCED_COMPR=y
CONFIG_UBIFS_FS_LZO=y
CONFIG_UBIFS_FS_ZLIB=y
CONFIG_LOGFS=m
CONFIG_CRAMFS=m
CONFIG_SQUASHFS=m
CONFIG_SQUASHFS_FILE_CACHE=y
# CONFIG_SQUASHFS_FILE_DIRECT is not set
CONFIG_SQUASHFS_DECOMP_SINGLE=y
# CONFIG_SQUASHFS_DECOMP_MULTI is not set
# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set
CONFIG_SQUASHFS_XATTR=y
CONFIG_SQUASHFS_ZLIB=y
# CONFIG_SQUASHFS_LZ4 is not set
CONFIG_SQUASHFS_LZO=y
CONFIG_SQUASHFS_XZ=y
# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
# CONFIG_SQUASHFS_EMBEDDED is not set
CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
CONFIG_VXFS_FS=m
CONFIG_MINIX_FS=m
CONFIG_OMFS_FS=m
# CONFIG_HPFS_FS is not set
CONFIG_QNX4FS_FS=m
CONFIG_QNX6FS_FS=m
# CONFIG_QNX6FS_DEBUG is not set
CONFIG_ROMFS_FS=m
# CONFIG_ROMFS_BACKED_BY_BLOCK is not set
# CONFIG_ROMFS_BACKED_BY_MTD is not set
CONFIG_ROMFS_BACKED_BY_BOTH=y
CONFIG_ROMFS_ON_BLOCK=y
CONFIG_ROMFS_ON_MTD=y
CONFIG_PSTORE=y
# CONFIG_PSTORE_CONSOLE is not set
# CONFIG_PSTORE_PMSG is not set
# CONFIG_PSTORE_FTRACE is not set
CONFIG_PSTORE_RAM=m
CONFIG_SYSV_FS=m
CONFIG_UFS_FS=m
# CONFIG_UFS_FS_WRITE is not set
# CONFIG_UFS_DEBUG is not set
CONFIG_EXOFS_FS=m
# CONFIG_EXOFS_DEBUG is not set
CONFIG_ORE=m
CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_NFS_FS=m
CONFIG_NFS_V2=m
CONFIG_NFS_V3=m
CONFIG_NFS_V3_ACL=y
CONFIG_NFS_V4=m
CONFIG_NFS_SWAP=y
CONFIG_NFS_V4_1=y
CONFIG_NFS_V4_2=y
CONFIG_PNFS_FILE_LAYOUT=m
CONFIG_PNFS_BLOCK=m
CONFIG_PNFS_OBJLAYOUT=m
CONFIG_PNFS_FLEXFILE_LAYOUT=m
CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org"
# CONFIG_NFS_V4_1_MIGRATION is not set
CONFIG_NFS_V4_SECURITY_LABEL=y
CONFIG_NFS_FSCACHE=y
# CONFIG_NFS_USE_LEGACY_DNS is not set
CONFIG_NFS_USE_KERNEL_DNS=y
CONFIG_NFS_DEBUG=y
CONFIG_NFSD=m
CONFIG_NFSD_V2_ACL=y
CONFIG_NFSD_V3=y
CONFIG_NFSD_V3_ACL=y
CONFIG_NFSD_V4=y
# CONFIG_NFSD_PNFS is not set
CONFIG_NFSD_V4_SECURITY_LABEL=y
# CONFIG_NFSD_FAULT_INJECTION is not set
CONFIG_GRACE_PERIOD=m
CONFIG_LOCKD=m
CONFIG_LOCKD_V4=y
CONFIG_NFS_ACL_SUPPORT=m
CONFIG_NFS_COMMON=y
CONFIG_SUNRPC=m
CONFIG_SUNRPC_GSS=m
CONFIG_SUNRPC_BACKCHANNEL=y
CONFIG_SUNRPC_SWAP=y
CONFIG_RPCSEC_GSS_KRB5=m
CONFIG_SUNRPC_DEBUG=y
CONFIG_SUNRPC_XPRT_RDMA_CLIENT=m
CONFIG_SUNRPC_XPRT_RDMA_SERVER=m
CONFIG_CEPH_FS=m
CONFIG_CEPH_FSCACHE=y
CONFIG_CEPH_FS_POSIX_ACL=y
CONFIG_CIFS=m
# CONFIG_CIFS_STATS is not set
CONFIG_CIFS_WEAK_PW_HASH=y
CONFIG_CIFS_UPCALL=y
CONFIG_CIFS_XATTR=y
CONFIG_CIFS_POSIX=y
CONFIG_CIFS_ACL=y
CONFIG_CIFS_DEBUG=y
# CONFIG_CIFS_DEBUG2 is not set
CONFIG_CIFS_DFS_UPCALL=y
CONFIG_CIFS_SMB2=y
CONFIG_CIFS_FSCACHE=y
CONFIG_NCP_FS=m
CONFIG_NCPFS_PACKET_SIGNING=y
CONFIG_NCPFS_IOCTL_LOCKING=y
CONFIG_NCPFS_STRONG=y
CONFIG_NCPFS_NFS_NS=y
CONFIG_NCPFS_OS2_NS=y
# CONFIG_NCPFS_SMALLDOS is not set
CONFIG_NCPFS_NLS=y
CONFIG_NCPFS_EXTRAS=y
CONFIG_CODA_FS=m
CONFIG_AFS_FS=m
# CONFIG_AFS_DEBUG is not set
CONFIG_AFS_FSCACHE=y
CONFIG_9P_FS=m
CONFIG_9P_FSCACHE=y
CONFIG_9P_FS_POSIX_ACL=y
CONFIG_9P_FS_SECURITY=y
CONFIG_NLS=y
CONFIG_NLS_DEFAULT="utf8"
CONFIG_NLS_CODEPAGE_437=m
CONFIG_NLS_CODEPAGE_737=m
CONFIG_NLS_CODEPAGE_775=m
CONFIG_NLS_CODEPAGE_850=m
CONFIG_NLS_CODEPAGE_852=m
CONFIG_NLS_CODEPAGE_855=m
CONFIG_NLS_CODEPAGE_857=m
CONFIG_NLS_CODEPAGE_860=m
CONFIG_NLS_CODEPAGE_861=m
CONFIG_NLS_CODEPAGE_862=m
CONFIG_NLS_CODEPAGE_863=m
CONFIG_NLS_CODEPAGE_864=m
CONFIG_NLS_CODEPAGE_865=m
CONFIG_NLS_CODEPAGE_866=m
CONFIG_NLS_CODEPAGE_869=m
CONFIG_NLS_CODEPAGE_936=m
CONFIG_NLS_CODEPAGE_950=m
CONFIG_NLS_CODEPAGE_932=m
CONFIG_NLS_CODEPAGE_949=m
CONFIG_NLS_CODEPAGE_874=m
CONFIG_NLS_ISO8859_8=m
CONFIG_NLS_CODEPAGE_1250=m
CONFIG_NLS_CODEPAGE_1251=m
CONFIG_NLS_ASCII=m
CONFIG_NLS_ISO8859_1=m
CONFIG_NLS_ISO8859_2=m
CONFIG_NLS_ISO8859_3=m
CONFIG_NLS_ISO8859_4=m
CONFIG_NLS_ISO8859_5=m
CONFIG_NLS_ISO8859_6=m
CONFIG_NLS_ISO8859_7=m
CONFIG_NLS_ISO8859_9=m
CONFIG_NLS_ISO8859_13=m
CONFIG_NLS_ISO8859_14=m
CONFIG_NLS_ISO8859_15=m
CONFIG_NLS_KOI8_R=m
CONFIG_NLS_KOI8_U=m
CONFIG_NLS_MAC_ROMAN=m
CONFIG_NLS_MAC_CELTIC=m
CONFIG_NLS_MAC_CENTEURO=m
CONFIG_NLS_MAC_CROATIAN=m
CONFIG_NLS_MAC_CYRILLIC=m
CONFIG_NLS_MAC_GAELIC=m
CONFIG_NLS_MAC_GREEK=m
CONFIG_NLS_MAC_ICELAND=m
CONFIG_NLS_MAC_INUIT=m
CONFIG_NLS_MAC_ROMANIAN=m
CONFIG_NLS_MAC_TURKISH=m
CONFIG_NLS_UTF8=m
CONFIG_DLM=m
CONFIG_DLM_DEBUG=y

#
# Kernel hacking
#
CONFIG_TRACE_IRQFLAGS_SUPPORT=y

#
# printk and dmesg options
#
CONFIG_PRINTK_TIME=y
CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
CONFIG_BOOT_PRINTK_DELAY=y
CONFIG_DYNAMIC_DEBUG=y

#
# Compile-time checks and compiler options
#
CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_INFO_REDUCED is not set
# CONFIG_DEBUG_INFO_SPLIT is not set
# CONFIG_DEBUG_INFO_DWARF4 is not set
# CONFIG_GDB_SCRIPTS is not set
CONFIG_ENABLE_WARN_DEPRECATED=y
CONFIG_ENABLE_MUST_CHECK=y
CONFIG_FRAME_WARN=2048
CONFIG_STRIP_ASM_SYMS=y
# CONFIG_READABLE_ASM is not set
CONFIG_UNUSED_SYMBOLS=y
# CONFIG_PAGE_OWNER is not set
CONFIG_DEBUG_FS=y
# CONFIG_HEADERS_CHECK is not set
# CONFIG_DEBUG_SECTION_MISMATCH is not set
CONFIG_ARCH_WANT_FRAME_POINTERS=y
# CONFIG_FRAME_POINTER is not set
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
CONFIG_MAGIC_SYSRQ=y
CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x01b6
CONFIG_DEBUG_KERNEL=y

#
# Memory Debugging
#
# CONFIG_PAGE_EXTENSION is not set
# CONFIG_DEBUG_PAGEALLOC is not set
# CONFIG_DEBUG_OBJECTS is not set
# CONFIG_DEBUG_SLAB is not set
CONFIG_HAVE_DEBUG_KMEMLEAK=y
# CONFIG_DEBUG_KMEMLEAK is not set
# CONFIG_DEBUG_STACK_USAGE is not set
# CONFIG_DEBUG_VM is not set
# CONFIG_DEBUG_VIRTUAL is not set
CONFIG_DEBUG_MEMORY_INIT=y
# CONFIG_DEBUG_PER_CPU_MAPS is not set
CONFIG_HAVE_DEBUG_STACKOVERFLOW=y
# CONFIG_DEBUG_STACKOVERFLOW is not set
CONFIG_HAVE_ARCH_KMEMCHECK=y
CONFIG_HAVE_ARCH_KASAN=y
CONFIG_KASAN_SHADOW_OFFSET=0xdffffc0000000000
# CONFIG_DEBUG_SHIRQ is not set

#
# Debug Lockups and Hangs
#
CONFIG_LOCKUP_DETECTOR=y
CONFIG_HARDLOCKUP_DETECTOR=y
# CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set
CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0
# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
CONFIG_DETECT_HUNG_TASK=y
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
# CONFIG_PANIC_ON_OOPS is not set
CONFIG_PANIC_ON_OOPS_VALUE=0
CONFIG_PANIC_TIMEOUT=0
CONFIG_SCHED_DEBUG=y
# CONFIG_SCHEDSTATS is not set
# CONFIG_SCHED_STACK_END_CHECK is not set
# CONFIG_DEBUG_TIMEKEEPING is not set
CONFIG_TIMER_STATS=y

#
# Lock Debugging (spinlocks, mutexes, etc...)
#
# CONFIG_DEBUG_RT_MUTEXES is not set
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_MUTEXES is not set
# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set
# CONFIG_DEBUG_LOCK_ALLOC is not set
# CONFIG_PROVE_LOCKING is not set
# CONFIG_LOCK_STAT is not set
# CONFIG_DEBUG_ATOMIC_SLEEP is not set
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
# CONFIG_LOCK_TORTURE_TEST is not set
CONFIG_STACKTRACE=y
# CONFIG_DEBUG_KOBJECT is not set
CONFIG_DEBUG_BUGVERBOSE=y
CONFIG_DEBUG_LIST=y
# CONFIG_DEBUG_PI_LIST is not set
# CONFIG_DEBUG_SG is not set
# CONFIG_DEBUG_NOTIFIERS is not set
# CONFIG_DEBUG_CREDENTIALS is not set

#
# RCU Debugging
#
# CONFIG_PROVE_RCU is not set
# CONFIG_SPARSE_RCU_POINTER is not set
# CONFIG_TORTURE_TEST is not set
# CONFIG_RCU_TORTURE_TEST is not set
CONFIG_RCU_CPU_STALL_TIMEOUT=21
# CONFIG_RCU_CPU_STALL_INFO is not set
# CONFIG_RCU_TRACE is not set
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
# CONFIG_NOTIFIER_ERROR_INJECTION is not set
# CONFIG_FAULT_INJECTION is not set
# CONFIG_LATENCYTOP is not set
CONFIG_ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS=y
# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
CONFIG_USER_STACKTRACE_SUPPORT=y
CONFIG_NOP_TRACER=y
CONFIG_HAVE_FUNCTION_TRACER=y
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y
CONFIG_HAVE_DYNAMIC_FTRACE=y
CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
CONFIG_HAVE_FENTRY=y
CONFIG_HAVE_C_RECORDMCOUNT=y
CONFIG_TRACER_MAX_TRACE=y
CONFIG_TRACE_CLOCK=y
CONFIG_RING_BUFFER=y
CONFIG_EVENT_TRACING=y
CONFIG_CONTEXT_SWITCH_TRACER=y
CONFIG_RING_BUFFER_ALLOW_SWAP=y
CONFIG_TRACING=y
CONFIG_GENERIC_TRACER=y
CONFIG_TRACING_SUPPORT=y
CONFIG_FTRACE=y
CONFIG_FUNCTION_TRACER=y
CONFIG_FUNCTION_GRAPH_TRACER=y
# CONFIG_IRQSOFF_TRACER is not set
# CONFIG_SCHED_TRACER is not set
CONFIG_FTRACE_SYSCALLS=y
CONFIG_TRACER_SNAPSHOT=y
# CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set
CONFIG_BRANCH_PROFILE_NONE=y
# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
# CONFIG_PROFILE_ALL_BRANCHES is not set
CONFIG_STACK_TRACER=y
CONFIG_BLK_DEV_IO_TRACE=y
CONFIG_KPROBE_EVENT=y
CONFIG_UPROBE_EVENT=y
CONFIG_PROBE_EVENTS=y
CONFIG_DYNAMIC_FTRACE=y
CONFIG_DYNAMIC_FTRACE_WITH_REGS=y
# CONFIG_FUNCTION_PROFILER is not set
CONFIG_FTRACE_MCOUNT_RECORD=y
# CONFIG_FTRACE_STARTUP_TEST is not set
CONFIG_MMIOTRACE=y
# CONFIG_MMIOTRACE_TEST is not set
# CONFIG_TRACEPOINT_BENCHMARK is not set
# CONFIG_RING_BUFFER_BENCHMARK is not set
# CONFIG_RING_BUFFER_STARTUP_TEST is not set
# CONFIG_TRACE_ENUM_MAP_FILE is not set

#
# Runtime Testing
#
# CONFIG_LKDTM is not set
# CONFIG_TEST_LIST_SORT is not set
# CONFIG_KPROBES_SANITY_TEST is not set
# CONFIG_BACKTRACE_SELF_TEST is not set
# CONFIG_RBTREE_TEST is not set
# CONFIG_INTERVAL_TREE_TEST is not set
# CONFIG_PERCPU_TEST is not set
# CONFIG_ATOMIC64_SELFTEST is not set
# CONFIG_ASYNC_RAID6_TEST is not set
# CONFIG_TEST_HEXDUMP is not set
# CONFIG_TEST_STRING_HELPERS is not set
# CONFIG_TEST_KSTRTOX is not set
# CONFIG_TEST_RHASHTABLE is not set
# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
# CONFIG_DMA_API_DEBUG is not set
# CONFIG_TEST_LKM is not set
# CONFIG_TEST_USER_COPY is not set
# CONFIG_TEST_BPF is not set
# CONFIG_TEST_FIRMWARE is not set
# CONFIG_TEST_UDELAY is not set
CONFIG_MEMTEST=y
# CONFIG_SAMPLES is not set
CONFIG_HAVE_ARCH_KGDB=y
# CONFIG_KGDB is not set
CONFIG_STRICT_DEVMEM=y
# CONFIG_X86_VERBOSE_BOOTUP is not set
CONFIG_EARLY_PRINTK=y
# CONFIG_EARLY_PRINTK_DBGP is not set
CONFIG_EARLY_PRINTK_EFI=y
# CONFIG_X86_PTDUMP is not set
CONFIG_DEBUG_RODATA=y
# CONFIG_DEBUG_RODATA_TEST is not set
CONFIG_DEBUG_SET_MODULE_RONX=y
# CONFIG_DEBUG_NX_TEST is not set
CONFIG_DOUBLEFAULT=y
# CONFIG_DEBUG_TLBFLUSH is not set
# CONFIG_IOMMU_DEBUG is not set
# CONFIG_IOMMU_STRESS is not set
CONFIG_HAVE_MMIOTRACE_SUPPORT=y
# CONFIG_X86_DECODER_SELFTEST is not set
CONFIG_IO_DELAY_TYPE_0X80=0
CONFIG_IO_DELAY_TYPE_0XED=1
CONFIG_IO_DELAY_TYPE_UDELAY=2
CONFIG_IO_DELAY_TYPE_NONE=3
CONFIG_IO_DELAY_0X80=y
# CONFIG_IO_DELAY_0XED is not set
# CONFIG_IO_DELAY_UDELAY is not set
# CONFIG_IO_DELAY_NONE is not set
CONFIG_DEFAULT_IO_DELAY_TYPE=0
# CONFIG_DEBUG_BOOT_PARAMS is not set
# CONFIG_CPA_DEBUG is not set
CONFIG_OPTIMIZE_INLINING=y
# CONFIG_DEBUG_NMI_SELFTEST is not set
# CONFIG_X86_DEBUG_STATIC_CPU_HAS is not set

#
# Security options
#
CONFIG_KEYS=y
# CONFIG_PERSISTENT_KEYRINGS is not set
# CONFIG_BIG_KEYS is not set
# CONFIG_TRUSTED_KEYS is not set
# CONFIG_ENCRYPTED_KEYS is not set
# CONFIG_SECURITY_DMESG_RESTRICT is not set
CONFIG_SECURITY=y
CONFIG_SECURITYFS=y
CONFIG_SECURITY_NETWORK=y
CONFIG_SECURITY_NETWORK_XFRM=y
CONFIG_SECURITY_PATH=y
# CONFIG_INTEL_TXT is not set
CONFIG_LSM_MMAP_MIN_ADDR=65536
CONFIG_SECURITY_SELINUX=y
# CONFIG_SECURITY_SELINUX_BOOTPARAM is not set
# CONFIG_SECURITY_SELINUX_DISABLE is not set
CONFIG_SECURITY_SELINUX_DEVELOP=y
CONFIG_SECURITY_SELINUX_AVC_STATS=y
CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set
# CONFIG_SECURITY_SMACK is not set
CONFIG_SECURITY_TOMOYO=y
CONFIG_SECURITY_TOMOYO_MAX_ACCEPT_ENTRY=2048
CONFIG_SECURITY_TOMOYO_MAX_AUDIT_LOG=1024
# CONFIG_SECURITY_TOMOYO_OMIT_USERSPACE_LOADER is not set
CONFIG_SECURITY_TOMOYO_POLICY_LOADER="/sbin/tomoyo-init"
CONFIG_SECURITY_TOMOYO_ACTIVATION_TRIGGER="/sbin/init"
CONFIG_SECURITY_APPARMOR=y
CONFIG_SECURITY_APPARMOR_BOOTPARAM_VALUE=1
CONFIG_SECURITY_APPARMOR_HASH=y
CONFIG_SECURITY_YAMA=y
CONFIG_SECURITY_YAMA_STACKED=y
CONFIG_INTEGRITY=y
# CONFIG_INTEGRITY_SIGNATURE is not set
CONFIG_INTEGRITY_AUDIT=y
# CONFIG_IMA is not set
# CONFIG_EVM is not set
# CONFIG_DEFAULT_SECURITY_SELINUX is not set
# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
# CONFIG_DEFAULT_SECURITY_APPARMOR is not set
# CONFIG_DEFAULT_SECURITY_YAMA is not set
CONFIG_DEFAULT_SECURITY_DAC=y
CONFIG_DEFAULT_SECURITY=""
CONFIG_XOR_BLOCKS=m
CONFIG_ASYNC_CORE=m
CONFIG_ASYNC_MEMCPY=m
CONFIG_ASYNC_XOR=m
CONFIG_ASYNC_PQ=m
CONFIG_ASYNC_RAID6_RECOV=m
CONFIG_CRYPTO=y

#
# Crypto core or helper
#
CONFIG_CRYPTO_ALGAPI=y
CONFIG_CRYPTO_ALGAPI2=y
CONFIG_CRYPTO_AEAD=m
CONFIG_CRYPTO_AEAD2=y
CONFIG_CRYPTO_BLKCIPHER=m
CONFIG_CRYPTO_BLKCIPHER2=y
CONFIG_CRYPTO_HASH=y
CONFIG_CRYPTO_HASH2=y
CONFIG_CRYPTO_RNG=m
CONFIG_CRYPTO_RNG2=y
CONFIG_CRYPTO_PCOMP=m
CONFIG_CRYPTO_PCOMP2=y
CONFIG_CRYPTO_MANAGER=y
CONFIG_CRYPTO_MANAGER2=y
# CONFIG_CRYPTO_USER is not set
# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set
CONFIG_CRYPTO_GF128MUL=m
CONFIG_CRYPTO_NULL=m
CONFIG_CRYPTO_PCRYPT=m
CONFIG_CRYPTO_WORKQUEUE=y
CONFIG_CRYPTO_CRYPTD=m
# CONFIG_CRYPTO_MCRYPTD is not set
CONFIG_CRYPTO_AUTHENC=m
CONFIG_CRYPTO_TEST=m
CONFIG_CRYPTO_ABLK_HELPER=m
CONFIG_CRYPTO_GLUE_HELPER_X86=m

#
# Authenticated Encryption with Associated Data
#
CONFIG_CRYPTO_CCM=m
CONFIG_CRYPTO_GCM=m
CONFIG_CRYPTO_SEQIV=m

#
# Block modes
#
CONFIG_CRYPTO_CBC=m
CONFIG_CRYPTO_CTR=m
CONFIG_CRYPTO_CTS=m
CONFIG_CRYPTO_ECB=m
CONFIG_CRYPTO_LRW=m
CONFIG_CRYPTO_PCBC=m
CONFIG_CRYPTO_XTS=m

#
# Hash modes
#
CONFIG_CRYPTO_CMAC=m
CONFIG_CRYPTO_HMAC=m
CONFIG_CRYPTO_XCBC=m
CONFIG_CRYPTO_VMAC=m

#
# Digest
#
CONFIG_CRYPTO_CRC32C=m
CONFIG_CRYPTO_CRC32C_INTEL=m
CONFIG_CRYPTO_CRC32=m
CONFIG_CRYPTO_CRC32_PCLMUL=m
CONFIG_CRYPTO_CRCT10DIF=y
CONFIG_CRYPTO_CRCT10DIF_PCLMUL=m
CONFIG_CRYPTO_GHASH=m
CONFIG_CRYPTO_MD4=m
CONFIG_CRYPTO_MD5=y
CONFIG_CRYPTO_MICHAEL_MIC=m
CONFIG_CRYPTO_RMD128=m
CONFIG_CRYPTO_RMD160=m
CONFIG_CRYPTO_RMD256=m
CONFIG_CRYPTO_RMD320=m
CONFIG_CRYPTO_SHA1=y
CONFIG_CRYPTO_SHA1_SSSE3=m
CONFIG_CRYPTO_SHA256_SSSE3=m
CONFIG_CRYPTO_SHA512_SSSE3=m
# CONFIG_CRYPTO_SHA1_MB is not set
CONFIG_CRYPTO_SHA256=m
CONFIG_CRYPTO_SHA512=m
CONFIG_CRYPTO_TGR192=m
CONFIG_CRYPTO_WP512=m
CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=m

#
# Ciphers
#
CONFIG_CRYPTO_AES=y
CONFIG_CRYPTO_AES_X86_64=m
CONFIG_CRYPTO_AES_NI_INTEL=m
CONFIG_CRYPTO_ANUBIS=m
CONFIG_CRYPTO_ARC4=m
CONFIG_CRYPTO_BLOWFISH=m
CONFIG_CRYPTO_BLOWFISH_COMMON=m
CONFIG_CRYPTO_BLOWFISH_X86_64=m
CONFIG_CRYPTO_CAMELLIA=m
CONFIG_CRYPTO_CAMELLIA_X86_64=m
CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64=m
CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64=m
CONFIG_CRYPTO_CAST_COMMON=m
CONFIG_CRYPTO_CAST5=m
CONFIG_CRYPTO_CAST5_AVX_X86_64=m
CONFIG_CRYPTO_CAST6=m
CONFIG_CRYPTO_CAST6_AVX_X86_64=m
CONFIG_CRYPTO_DES=m
# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set
CONFIG_CRYPTO_FCRYPT=m
CONFIG_CRYPTO_KHAZAD=m
CONFIG_CRYPTO_SALSA20=m
CONFIG_CRYPTO_SALSA20_X86_64=m
CONFIG_CRYPTO_SEED=m
CONFIG_CRYPTO_SERPENT=m
CONFIG_CRYPTO_SERPENT_SSE2_X86_64=m
CONFIG_CRYPTO_SERPENT_AVX_X86_64=m
CONFIG_CRYPTO_SERPENT_AVX2_X86_64=m
CONFIG_CRYPTO_TEA=m
CONFIG_CRYPTO_TWOFISH=m
CONFIG_CRYPTO_TWOFISH_COMMON=m
CONFIG_CRYPTO_TWOFISH_X86_64=m
CONFIG_CRYPTO_TWOFISH_X86_64_3WAY=m
CONFIG_CRYPTO_TWOFISH_AVX_X86_64=m

#
# Compression
#
CONFIG_CRYPTO_DEFLATE=m
CONFIG_CRYPTO_ZLIB=m
CONFIG_CRYPTO_LZO=y
CONFIG_CRYPTO_LZ4=m
CONFIG_CRYPTO_LZ4HC=m

#
# Random Number Generation
#
CONFIG_CRYPTO_ANSI_CPRNG=m
# CONFIG_CRYPTO_DRBG_MENU is not set
CONFIG_CRYPTO_USER_API=m
CONFIG_CRYPTO_USER_API_HASH=m
CONFIG_CRYPTO_USER_API_SKCIPHER=m
# CONFIG_CRYPTO_USER_API_RNG is not set
CONFIG_CRYPTO_HW=y
CONFIG_CRYPTO_DEV_PADLOCK=m
CONFIG_CRYPTO_DEV_PADLOCK_AES=m
CONFIG_CRYPTO_DEV_PADLOCK_SHA=m
CONFIG_CRYPTO_DEV_CCP=y
CONFIG_CRYPTO_DEV_CCP_DD=m
CONFIG_CRYPTO_DEV_CCP_CRYPTO=m
CONFIG_CRYPTO_DEV_QAT=m
CONFIG_CRYPTO_DEV_QAT_DH895xCC=m
# CONFIG_ASYMMETRIC_KEY_TYPE is not set
CONFIG_HAVE_KVM=y
CONFIG_HAVE_KVM_IRQCHIP=y
CONFIG_HAVE_KVM_IRQFD=y
CONFIG_HAVE_KVM_IRQ_ROUTING=y
CONFIG_HAVE_KVM_EVENTFD=y
CONFIG_KVM_APIC_ARCHITECTURE=y
CONFIG_KVM_MMIO=y
CONFIG_KVM_ASYNC_PF=y
CONFIG_HAVE_KVM_MSI=y
CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y
CONFIG_KVM_VFIO=y
CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y
CONFIG_KVM_COMPAT=y
CONFIG_VIRTUALIZATION=y
CONFIG_KVM=m
CONFIG_KVM_INTEL=m
CONFIG_KVM_AMD=m
# CONFIG_KVM_MMU_AUDIT is not set
CONFIG_KVM_DEVICE_ASSIGNMENT=y
CONFIG_BINARY_PRINTF=y

#
# Library routines
#
CONFIG_RAID6_PQ=m
CONFIG_BITREVERSE=y
# CONFIG_HAVE_ARCH_BITREVERSE is not set
CONFIG_RATIONAL=y
CONFIG_GENERIC_STRNCPY_FROM_USER=y
CONFIG_GENERIC_STRNLEN_USER=y
CONFIG_GENERIC_NET_UTILS=y
CONFIG_GENERIC_FIND_FIRST_BIT=y
CONFIG_GENERIC_PCI_IOMAP=y
CONFIG_GENERIC_IOMAP=y
CONFIG_GENERIC_IO=y
CONFIG_PERCPU_RWSEM=y
CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
CONFIG_ARCH_HAS_FAST_MULTIPLIER=y
CONFIG_CRC_CCITT=m
CONFIG_CRC16=m
CONFIG_CRC_T10DIF=y
CONFIG_CRC_ITU_T=m
CONFIG_CRC32=y
# CONFIG_CRC32_SELFTEST is not set
CONFIG_CRC32_SLICEBY8=y
# CONFIG_CRC32_SLICEBY4 is not set
# CONFIG_CRC32_SARWATE is not set
# CONFIG_CRC32_BIT is not set
CONFIG_CRC7=m
CONFIG_LIBCRC32C=m
# CONFIG_CRC8 is not set
# CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set
# CONFIG_RANDOM32_SELFTEST is not set
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=y
CONFIG_LZO_COMPRESS=y
CONFIG_LZO_DECOMPRESS=y
CONFIG_LZ4_COMPRESS=m
CONFIG_LZ4HC_COMPRESS=m
CONFIG_LZ4_DECOMPRESS=y
CONFIG_XZ_DEC=y
CONFIG_XZ_DEC_X86=y
# CONFIG_XZ_DEC_POWERPC is not set
# CONFIG_XZ_DEC_IA64 is not set
# CONFIG_XZ_DEC_ARM is not set
# CONFIG_XZ_DEC_ARMTHUMB is not set
# CONFIG_XZ_DEC_SPARC is not set
CONFIG_XZ_DEC_BCJ=y
# CONFIG_XZ_DEC_TEST is not set
CONFIG_DECOMPRESS_GZIP=y
CONFIG_DECOMPRESS_BZIP2=y
CONFIG_DECOMPRESS_LZMA=y
CONFIG_DECOMPRESS_XZ=y
CONFIG_DECOMPRESS_LZO=y
CONFIG_DECOMPRESS_LZ4=y
CONFIG_GENERIC_ALLOCATOR=y
CONFIG_REED_SOLOMON=m
CONFIG_REED_SOLOMON_ENC8=y
CONFIG_REED_SOLOMON_DEC8=y
CONFIG_REED_SOLOMON_DEC16=y
CONFIG_BCH=m
CONFIG_TEXTSEARCH=y
CONFIG_TEXTSEARCH_KMP=m
CONFIG_TEXTSEARCH_BM=m
CONFIG_TEXTSEARCH_FSM=m
CONFIG_BTREE=y
CONFIG_INTERVAL_TREE=y
CONFIG_ASSOCIATIVE_ARRAY=y
CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT_MAP=y
CONFIG_HAS_DMA=y
CONFIG_CHECK_SIGNATURE=y
CONFIG_CPU_RMAP=y
CONFIG_DQL=y
CONFIG_GLOB=y
# CONFIG_GLOB_SELFTEST is not set
CONFIG_NLATTR=y
CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
CONFIG_LRU_CACHE=m
CONFIG_AVERAGE=y
CONFIG_CORDIC=m
# CONFIG_DDR is not set
CONFIG_OID_REGISTRY=m
CONFIG_UCS2_STRING=y
CONFIG_FONT_SUPPORT=y
# CONFIG_FONTS is not set
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
CONFIG_ARCH_HAS_SG_CHAIN=y

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

main_channel_link: add main channel client
main_channel_handle_parsed: net test: latency 4.841000 ms, bitrate 1655618431 bps (1578.920775 Mbps)
inputs_connect: inputs channel client create
red_dispatcher_set_cursor_peer: 
8983@1445590130.672485:xen_platform_log xen platform: XEN|DllInitialize: 8.2.0 (81) (22.10.2015)
8983@1445590130.672721:xen_platform_log xen platform: XEN|AcpiFindRsdp: 0x00000000000F65D0
8983@1445590130.672836:xen_platform_log xen platform: XEN|SystemGetStartOptions:  TESTSIGNING  FLIGHTSIGNING  NOEXECUTE=OPTIN
8983@1445590130.672930:xen_platform_log xen platform: XEN|SystemGetVersionInformation: KERNEL: 10.0 (BUILD 10565) PLATFORM WIN32_NT (x64)
8983@1445590130.672990:xen_platform_log xen platform: XEN|SystemGetVersionInformation: SUITES:
8983@1445590130.673050:xen_platform_log xen platform: XEN|SystemGetVersionInformation: - TERMINAL
8983@1445590130.673111:xen_platform_log xen platform: XEN|SystemGetVersionInformation: - SINGLEUSERTS
8983@1445590130.673174:xen_platform_log xen platform: XEN|SystemGetVersionInformation: TYPE: WORKSTATION
8983@1445590130.673262:xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[0] 00000000.00001000 - 00000000.0009efff
8983@1445590130.673356:xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[1] 00000000.00100000 - 00000000.00101fff
8983@1445590130.673441:xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[2] 00000000.00103000 - 00000000.efffefff
8983@1445590130.673521:xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[3] 00000001.00000000 - 00000001.07ffffff
8983@1445590130.673576:xen_platform_log xen platform: XEN|AcpiGetXsdt: 0x00000000FC00A000
8983@1445590130.673990:xen_platform_log xen platform: XEN|SystemProcessorInformation: ====> (0:0)
8983@1445590130.674095:xen_platform_log xen platform: XEN|SystemProcessorInformation: Manufacturer: GenuineIntel
8983@1445590130.674181:xen_platform_log xen platform: XEN|SystemProcessorInformation: APIC ID: 00
8983@1445590130.674269:xen_platform_log xen platform: XEN|SystemProcessorInformation: PROCESSOR ID: 00
8983@1445590130.674356:xen_platform_log xen platform: XEN|SystemProcessorInformation: <==== (0:0)
8983@1445590130.674708:xen_platform_log xen platform: XEN|SystemProcessorInformation: ====> (0:1)
8983@1445590130.674786:xen_platform_log xen platform: XEN|SystemProcessorInformation: Manufacturer: GenuineIntel
8983@1445590130.674847:xen_platform_log xen platform: XEN|SystemProcessorInformation: APIC ID: 02
8983@1445590130.674909:xen_platform_log xen platform: XEN|SystemProcessorInformation: PROCESSOR ID: 01
8983@1445590130.674978:xen_platform_log xen platform: XEN|SystemProcessorInformation: <==== (0:1)
8983@1445590130.675323:xen_platform_log xen platform: XEN: HYPERCALL PAGE 0 @ 00000001.048a5000
8983@1445590130.675507:xen_platform_log xen platform: XEN|UnplugSetRequest: DISKS
8983@1445590130.675601:xen_platform_log xen platform: XEN|UnplugSetRequest: NICS
8983@1445590130.677883:xen_platform_log xen platform: XENFILT|DriverEntry: 8.2.0 (81) (22.10.2015)
8983@1445590130.677998:xen_platform_log xen platform: XEN: 4.6.0 (__XEN_INTERFACE_VERSION__ = 00040600)
8983@1445590130.706941:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE001EA7F7920 (ACPI\PNP0A03\0)
8983@1445590131.088716:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EAC91C60 (PCI\VEN_8086&DEV_1237&SUBSYS_11001AF4&REV_02\00)
8983@1445590131.088907:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EAC91880 (PCI\VEN_8086&DEV_7000&SUBSYS_11001AF4&REV_00\08)
8983@1445590131.089069:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EA7FBC60 (PCI\VEN_8086&DEV_7010&SUBSYS_11001AF4&REV_00\09)
8983@1445590131.089222:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EA7FB880 (PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10)
8983@1445590131.089381:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EACA7C60 (PCI\VEN_8086&DEV_2668&SUBSYS_11001AF4&REV_01\18)
8983@1445590131.089541:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EACA8C60 (PCI\VEN_1AF4&DEV_1003&SUBSYS_00031AF4&REV_00\20)
8983@1445590131.089731:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EACA8880 (PCI\VEN_1B36&DEV_0100&SUBSYS_11001AF4&REV_04\28)
8983@1445590131.089885:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EACA99F0 (PCI\VEN_10EC&DEV_8139&SUBSYS_11001AF4&REV_20\30)
8983@1445590131.090049:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EACAAB30 (PCI\VEN_8086&DEV_2934&SUBSYS_11001AF4&REV_03\E8)
8983@1445590131.090206:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EACABC60 (PCI\VEN_8086&DEV_2935&SUBSYS_11001AF4&REV_03\E9)
8983@1445590131.090353:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EACACC60 (PCI\VEN_8086&DEV_2936&SUBSYS_11001AF4&REV_03\EA)
8983@1445590131.090522:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EACADC60 (PCI\VEN_8086&DEV_293A&SUBSYS_11001AF4&REV_03\EF)
8983@1445590131.090675:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EACAD880 (ACPI\PNP0103\0)
8983@1445590131.090769:xen_platform_log xen platform: XENFILT|DriverSetFilterState: ACTIVE DEVICE PRESENT
8983@1445590131.090947:xen_platform_log xen platform: UNPLUG: PRE-AMBLE (DRIVERS NOT BLACKLISTED)
8983@1445590131.110854:xen_platform_log xen platform: UNPLUG: DISKS
8983@1445590131.124682:xen_platform_log xen platform: UNPLUG: NICS
8983@1445590131.125028:xen_platform_log xen platform: XENFILT|DriverSetFilterState: PENDING
8983@1445590131.154003:xen_platform_log xen platform: XENFILT|PdoDestroy: FFFFE001EACA99F0 (PCI\VEN_10EC&DEV_8139&SUBSYS_11001AF4&REV_20\30) (device disappeared)
8983@1445590131.154170:xen_platform_log xen platform: XENFILT|DriverSetFilterState: DISABLED
8983@1445590131.201056:xen_platform_log xen platform: XENBUS|DriverEntry: 8.2.0 (81) (22.10.2015)
8983@1445590131.202005:xen_platform_log xen platform: XENFILT|PdoQueryInterface: PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10: PVDEVICE_INTERFACE (VERSION 1)
8983@1445590131.202230:xen_platform_log xen platform: XENBUS|FdoSetFriendlyName: Xen PV Bus (0001)
8983@1445590131.202311:xen_platform_log xen platform: XENBUS|FdoCreate: FFFFE001EA7DDB40 (XP0001 XENBUS) [ACTIVE]
8983@1445590131.225758:xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFE001EA7BBA40: Shared LevelSensitive CPU 0:0 VECTOR b1
8983@1445590131.226132:xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFE001EAC81D70: DeviceExclusive Latched CPU 0:0 VECTOR 50
8983@1445590131.226298:xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFE001EAC818D0: DeviceExclusive Latched CPU 0:1 VECTOR 50
8983@1445590131.226652:xen_platform_log xen platform: XENBUS|FdoScan: ====>
8983@1445590131.233602:xen_platform_log xen platform: XENBUS|FdoCreateIoSpace: 00000000.f8000000 - 00000000.f8ffffff
8983@1445590131.233918:xen_platform_log xen platform: XENBUS|FdoSuspend: ====>
8983@1445590131.234026:xen_platform_log xen platform: XEN|HvmSetParam: fail1 (c0000022)
8983@1445590131.234101:xen_platform_log xen platform: XENBUS|FdoBalloon: ====>
8983@1445590131.234191:xen_platform_log xen platform: SHARED_INFO: MAP XENMAPSPACE_shared_info @ 00000000.f8000000
8983@1445590131.234288:xen_platform_log xen platform: EVTCHN_FIFO: CONTROLBLOCK[0] @ 00000000.007ba000
8983@1445590131.234365:xen_platform_log xen platform: EVTCHN_FIFO: CONTROLBLOCK[1] @ 00000000.007bb000
8983@1445590131.234419:xen_platform_log xen platform: XENBUS|EvtchnAbiAcquire: FIFO
8983@1445590131.234503:xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CPU 0:0 (Vector = 80)
8983@1445590131.234578:xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CPU 0:1 (Vector = 80)
8983@1445590131.234658:xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CALLBACK VIA (Vector = 24)
8983@1445590131.234724:xen_platform_log xen platform: STORE: PAGE @ 00000000.feffc000
8983@1445590131.234776:xen_platform_log xen platform: STORE: EVTCHN 1
8983@1445590131.234863:xen_platform_log xen platform: EVTCHN_FIFO: EVENTARRAY[0] @ 00000000.00ebc000
8983@1445590131.234935:xen_platform_log xen platform: XENBUS|EvtchnFifoExpand: added ports [00000000 - 000003ff]
8983@1445590131.235617:xen_platform_log xen platform: XENBUS|PdoCreate: FFFFE001EACBCD40 (VBD)
8983@1445590131.235783:xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 08000009 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
8983@1445590131.235933:xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000A -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
8983@1445590131.236084:xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000B -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v2 RANGE_SET v1 CACHE v1 GNTTAB v2 UNPLUG v1 EMULATED v1
8983@1445590131.236249:xen_platform_log xen platform: XENBUS|PdoCreate: FFFFE001EACBCA20 (VIF)
8983@1445590131.236401:xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 08000009 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
8983@1445590131.236550:xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000A -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
8983@1445590131.236699:xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000B -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v2 RANGE_SET v1 CACHE v1 GNTTAB v2 UNPLUG v1 EMULATED v1
8983@1445590131.236851:xen_platform_log xen platform: XENBUS|PdoCreate: FFFFE001EACBBD40 (IFACE)
8983@1445590131.237003:xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 08000009 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
8983@1445590131.237153:xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000A -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
8983@1445590131.237302:xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000B -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v2 RANGE_SET v1 CACHE v1 GNTTAB v2 UNPLUG v1 EMULATED v1
8983@1445590131.271602:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE001EAC9E980 (PCIIDE\IDEChannel\0)
8983@1445590131.271953:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE001EAC9BC60 (PCIIDE\IDEChannel\1)
8983@1445590131.279124:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EAC9B880 (IDE\CdRomQEMU_QEMU_DVD-ROM_______________________2.4.____\0.1.0)
8983@1445590131.814611:xen_platform_log xen platform: XENVBD|DriverEntry:8.1.0.32 (11/8/2015)
8983@1445590131.817739:xen_platform_log xen platform: XENVBD|__DriverParseParameterKey:DriverParameters: 
8983@1445590131.818127:xen_platform_log xen platform: XENDISK|DriverEntry:XENDISK 8.1.0 (32) (11.08.2015)
8983@1445590182.666305:xen_platform_log xen platform: XEN|DEBUG: ====> (xenbus.sys + 00000000000154F0)
8983@1445590182.666396:xen_platform_log xen platform: XENBUS|SUSPEND: Count = 0
8983@1445590182.666502:xen_platform_log xen platform: XENBUS|SUSPEND: EARLY: xenbus.sys + 0000000000008474 (FFFFE001EA7DCC10)
8983@1445590182.666608:xen_platform_log xen platform: XENBUS|SUSPEND: EARLY: xenbus.sys + 0000000000011FA8 (FFFFE001EA7DCDF0)
8983@1445590182.666712:xen_platform_log xen platform: XENBUS|SUSPEND: EARLY: xenbus.sys + 0000000000014D10 (FFFFE001E9A7F000)
8983@1445590182.666816:xen_platform_log xen platform: XENBUS|SUSPEND: LATE: xenbus.sys + 00000000000084C4 (FFFFE001EA7DCC10)
8983@1445590182.666920:xen_platform_log xen platform: XENBUS|SUSPEND: LATE: xenbus.sys + 0000000000014D50 (FFFFE001E9A7F000)
8983@1445590182.667024:xen_platform_log xen platform: XENBUS|SUSPEND: LATE: xenbus.sys + 000000000000E080 (FFFFE001EA7DD610)
8983@1445590182.667086:xen_platform_log xen platform: XEN|DEBUG: <==== (xenbus.sys + 00000000000154F0)
8983@1445590182.667147:xen_platform_log xen platform: XEN|DEBUG: ====> (xenbus.sys + 000000000001655C)
8983@1445590182.667218:xen_platform_log xen platform: XENBUS|RANGE_SET: RANGE SETS:
8983@1445590182.667296:xen_platform_log xen platform: XENBUS|RANGE_SET:  - io_space:
8983@1445590182.667384:xen_platform_log xen platform: XENBUS|RANGE_SET:    {f8001000 - f8ffffff}*
8983@1445590182.667473:xen_platform_log xen platform: XENBUS|RANGE_SET:  - balloon:
8983@1445590182.667543:xen_platform_log xen platform: XENBUS|RANGE_SET:    EMPTY
8983@1445590182.667604:xen_platform_log xen platform: XEN|DEBUG: <==== (xenbus.sys + 000000000001655C)
8983@1445590182.667663:xen_platform_log xen platform: XEN|DEBUG: ====> (xenbus.sys + 0000000000007800)
8983@1445590182.667735:xen_platform_log xen platform: XENBUS|EVTCHN: EVENT CHANNELS:
8983@1445590182.667832:xen_platform_log xen platform: XENBUS|EVTCHN: - (0001) BY xenbus.sys + 000000000001417D ACTIVE
8983@1445590182.667900:xen_platform_log xen platform: XENBUS|EVTCHN: FIXED
8983@1445590182.667970:xen_platform_log xen platform: XENBUS|EVTCHN: Events = 18
8983@1445590182.668067:xen_platform_log xen platform: XENBUS|EVTCHN: - (0006) BY xenbus.sys + 000000000000AC7C ACTIVE
8983@1445590182.668141:xen_platform_log xen platform: XENBUS|EVTCHN: VIRQ: Index = 1
8983@1445590182.668210:xen_platform_log xen platform: XENBUS|EVTCHN: Events = 0
8983@1445590182.668270:xen_platform_log xen platform: XEN|DEBUG: <==== (xenbus.sys + 0000000000007800)
8983@1445590182.668330:xen_platform_log xen platform: XEN|DEBUG: ====> (xenbus.sys + 0000000000011C08)
8983@1445590182.668417:xen_platform_log xen platform: XENBUS|SHARED_INFO: Address = 00000000.f8000000
8983@1445590182.668479:xen_platform_log xen platform: XEN|DEBUG: <==== (xenbus.sys + 0000000000011C08)
8983@1445590182.668539:xen_platform_log xen platform: XEN|DEBUG: ====> (xenbus.sys + 0000000000013E64)
8983@1445590182.668622:xen_platform_log xen platform: XENBUS|STORE: Address = 00000000.feffc000
8983@1445590182.668710:xen_platform_log xen platform: XENBUS|STORE: Events = 18 Dpcs = 1 Polls = 21
8983@1445590182.668779:xen_platform_log xen platform: XENBUS|STORE: WATCHES:
8983@1445590182.668883:xen_platform_log xen platform: XENBUS|STORE: - (FB2C) ON device BY xenbus.sys + 000000000000ACCD [ACTIVE]
8983@1445590182.668995:xen_platform_log xen platform: XENBUS|STORE: - (FB2D) ON control/shutdown BY xenbus.sys + 000000000000AD09 [ACTIVE]
8983@1445590182.669104:xen_platform_log xen platform: XENBUS|STORE: - (FB2E) ON memory/target BY xenbus.sys + 000000000000AD7C [ACTIVE]
8983@1445590182.669166:xen_platform_log xen platform: XEN|DEBUG: <==== (xenbus.sys + 0000000000013E64)
8983@1445590182.669243:xen_platform_log xen platform: XEN|BUGCHECK: ====>
8983@1445590182.669395:xen_platform_log xen platform: XEN|BUGCHECK: INACCESSIBLE_BOOT_DEVICE: FFFFD001761AE940 FFFFFFFFC0000034 0000000000000000 0000000000000000
8983@1445590182.669501:xen_platform_log xen platform: XEN|BUGCHECK: \ArcName\multi(0)disk(0)rdisk(0)partition(2)
8983@1445590182.669589:xen_platform_log xen platform: XEN|BUGCHECK: CONTEXT (FFFFD001761ADC40):
8983@1445590182.669661:xen_platform_log xen platform: XEN|BUGCHECK: - GS = 002B
8983@1445590182.669733:xen_platform_log xen platform: XEN|BUGCHECK: - FS = 0053
8983@1445590182.669805:xen_platform_log xen platform: XEN|BUGCHECK: - ES = 002B
8983@1445590182.669877:xen_platform_log xen platform: XEN|BUGCHECK: - DS = 002B
8983@1445590182.669949:xen_platform_log xen platform: XEN|BUGCHECK: - SS = 0018
8983@1445590182.670021:xen_platform_log xen platform: XEN|BUGCHECK: - CS = 0010
8983@1445590182.670100:xen_platform_log xen platform: XEN|BUGCHECK: - EFLAGS = 00000086
8983@1445590182.670185:xen_platform_log xen platform: XEN|BUGCHECK: - RDI = 00000000761AE940
8983@1445590182.670269:xen_platform_log xen platform: XEN|BUGCHECK: - RSI = 00000000C0000034
8983@1445590182.670354:xen_platform_log xen platform: XEN|BUGCHECK: - RBX = 00000000C74C0A30
8983@1445590182.670438:xen_platform_log xen platform: XEN|BUGCHECK: - RDX = 0000000000000000
8983@1445590182.670522:xen_platform_log xen platform: XEN|BUGCHECK: - RCX = 00000000761ADC40
8983@1445590182.670606:xen_platform_log xen platform: XEN|BUGCHECK: - RAX = 000000000000000F
8983@1445590182.670689:xen_platform_log xen platform: XEN|BUGCHECK: - RBP = 0000000000000000
8983@1445590182.670774:xen_platform_log xen platform: XEN|BUGCHECK: - RIP = 00000000C74B5C42
8983@1445590182.670864:xen_platform_log xen platform: XEN|BUGCHECK: - RSP = 00000000761ADC20
8983@1445590182.670947:xen_platform_log xen platform: XEN|BUGCHECK: - R8 = 0000000000000000
8983@1445590182.671030:xen_platform_log xen platform: XEN|BUGCHECK: - R9 = 0000000000000000
8983@1445590182.671114:xen_platform_log xen platform: XEN|BUGCHECK: - R10 = 0000000000000100
8983@1445590182.671198:xen_platform_log xen platform: XEN|BUGCHECK: - R11 = 0000000000000000
8983@1445590182.671282:xen_platform_log xen platform: XEN|BUGCHECK: - R12 = 000000000000007B
8983@1445590182.671367:xen_platform_log xen platform: XEN|BUGCHECK: - R13 = 00000000761AE901
8983@1445590182.671451:xen_platform_log xen platform: XEN|BUGCHECK: - R14 = 0000000000000000
8983@1445590182.671535:xen_platform_log xen platform: XEN|BUGCHECK: - R15 = 00000000EA7DCF98
8983@1445590182.671602:xen_platform_log xen platform: XEN|BUGCHECK: STACK:
8983@1445590182.671774:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AE130: (0000000000000003 00000000C74B9790 00000000C74B8F20 00000000C74BE3A0) xen.sys + 0000000000005FDD
8983@1445590182.671954:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AE180: (00000000C74C1460 00000000761AE2C0 0000000000000040 000000000E6D9AA0) ntoskrnl.exe + 00000000001ADF7D
8983@1445590182.672130:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AE1C0: (00000000C74C1460 000000000E6D9AA0 0000000000000000 0000000000000001) ntoskrnl.exe + 00000000001AD27D
8983@1445590182.672307:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AE8D0: (00000000761AE940 000000000E7A68B1 0000000000000000 00000000C0000034) ntoskrnl.exe + 000000000013E554
8983@1445590182.672483:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AE910: (000000000000007B 00000000761AE940 00000000C0000034 0000000000000000) ntoskrnl.exe + 0000000000189F9B
8983@1445590182.672659:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AE990: (00000000E681D460 00000000800001B0 00000000E681D460 00000000FFE17B80) ntoskrnl.exe + 00000000007450AD
8983@1445590182.672835:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AEBD0: (00000000E9BF8040 000000000E6EBF00 0000000000000006 000000000CF41D30) ntoskrnl.exe + 00000000007343FD
8983@1445590182.673013:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AECF0: (0000000010137070 000000000CF41D30 000000000E8F3098 0000000000000CF9) ntoskrnl.exe + 0000000000729F69
8983@1445590182.673190:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AED20: (000000000001D804 000000000CF41D30 000000000E8F3098 000000000CF41D30) ntoskrnl.exe + 00000000004EE0C2
8983@1445590182.673366:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AED50: (00000000E9A285C0 00000000000633C4 000000000001E310 000000000001E310) ntoskrnl.exe + 00000000000E1A95
8983@1445590182.673553:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AEDA0: (000000000E711180 00000000E9A285C0 000000000E4E6A54 0000000000071C4C) ntoskrnl.exe + 00000000001435F6
8983@1445590182.673716:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AEDD0: (00000000761AF000 00000000761A9000 0000000000000000 0000000000000000) 0000000000000000
8983@1445590182.673783:xen_platform_log xen platform: XEN|BUGCHECK: <====
Issued domain 8 reboot
qemu: terminating on signal 1 from pid 8811
red_channel_client_disconnect_dummy: rcc=0x55efd47b1ee0 (channel=0x55efd52a3080 type=5 id=0)
snd_channel_put: SndChannel=0x55efd52a5a20 freed
red_channel_client_disconnect_dummy: rcc=0x55efd5215270 (channel=0x55efd52a51b0 type=6 id=0)
snd_channel_put: SndChannel=0x55efd509d420 freed

--------------040909010706090107090300
Content-Type: text/plain; charset=UTF-8;
 name="W10.cfg"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="W10.cfg"

name='W10'
builder="hvm"
#device_model_override="/usr/lib/xen/bin/qemu-gdb"
memory=4096
vcpus=2
acpi_s3=0
acpi_s4=0
vif=['bridge=xenbr0,mac=00:16:3e:fe:7a:b9']
#disk=['/mnt/vm/disks/W10.disk1.xm,raw,hda,rw',',raw,hdb,ro,cdrom']
disk=['/mnt/vm/disks/W10.disk1.cow-sn1,qcow2,hda,rw',',raw,hdb,ro,cdrom']
boot='cd'
device_model_version="qemu-xen"
viridian=1
xen_platform_pci=1
vnc=0
keymap="it"
on_crash="destroy"
vga="qxl"
spice=1
spicehost='0.0.0.0'
spiceport=6000
spicedisable_ticketing=1
spicevdagent=1
spice_clipboard_sharing=0
spiceusbredirection=4
soundhw="hda"
localtime=1
ms_vm_genid="generate"

device_model_args=["-trace","events=/etc/xen/qemu-trace-options"]


--------------040909010706090107090300
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
--------------040909010706090107090300--


From win-pv-devel-bounces@lists.xenproject.org Fri Oct 23 09:15:41 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 09:15: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 1ZpYRo-0007lw-3T; Fri, 23 Oct 2015 09:15:40 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabio.fantoni@m2r.biz>) id 1ZpYRl-0007ln-HC
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 09:15:38 +0000
Received: from [85.158.137.68] by server-4.bemta-3.messagelabs.com id
	4E/E4-09570-5BAF9265; Fri, 23 Oct 2015 09:15:33 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-5.tower-31.messagelabs.com!1445591721!56064894!1
X-Originating-IP: [209.85.212.174]
X-SpamReason: No, hits=1.2 required=7.0 tests=UNIQUE_WORDS,
  UPPERCASE_50_75
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31497 invoked from network); 23 Oct 2015 09:15:21 -0000
Received: from mail-wi0-f174.google.com (HELO mail-wi0-f174.google.com)
	(209.85.212.174)
	by server-5.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 09:15:21 -0000
Received: by wicll6 with SMTP id ll6so22589462wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 23 Oct 2015 02:15:20 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=m2r_biz.20150623.gappssmtp.com; s=20150623;
	h=to:cc:from:subject:message-id:date:user-agent:mime-version
	:content-type; bh=WjKvNFjPU7aCmtJvLhAOU3mveq7H1yS2uixjMsKo37g=;
	b=NbVLe1+6IcZi3ad8iFuASEkH6sIjc1XTgiu/1whXw2EL7qnki6S2aeTMDRiDO3A8N6
	7RWq9PxWkz4P+UOp4hPrmOlkXjWKy8NZZ6N1df20J0u8/4f/VxXGpJkVsk8W16ochRBm
	M6jw/oJMJmut+nydRb9lKs/8GekyFDmZApxWpEkCJhR+SwpK04VMfPHeLh3LlxaaVQzM
	peVpfUeQ4W1X0u89MHG5lXAdaPDdUlrYclRPCCa74/Z73+ZEHEctoqdYzOym/5z3uPSN
	3AZo7ngtEMyhm/86r8l4sjmPJS9km8c66NfRZvcBzvH8joFyTZW7hBbEeXEUWa3tkrEl
	nE3g==
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=WjKvNFjPU7aCmtJvLhAOU3mveq7H1yS2uixjMsKo37g=;
	b=lZand24nldE46NmmWJ/WJ2kg7p/mHzp7TDAEjKbX9z98Snu84GLKrSwHktXZq/DQtm
	XvvISUrvkXD2ZKHGPhZUjtU3fr06xJ8G+tUlGrNgmcW7mNxLqvbL0DAl16xj9xUf6thR
	dCVF/XlmuPNdG1pqzIPDBKbo9qNBjKD00oRQgdiVnMJ7sGw63kIIPKnyeiHX75WzzB+w
	tG2KV4/HAPCixWUy2tL8eh0WbgyR2BPEwQG0XdXt+e9epF+hYnwmdB059+4bOcYEyRpw
	ybgYq1jPevTvZtvvDgubsleQ/EGONa2L2dZ11r4dTKLLD1NNQrUbJbpsn2dMuCNvXnUf
	gOiQ==
X-Gm-Message-State: ALoCoQnZMDdfLoe2B1/u9wu32gmctGM8GRljIUsr0nECfo5i53/KDzW10xcfQ/iQpQo6JQ/sslLv
X-Received: by 10.194.133.129 with SMTP id pc1mr22735352wjb.148.1445591720795; 
	Fri, 23 Oct 2015 02:15:20 -0700 (PDT)
Received: from [192.168.1.37] (ip-73-126.sn2.eutelia.it. [83.211.73.126])
	by smtp.googlemail.com with ESMTPSA id
	x16sm2248683wia.7.2015.10.23.02.15.15
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 23 Oct 2015 02:15:19 -0700 (PDT)
To: win-pv-devel@lists.xenproject.org
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <5629FAAE.8090700@m2r.biz>
Date: Fri, 23 Oct 2015 11:15:26 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------040909010706090107090300"
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] winpv drivers update still don't works correctly and
 domUs unable to boot on next reboot
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.
--------------040909010706090107090300
Content-Type: text/plain; charset=iso-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

In many months I have tried numerous times with numerous winpv builds on 
windows update 7/8/10 but most of the time still using earlier builds 
for one or more components, and often the next reboot fails to boot.

In my latest test:
Dom0:
Wheezy (debian 7) 64 bit with xen 4.6.0 plus some small additional patches:
https://github.com/Fantu/Xen/commits/rebase/m2r-testing-4.6
kernel is custom build of 4.1.8 with .config in attachment
Qemu 2.4 with some small additional patches:
https://github.com/Fantu/qemu/commits/rebase/upstream
Seabios 1.8.2

DomU:
windows 10 pro 64 bit
xl cfg in attachment

I updated all winpv components to latest build without saw errors but on 
reboot windows fails to boot, in qemu log I saw a trace about and also 
the still use older build of at least one component.
Full qemu log with trace in attachment.
I had similar problem many time with different versions of xen, qemu, 
seabios, winpv, windows ecc...
I also already did at least one other report about time ago if I 
remember good.


If you need more informations/tests tell me and I'll post them.

Thanks for any reply and sorry for my bad english.



--------------040909010706090107090300
Content-Type: text/plain; charset=UTF-8;
 name="kernel-config"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="kernel-config"

#
# Automatically generated file; DO NOT EDIT.
# Linux/x86_64 4.1.8-0m2r-amd64 Kernel Configuration
#
CONFIG_64BIT=y
CONFIG_X86_64=y
CONFIG_X86=y
CONFIG_INSTRUCTION_DECODER=y
CONFIG_PERF_EVENTS_INTEL_UNCORE=y
CONFIG_OUTPUT_FORMAT="elf64-x86-64"
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
CONFIG_MMU=y
CONFIG_NEED_DMA_MAP_STATE=y
CONFIG_NEED_SG_DMA_LENGTH=y
CONFIG_GENERIC_ISA_DMA=y
CONFIG_GENERIC_BUG=y
CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
CONFIG_GENERIC_HWEIGHT=y
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_ARCH_HAS_CPU_RELAX=y
CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
CONFIG_HAVE_SETUP_PER_CPU_AREA=y
CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
CONFIG_ARCH_SUSPEND_POSSIBLE=y
CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
CONFIG_ZONE_DMA32=y
CONFIG_AUDIT_ARCH=y
CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y
CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
CONFIG_HAVE_INTEL_TXT=y
CONFIG_X86_64_SMP=y
CONFIG_X86_HT=y
CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-rdi -fcall-saved-rsi -fcall-saved-rdx -fcall-saved-rcx -fcall-saved-r8 -fcall-saved-r9 -fcall-saved-r10 -fcall-saved-r11"
CONFIG_ARCH_SUPPORTS_UPROBES=y
CONFIG_FIX_EARLYCON_MEM=y
CONFIG_PGTABLE_LEVELS=4
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
CONFIG_IRQ_WORK=y
CONFIG_BUILDTIME_EXTABLE_SORT=y

#
# General setup
#
CONFIG_INIT_ENV_ARG_LIMIT=32
CONFIG_CROSS_COMPILE=""
# CONFIG_COMPILE_TEST is not set
CONFIG_LOCALVERSION=""
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_HAVE_KERNEL_GZIP=y
CONFIG_HAVE_KERNEL_BZIP2=y
CONFIG_HAVE_KERNEL_LZMA=y
CONFIG_HAVE_KERNEL_XZ=y
CONFIG_HAVE_KERNEL_LZO=y
CONFIG_HAVE_KERNEL_LZ4=y
# CONFIG_KERNEL_GZIP is not set
# CONFIG_KERNEL_BZIP2 is not set
# CONFIG_KERNEL_LZMA is not set
CONFIG_KERNEL_XZ=y
# CONFIG_KERNEL_LZO is not set
# CONFIG_KERNEL_LZ4 is not set
CONFIG_DEFAULT_HOSTNAME="(none)"
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
CONFIG_SYSVIPC_SYSCTL=y
CONFIG_POSIX_MQUEUE=y
CONFIG_POSIX_MQUEUE_SYSCTL=y
CONFIG_CROSS_MEMORY_ATTACH=y
CONFIG_FHANDLE=y
CONFIG_USELIB=y
CONFIG_AUDIT=y
CONFIG_HAVE_ARCH_AUDITSYSCALL=y
CONFIG_AUDITSYSCALL=y
CONFIG_AUDIT_WATCH=y
CONFIG_AUDIT_TREE=y

#
# IRQ subsystem
#
CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_GENERIC_IRQ_SHOW=y
CONFIG_GENERIC_IRQ_LEGACY_ALLOC_HWIRQ=y
CONFIG_GENERIC_PENDING_IRQ=y
CONFIG_GENERIC_IRQ_CHIP=y
CONFIG_IRQ_DOMAIN=y
CONFIG_GENERIC_MSI_IRQ=y
# CONFIG_IRQ_DOMAIN_DEBUG is not set
CONFIG_IRQ_FORCED_THREADING=y
CONFIG_SPARSE_IRQ=y
CONFIG_CLOCKSOURCE_WATCHDOG=y
CONFIG_ARCH_CLOCKSOURCE_DATA=y
CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y
CONFIG_GENERIC_TIME_VSYSCALL=y
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y
CONFIG_GENERIC_CMOS_UPDATE=y

#
# Timers subsystem
#
CONFIG_TICK_ONESHOT=y
CONFIG_NO_HZ_COMMON=y
# CONFIG_HZ_PERIODIC is not set
CONFIG_NO_HZ_IDLE=y
# CONFIG_NO_HZ_FULL is not set
# CONFIG_NO_HZ is not set
CONFIG_HIGH_RES_TIMERS=y

#
# CPU/Task time and stats accounting
#
CONFIG_TICK_CPU_ACCOUNTING=y
# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set
# CONFIG_IRQ_TIME_ACCOUNTING is not set
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_BSD_PROCESS_ACCT_V3=y
CONFIG_TASKSTATS=y
CONFIG_TASK_DELAY_ACCT=y
CONFIG_TASK_XACCT=y
CONFIG_TASK_IO_ACCOUNTING=y

#
# RCU Subsystem
#
CONFIG_TREE_RCU=y
CONFIG_SRCU=y
# CONFIG_TASKS_RCU is not set
CONFIG_RCU_STALL_COMMON=y
# CONFIG_RCU_USER_QS is not set
CONFIG_RCU_FANOUT=64
CONFIG_RCU_FANOUT_LEAF=16
# CONFIG_RCU_FANOUT_EXACT is not set
CONFIG_RCU_FAST_NO_HZ=y
# CONFIG_TREE_RCU_TRACE is not set
CONFIG_RCU_KTHREAD_PRIO=0
# CONFIG_RCU_NOCB_CPU is not set
# CONFIG_RCU_EXPEDITE_BOOT is not set
CONFIG_BUILD_BIN2C=y
# CONFIG_IKCONFIG is not set
CONFIG_LOG_BUF_SHIFT=17
CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
CONFIG_ARCH_SUPPORTS_INT128=y
CONFIG_NUMA_BALANCING=y
# CONFIG_NUMA_BALANCING_DEFAULT_ENABLED is not set
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CPUSETS=y
CONFIG_PROC_PID_CPUSET=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_PAGE_COUNTER=y
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
# CONFIG_MEMCG_SWAP_ENABLED is not set
# CONFIG_MEMCG_KMEM is not set
# CONFIG_CGROUP_HUGETLB is not set
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_FAIR_GROUP_SCHED=y
# CONFIG_CFS_BANDWIDTH is not set
# CONFIG_RT_GROUP_SCHED is not set
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_CHECKPOINT_RESTORE=y
CONFIG_NAMESPACES=y
CONFIG_UTS_NS=y
CONFIG_IPC_NS=y
CONFIG_USER_NS=y
CONFIG_PID_NS=y
CONFIG_NET_NS=y
CONFIG_SCHED_AUTOGROUP=y
# CONFIG_SYSFS_DEPRECATED is not set
CONFIG_RELAY=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""
CONFIG_RD_GZIP=y
CONFIG_RD_BZIP2=y
CONFIG_RD_LZMA=y
CONFIG_RD_XZ=y
CONFIG_RD_LZO=y
CONFIG_RD_LZ4=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
CONFIG_SYSCTL=y
CONFIG_ANON_INODES=y
CONFIG_HAVE_UID16=y
CONFIG_SYSCTL_EXCEPTION_TRACE=y
CONFIG_HAVE_PCSPKR_PLATFORM=y
CONFIG_BPF=y
CONFIG_EXPERT=y
CONFIG_UID16=y
CONFIG_MULTIUSER=y
CONFIG_SGETMASK_SYSCALL=y
CONFIG_SYSFS_SYSCALL=y
# CONFIG_SYSCTL_SYSCALL is not set
CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_ALL is not set
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_ELF_CORE=y
CONFIG_PCSPKR_PLATFORM=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y
CONFIG_EPOLL=y
CONFIG_SIGNALFD=y
CONFIG_TIMERFD=y
CONFIG_EVENTFD=y
# CONFIG_BPF_SYSCALL is not set
CONFIG_SHMEM=y
CONFIG_AIO=y
CONFIG_ADVISE_SYSCALLS=y
CONFIG_PCI_QUIRKS=y
# CONFIG_EMBEDDED is not set
CONFIG_HAVE_PERF_EVENTS=y

#
# Kernel Performance Events And Counters
#
CONFIG_PERF_EVENTS=y
# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
CONFIG_VM_EVENT_COUNTERS=y
# CONFIG_COMPAT_BRK is not set
CONFIG_SLAB=y
# CONFIG_SLUB is not set
# CONFIG_SLOB is not set
# CONFIG_SYSTEM_TRUSTED_KEYRING is not set
CONFIG_PROFILING=y
CONFIG_TRACEPOINTS=y
CONFIG_OPROFILE=m
# CONFIG_OPROFILE_EVENT_MULTIPLEX is not set
CONFIG_HAVE_OPROFILE=y
CONFIG_OPROFILE_NMI_TIMER=y
CONFIG_KPROBES=y
CONFIG_JUMP_LABEL=y
CONFIG_OPTPROBES=y
CONFIG_KPROBES_ON_FTRACE=y
CONFIG_UPROBES=y
# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
CONFIG_ARCH_USE_BUILTIN_BSWAP=y
CONFIG_KRETPROBES=y
CONFIG_USER_RETURN_NOTIFIER=y
CONFIG_HAVE_IOREMAP_PROT=y
CONFIG_HAVE_KPROBES=y
CONFIG_HAVE_KRETPROBES=y
CONFIG_HAVE_OPTPROBES=y
CONFIG_HAVE_KPROBES_ON_FTRACE=y
CONFIG_HAVE_ARCH_TRACEHOOK=y
CONFIG_HAVE_DMA_ATTRS=y
CONFIG_HAVE_DMA_CONTIGUOUS=y
CONFIG_GENERIC_SMP_IDLE_THREAD=y
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
CONFIG_HAVE_CLK=y
CONFIG_HAVE_DMA_API_DEBUG=y
CONFIG_HAVE_HW_BREAKPOINT=y
CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y
CONFIG_HAVE_USER_RETURN_NOTIFIER=y
CONFIG_HAVE_PERF_EVENTS_NMI=y
CONFIG_HAVE_PERF_REGS=y
CONFIG_HAVE_PERF_USER_STACK_DUMP=y
CONFIG_HAVE_ARCH_JUMP_LABEL=y
CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
CONFIG_HAVE_CMPXCHG_LOCAL=y
CONFIG_HAVE_CMPXCHG_DOUBLE=y
CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y
CONFIG_ARCH_WANT_OLD_COMPAT_IPC=y
CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
CONFIG_SECCOMP_FILTER=y
CONFIG_HAVE_CC_STACKPROTECTOR=y
CONFIG_CC_STACKPROTECTOR=y
# CONFIG_CC_STACKPROTECTOR_NONE is not set
CONFIG_CC_STACKPROTECTOR_REGULAR=y
# CONFIG_CC_STACKPROTECTOR_STRONG is not set
CONFIG_HAVE_CONTEXT_TRACKING=y
CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
CONFIG_HAVE_ARCH_HUGE_VMAP=y
CONFIG_HAVE_ARCH_SOFT_DIRTY=y
CONFIG_MODULES_USE_ELF_RELA=y
CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y
CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
CONFIG_OLD_SIGSUSPEND3=y
CONFIG_COMPAT_OLD_SIGACTION=y

#
# GCOV-based kernel profiling
#
# CONFIG_GCOV_KERNEL is not set
CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
CONFIG_SLABINFO=y
CONFIG_RT_MUTEXES=y
CONFIG_BASE_SMALL=0
CONFIG_MODULES=y
CONFIG_MODULE_FORCE_LOAD=y
CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_FORCE_UNLOAD=y
CONFIG_MODVERSIONS=y
# CONFIG_MODULE_SRCVERSION_ALL is not set
# CONFIG_MODULE_SIG is not set
# CONFIG_MODULE_COMPRESS is not set
CONFIG_STOP_MACHINE=y
CONFIG_BLOCK=y
CONFIG_BLK_DEV_BSG=y
CONFIG_BLK_DEV_BSGLIB=y
CONFIG_BLK_DEV_INTEGRITY=y
CONFIG_BLK_DEV_THROTTLING=y
# CONFIG_BLK_CMDLINE_PARSER is not set

#
# Partition Types
#
CONFIG_PARTITION_ADVANCED=y
CONFIG_ACORN_PARTITION=y
# CONFIG_ACORN_PARTITION_CUMANA is not set
# CONFIG_ACORN_PARTITION_EESOX is not set
CONFIG_ACORN_PARTITION_ICS=y
# CONFIG_ACORN_PARTITION_ADFS is not set
# CONFIG_ACORN_PARTITION_POWERTEC is not set
CONFIG_ACORN_PARTITION_RISCIX=y
# CONFIG_AIX_PARTITION is not set
CONFIG_OSF_PARTITION=y
CONFIG_AMIGA_PARTITION=y
CONFIG_ATARI_PARTITION=y
CONFIG_MAC_PARTITION=y
CONFIG_MSDOS_PARTITION=y
CONFIG_BSD_DISKLABEL=y
CONFIG_MINIX_SUBPARTITION=y
CONFIG_SOLARIS_X86_PARTITION=y
CONFIG_UNIXWARE_DISKLABEL=y
CONFIG_LDM_PARTITION=y
# CONFIG_LDM_DEBUG is not set
CONFIG_SGI_PARTITION=y
CONFIG_ULTRIX_PARTITION=y
CONFIG_SUN_PARTITION=y
CONFIG_KARMA_PARTITION=y
CONFIG_EFI_PARTITION=y
# CONFIG_SYSV68_PARTITION is not set
# CONFIG_CMDLINE_PARTITION is not set
CONFIG_BLOCK_COMPAT=y

#
# IO Schedulers
#
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
CONFIG_CFQ_GROUP_IOSCHED=y
# CONFIG_DEFAULT_DEADLINE is not set
CONFIG_DEFAULT_CFQ=y
# CONFIG_DEFAULT_NOOP is not set
CONFIG_DEFAULT_IOSCHED="cfq"
CONFIG_PREEMPT_NOTIFIERS=y
CONFIG_PADATA=y
CONFIG_UNINLINE_SPIN_UNLOCK=y
CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
CONFIG_INLINE_READ_UNLOCK=y
CONFIG_INLINE_READ_UNLOCK_IRQ=y
CONFIG_INLINE_WRITE_UNLOCK=y
CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
CONFIG_MUTEX_SPIN_ON_OWNER=y
CONFIG_RWSEM_SPIN_ON_OWNER=y
CONFIG_LOCK_SPIN_ON_OWNER=y
CONFIG_ARCH_USE_QUEUE_RWLOCK=y
CONFIG_QUEUE_RWLOCK=y
CONFIG_FREEZER=y

#
# Processor type and features
#
CONFIG_ZONE_DMA=y
CONFIG_SMP=y
CONFIG_X86_FEATURE_NAMES=y
CONFIG_X86_X2APIC=y
CONFIG_X86_MPPARSE=y
# CONFIG_X86_EXTENDED_PLATFORM is not set
CONFIG_X86_INTEL_LPSS=y
# CONFIG_X86_AMD_PLATFORM_DEVICE is not set
CONFIG_IOSF_MBI=m
# CONFIG_IOSF_MBI_DEBUG is not set
CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y
CONFIG_SCHED_OMIT_FRAME_POINTER=y
CONFIG_HYPERVISOR_GUEST=y
CONFIG_PARAVIRT=y
# CONFIG_PARAVIRT_DEBUG is not set
CONFIG_PARAVIRT_SPINLOCKS=y
CONFIG_XEN=y
CONFIG_XEN_DOM0=y
CONFIG_XEN_PVHVM=y
CONFIG_XEN_MAX_DOMAIN_MEMORY=500
CONFIG_XEN_SAVE_RESTORE=y
# CONFIG_XEN_DEBUG_FS is not set
CONFIG_XEN_PVH=y
CONFIG_KVM_GUEST=y
# CONFIG_KVM_DEBUG_FS is not set
# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set
CONFIG_PARAVIRT_CLOCK=y
CONFIG_NO_BOOTMEM=y
# CONFIG_MK8 is not set
# CONFIG_MPSC is not set
# CONFIG_MCORE2 is not set
# CONFIG_MATOM is not set
CONFIG_GENERIC_CPU=y
CONFIG_X86_INTERNODE_CACHE_SHIFT=6
CONFIG_X86_L1_CACHE_SHIFT=6
CONFIG_X86_TSC=y
CONFIG_X86_CMPXCHG64=y
CONFIG_X86_CMOV=y
CONFIG_X86_MINIMUM_CPU_FAMILY=64
CONFIG_X86_DEBUGCTLMSR=y
# CONFIG_PROCESSOR_SELECT is not set
CONFIG_CPU_SUP_INTEL=y
CONFIG_CPU_SUP_AMD=y
CONFIG_CPU_SUP_CENTAUR=y
CONFIG_HPET_TIMER=y
CONFIG_HPET_EMULATE_RTC=y
CONFIG_DMI=y
CONFIG_GART_IOMMU=y
CONFIG_CALGARY_IOMMU=y
CONFIG_CALGARY_IOMMU_ENABLED_BY_DEFAULT=y
CONFIG_SWIOTLB=y
CONFIG_IOMMU_HELPER=y
# CONFIG_MAXSMP is not set
CONFIG_NR_CPUS=512
CONFIG_SCHED_SMT=y
CONFIG_SCHED_MC=y
# CONFIG_PREEMPT_NONE is not set
CONFIG_PREEMPT_VOLUNTARY=y
# CONFIG_PREEMPT is not set
CONFIG_X86_LOCAL_APIC=y
CONFIG_X86_IO_APIC=y
CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
CONFIG_X86_MCE=y
CONFIG_X86_MCE_INTEL=y
CONFIG_X86_MCE_AMD=y
CONFIG_X86_MCE_THRESHOLD=y
CONFIG_X86_MCE_INJECT=m
CONFIG_X86_THERMAL_VECTOR=y
CONFIG_X86_16BIT=y
CONFIG_X86_ESPFIX64=y
CONFIG_X86_VSYSCALL_EMULATION=y
CONFIG_I8K=m
CONFIG_MICROCODE=y
CONFIG_MICROCODE_INTEL=y
CONFIG_MICROCODE_AMD=y
CONFIG_MICROCODE_OLD_INTERFACE=y
CONFIG_MICROCODE_INTEL_EARLY=y
CONFIG_MICROCODE_AMD_EARLY=y
CONFIG_MICROCODE_EARLY=y
CONFIG_X86_MSR=m
CONFIG_X86_CPUID=m
CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
CONFIG_ARCH_DMA_ADDR_T_64BIT=y
CONFIG_X86_DIRECT_GBPAGES=y
CONFIG_NUMA=y
CONFIG_AMD_NUMA=y
CONFIG_X86_64_ACPI_NUMA=y
CONFIG_NODES_SPAN_OTHER_NODES=y
CONFIG_NUMA_EMU=y
CONFIG_NODES_SHIFT=6
CONFIG_ARCH_SPARSEMEM_ENABLE=y
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
# CONFIG_ARCH_MEMORY_PROBE is not set
CONFIG_ARCH_PROC_KCORE_TEXT=y
CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
CONFIG_SELECT_MEMORY_MODEL=y
CONFIG_SPARSEMEM_MANUAL=y
CONFIG_SPARSEMEM=y
CONFIG_NEED_MULTIPLE_NODES=y
CONFIG_HAVE_MEMORY_PRESENT=y
CONFIG_SPARSEMEM_EXTREME=y
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
CONFIG_SPARSEMEM_ALLOC_MEM_MAP_TOGETHER=y
CONFIG_SPARSEMEM_VMEMMAP=y
CONFIG_HAVE_MEMBLOCK=y
CONFIG_HAVE_MEMBLOCK_NODE_MAP=y
CONFIG_ARCH_DISCARD_MEMBLOCK=y
CONFIG_MEMORY_ISOLATION=y
# CONFIG_MOVABLE_NODE is not set
CONFIG_HAVE_BOOTMEM_INFO_NODE=y
CONFIG_MEMORY_HOTPLUG=y
CONFIG_MEMORY_HOTPLUG_SPARSE=y
CONFIG_MEMORY_HOTREMOVE=y
CONFIG_PAGEFLAGS_EXTENDED=y
CONFIG_SPLIT_PTLOCK_CPUS=4
CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y
CONFIG_MEMORY_BALLOON=y
CONFIG_BALLOON_COMPACTION=y
CONFIG_COMPACTION=y
CONFIG_MIGRATION=y
CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y
CONFIG_PHYS_ADDR_T_64BIT=y
CONFIG_ZONE_DMA_FLAG=1
CONFIG_BOUNCE=y
CONFIG_VIRT_TO_BUS=y
CONFIG_MMU_NOTIFIER=y
CONFIG_KSM=y
CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
CONFIG_MEMORY_FAILURE=y
CONFIG_HWPOISON_INJECT=m
CONFIG_TRANSPARENT_HUGEPAGE=y
# CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS is not set
CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
# CONFIG_CLEANCACHE is not set
CONFIG_FRONTSWAP=y
# CONFIG_CMA is not set
CONFIG_MEM_SOFT_DIRTY=y
CONFIG_ZSWAP=y
CONFIG_ZPOOL=y
CONFIG_ZBUD=m
CONFIG_ZSMALLOC=m
# CONFIG_PGTABLE_MAPPING is not set
# CONFIG_ZSMALLOC_STAT is not set
CONFIG_GENERIC_EARLY_IOREMAP=y
CONFIG_X86_PMEM_LEGACY=y
# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set
CONFIG_X86_RESERVE_LOW=64
CONFIG_MTRR=y
CONFIG_MTRR_SANITIZER=y
CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=0
CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1
CONFIG_X86_PAT=y
CONFIG_ARCH_USES_PG_UNCACHED=y
CONFIG_ARCH_RANDOM=y
CONFIG_X86_SMAP=y
# CONFIG_X86_INTEL_MPX is not set
CONFIG_EFI=y
CONFIG_EFI_STUB=y
CONFIG_EFI_MIXED=y
CONFIG_SECCOMP=y
# CONFIG_HZ_100 is not set
CONFIG_HZ_250=y
# CONFIG_HZ_300 is not set
# CONFIG_HZ_1000 is not set
CONFIG_HZ=250
CONFIG_SCHED_HRTICK=y
CONFIG_KEXEC=y
CONFIG_CRASH_DUMP=y
# CONFIG_KEXEC_JUMP is not set
CONFIG_PHYSICAL_START=0x1000000
CONFIG_RELOCATABLE=y
# CONFIG_RANDOMIZE_BASE is not set
CONFIG_PHYSICAL_ALIGN=0x200000
CONFIG_HOTPLUG_CPU=y
# CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set
# CONFIG_DEBUG_HOTPLUG_CPU0 is not set
# CONFIG_COMPAT_VDSO is not set
# CONFIG_CMDLINE_BOOL is not set
CONFIG_HAVE_LIVEPATCH=y
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
CONFIG_USE_PERCPU_NUMA_NODE_ID=y

#
# Power management and ACPI options
#
CONFIG_ARCH_HIBERNATION_HEADER=y
CONFIG_SUSPEND=y
CONFIG_SUSPEND_FREEZER=y
CONFIG_HIBERNATE_CALLBACKS=y
CONFIG_HIBERNATION=y
CONFIG_PM_STD_PARTITION=""
CONFIG_PM_SLEEP=y
CONFIG_PM_SLEEP_SMP=y
# CONFIG_PM_AUTOSLEEP is not set
# CONFIG_PM_WAKELOCKS is not set
CONFIG_PM=y
CONFIG_PM_DEBUG=y
CONFIG_PM_ADVANCED_DEBUG=y
# CONFIG_PM_TEST_SUSPEND is not set
CONFIG_PM_SLEEP_DEBUG=y
# CONFIG_DPM_WATCHDOG is not set
# CONFIG_PM_TRACE_RTC is not set
CONFIG_PM_CLK=y
# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set
CONFIG_ACPI=y
CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y
CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y
CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y
CONFIG_ACPI_SLEEP=y
# CONFIG_ACPI_PROCFS_POWER is not set
# CONFIG_ACPI_EC_DEBUGFS is not set
CONFIG_ACPI_AC=m
CONFIG_ACPI_BATTERY=m
CONFIG_ACPI_BUTTON=m
CONFIG_ACPI_VIDEO=m
CONFIG_ACPI_FAN=m
CONFIG_ACPI_DOCK=y
CONFIG_ACPI_PROCESSOR=m
CONFIG_ACPI_IPMI=m
CONFIG_ACPI_HOTPLUG_CPU=y
CONFIG_ACPI_PROCESSOR_AGGREGATOR=m
CONFIG_ACPI_THERMAL=m
CONFIG_ACPI_NUMA=y
# CONFIG_ACPI_CUSTOM_DSDT is not set
CONFIG_ACPI_INITRD_TABLE_OVERRIDE=y
# CONFIG_ACPI_DEBUG is not set
CONFIG_ACPI_PCI_SLOT=y
CONFIG_X86_PM_TIMER=y
CONFIG_ACPI_CONTAINER=y
CONFIG_ACPI_HOTPLUG_MEMORY=y
CONFIG_ACPI_HOTPLUG_IOAPIC=y
CONFIG_ACPI_SBS=m
CONFIG_ACPI_HED=y
# CONFIG_ACPI_CUSTOM_METHOD is not set
CONFIG_ACPI_BGRT=y
# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set
CONFIG_HAVE_ACPI_APEI=y
CONFIG_HAVE_ACPI_APEI_NMI=y
CONFIG_ACPI_APEI=y
CONFIG_ACPI_APEI_GHES=y
CONFIG_ACPI_APEI_PCIEAER=y
CONFIG_ACPI_APEI_MEMORY_FAILURE=y
# CONFIG_ACPI_APEI_EINJ is not set
# CONFIG_ACPI_APEI_ERST_DEBUG is not set
CONFIG_ACPI_EXTLOG=y
# CONFIG_PMIC_OPREGION is not set
CONFIG_SFI=y

#
# CPU Frequency scaling
#
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_GOV_COMMON=y
CONFIG_CPU_FREQ_STAT=m
# CONFIG_CPU_FREQ_STAT_DETAILS is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
CONFIG_CPU_FREQ_GOV_USERSPACE=m
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m

#
# CPU frequency scaling drivers
#
CONFIG_X86_INTEL_PSTATE=y
CONFIG_X86_PCC_CPUFREQ=m
CONFIG_X86_ACPI_CPUFREQ=m
CONFIG_X86_ACPI_CPUFREQ_CPB=y
CONFIG_X86_POWERNOW_K8=m
CONFIG_X86_AMD_FREQ_SENSITIVITY=m
CONFIG_X86_SPEEDSTEP_CENTRINO=m
CONFIG_X86_P4_CLOCKMOD=m

#
# shared options
#
CONFIG_X86_SPEEDSTEP_LIB=m

#
# CPU Idle
#
CONFIG_CPU_IDLE=y
CONFIG_CPU_IDLE_GOV_LADDER=y
CONFIG_CPU_IDLE_GOV_MENU=y
# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set
CONFIG_INTEL_IDLE=y

#
# Memory power savings
#
CONFIG_I7300_IDLE_IOAT_CHANNEL=y
CONFIG_I7300_IDLE=m

#
# Bus options (PCI etc.)
#
CONFIG_PCI=y
CONFIG_PCI_DIRECT=y
CONFIG_PCI_MMCONFIG=y
CONFIG_PCI_XEN=y
CONFIG_PCI_DOMAINS=y
# CONFIG_PCI_CNB20LE_QUIRK is not set
CONFIG_PCIEPORTBUS=y
CONFIG_HOTPLUG_PCI_PCIE=y
CONFIG_PCIEAER=y
# CONFIG_PCIE_ECRC is not set
CONFIG_PCIEAER_INJECT=m
CONFIG_PCIEASPM=y
# CONFIG_PCIEASPM_DEBUG is not set
CONFIG_PCIEASPM_DEFAULT=y
# CONFIG_PCIEASPM_POWERSAVE is not set
# CONFIG_PCIEASPM_PERFORMANCE is not set
CONFIG_PCIE_PME=y
CONFIG_PCI_BUS_ADDR_T_64BIT=y
CONFIG_PCI_MSI=y
# CONFIG_PCI_DEBUG is not set
CONFIG_PCI_REALLOC_ENABLE_AUTO=y
CONFIG_PCI_STUB=m
CONFIG_XEN_PCIDEV_FRONTEND=m
CONFIG_HT_IRQ=y
CONFIG_PCI_ATS=y
CONFIG_PCI_IOV=y
CONFIG_PCI_PRI=y
CONFIG_PCI_PASID=y
CONFIG_PCI_LABEL=y

#
# PCI host controller drivers
#
CONFIG_ISA_DMA_API=y
CONFIG_AMD_NB=y
CONFIG_PCCARD=m
CONFIG_PCMCIA=m
CONFIG_PCMCIA_LOAD_CIS=y
CONFIG_CARDBUS=y

#
# PC-card bridges
#
CONFIG_YENTA=m
CONFIG_YENTA_O2=y
CONFIG_YENTA_RICOH=y
CONFIG_YENTA_TI=y
CONFIG_YENTA_ENE_TUNE=y
CONFIG_YENTA_TOSHIBA=y
CONFIG_PD6729=m
CONFIG_I82092=m
CONFIG_PCCARD_NONSTATIC=y
CONFIG_HOTPLUG_PCI=y
CONFIG_HOTPLUG_PCI_ACPI=y
CONFIG_HOTPLUG_PCI_ACPI_IBM=m
CONFIG_HOTPLUG_PCI_CPCI=y
CONFIG_HOTPLUG_PCI_CPCI_ZT5550=m
CONFIG_HOTPLUG_PCI_CPCI_GENERIC=m
CONFIG_HOTPLUG_PCI_SHPC=m
# CONFIG_RAPIDIO is not set
CONFIG_X86_SYSFB=y

#
# Executable file formats / Emulations
#
CONFIG_BINFMT_ELF=y
CONFIG_COMPAT_BINFMT_ELF=y
CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
CONFIG_BINFMT_SCRIPT=y
# CONFIG_HAVE_AOUT is not set
CONFIG_BINFMT_MISC=m
CONFIG_COREDUMP=y
CONFIG_IA32_EMULATION=y
CONFIG_IA32_AOUT=y
CONFIG_X86_X32=y
CONFIG_COMPAT=y
CONFIG_COMPAT_FOR_U64_ALIGNMENT=y
CONFIG_SYSVIPC_COMPAT=y
CONFIG_KEYS_COMPAT=y
CONFIG_X86_DEV_DMA_OPS=y
CONFIG_PMC_ATOM=y
CONFIG_NET=y
CONFIG_COMPAT_NETLINK_MESSAGES=y

#
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_DIAG=m
CONFIG_UNIX=y
CONFIG_UNIX_DIAG=m
CONFIG_XFRM=y
CONFIG_XFRM_ALGO=m
CONFIG_XFRM_USER=m
CONFIG_XFRM_SUB_POLICY=y
CONFIG_XFRM_MIGRATE=y
# CONFIG_XFRM_STATISTICS is not set
CONFIG_XFRM_IPCOMP=m
CONFIG_NET_KEY=m
CONFIG_NET_KEY_MIGRATE=y
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_IP_FIB_TRIE_STATS=y
CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_ROUTE_MULTIPATH=y
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_ROUTE_CLASSID=y
# CONFIG_IP_PNP is not set
CONFIG_NET_IPIP=m
CONFIG_NET_IPGRE_DEMUX=m
CONFIG_NET_IP_TUNNEL=m
CONFIG_NET_IPGRE=m
CONFIG_NET_IPGRE_BROADCAST=y
CONFIG_IP_MROUTE=y
CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
CONFIG_IP_PIMSM_V1=y
CONFIG_IP_PIMSM_V2=y
CONFIG_SYN_COOKIES=y
CONFIG_NET_IPVTI=m
CONFIG_NET_UDP_TUNNEL=m
CONFIG_NET_FOU=m
CONFIG_NET_FOU_IP_TUNNELS=y
CONFIG_GENEVE=m
CONFIG_INET_AH=m
CONFIG_INET_ESP=m
CONFIG_INET_IPCOMP=m
CONFIG_INET_XFRM_TUNNEL=m
CONFIG_INET_TUNNEL=m
CONFIG_INET_XFRM_MODE_TRANSPORT=m
CONFIG_INET_XFRM_MODE_TUNNEL=m
CONFIG_INET_XFRM_MODE_BEET=m
CONFIG_INET_LRO=m
CONFIG_INET_DIAG=m
CONFIG_INET_TCP_DIAG=m
CONFIG_INET_UDP_DIAG=m
CONFIG_TCP_CONG_ADVANCED=y
CONFIG_TCP_CONG_BIC=m
CONFIG_TCP_CONG_CUBIC=y
CONFIG_TCP_CONG_WESTWOOD=m
CONFIG_TCP_CONG_HTCP=m
CONFIG_TCP_CONG_HSTCP=m
CONFIG_TCP_CONG_HYBLA=m
CONFIG_TCP_CONG_VEGAS=m
CONFIG_TCP_CONG_SCALABLE=m
CONFIG_TCP_CONG_LP=m
CONFIG_TCP_CONG_VENO=m
CONFIG_TCP_CONG_YEAH=m
CONFIG_TCP_CONG_ILLINOIS=m
CONFIG_TCP_CONG_DCTCP=m
CONFIG_DEFAULT_CUBIC=y
# CONFIG_DEFAULT_RENO is not set
CONFIG_DEFAULT_TCP_CONG="cubic"
CONFIG_TCP_MD5SIG=y
CONFIG_IPV6=y
CONFIG_IPV6_ROUTER_PREF=y
CONFIG_IPV6_ROUTE_INFO=y
CONFIG_IPV6_OPTIMISTIC_DAD=y
CONFIG_INET6_AH=m
CONFIG_INET6_ESP=m
CONFIG_INET6_IPCOMP=m
CONFIG_IPV6_MIP6=y
CONFIG_INET6_XFRM_TUNNEL=m
CONFIG_INET6_TUNNEL=m
CONFIG_INET6_XFRM_MODE_TRANSPORT=m
CONFIG_INET6_XFRM_MODE_TUNNEL=m
CONFIG_INET6_XFRM_MODE_BEET=m
CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m
CONFIG_IPV6_VTI=m
CONFIG_IPV6_SIT=m
CONFIG_IPV6_SIT_6RD=y
CONFIG_IPV6_NDISC_NODETYPE=y
CONFIG_IPV6_TUNNEL=m
CONFIG_IPV6_GRE=m
CONFIG_IPV6_MULTIPLE_TABLES=y
CONFIG_IPV6_SUBTREES=y
CONFIG_IPV6_MROUTE=y
CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y
CONFIG_IPV6_PIMSM_V2=y
# CONFIG_NETLABEL is not set
CONFIG_NETWORK_SECMARK=y
CONFIG_NET_PTP_CLASSIFY=y
# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
CONFIG_NETFILTER_ADVANCED=y
CONFIG_BRIDGE_NETFILTER=m

#
# Core Netfilter Configuration
#
CONFIG_NETFILTER_NETLINK=m
CONFIG_NETFILTER_NETLINK_ACCT=m
CONFIG_NETFILTER_NETLINK_QUEUE=m
CONFIG_NETFILTER_NETLINK_LOG=m
CONFIG_NF_CONNTRACK=m
CONFIG_NF_LOG_COMMON=m
CONFIG_NF_CONNTRACK_MARK=y
CONFIG_NF_CONNTRACK_SECMARK=y
CONFIG_NF_CONNTRACK_ZONES=y
CONFIG_NF_CONNTRACK_PROCFS=y
CONFIG_NF_CONNTRACK_EVENTS=y
CONFIG_NF_CONNTRACK_TIMEOUT=y
CONFIG_NF_CONNTRACK_TIMESTAMP=y
CONFIG_NF_CONNTRACK_LABELS=y
CONFIG_NF_CT_PROTO_DCCP=m
CONFIG_NF_CT_PROTO_GRE=m
CONFIG_NF_CT_PROTO_SCTP=m
CONFIG_NF_CT_PROTO_UDPLITE=m
CONFIG_NF_CONNTRACK_AMANDA=m
CONFIG_NF_CONNTRACK_FTP=m
CONFIG_NF_CONNTRACK_H323=m
CONFIG_NF_CONNTRACK_IRC=m
CONFIG_NF_CONNTRACK_BROADCAST=m
CONFIG_NF_CONNTRACK_NETBIOS_NS=m
CONFIG_NF_CONNTRACK_SNMP=m
CONFIG_NF_CONNTRACK_PPTP=m
CONFIG_NF_CONNTRACK_SANE=m
CONFIG_NF_CONNTRACK_SIP=m
CONFIG_NF_CONNTRACK_TFTP=m
CONFIG_NF_CT_NETLINK=m
CONFIG_NF_CT_NETLINK_TIMEOUT=m
CONFIG_NF_CT_NETLINK_HELPER=m
CONFIG_NETFILTER_NETLINK_QUEUE_CT=y
CONFIG_NF_NAT=m
CONFIG_NF_NAT_NEEDED=y
CONFIG_NF_NAT_PROTO_DCCP=m
CONFIG_NF_NAT_PROTO_UDPLITE=m
CONFIG_NF_NAT_PROTO_SCTP=m
CONFIG_NF_NAT_AMANDA=m
CONFIG_NF_NAT_FTP=m
CONFIG_NF_NAT_IRC=m
CONFIG_NF_NAT_SIP=m
CONFIG_NF_NAT_TFTP=m
CONFIG_NF_NAT_REDIRECT=m
CONFIG_NETFILTER_SYNPROXY=m
CONFIG_NF_TABLES=m
CONFIG_NF_TABLES_INET=m
CONFIG_NFT_EXTHDR=m
CONFIG_NFT_META=m
CONFIG_NFT_CT=m
CONFIG_NFT_RBTREE=m
CONFIG_NFT_HASH=m
CONFIG_NFT_COUNTER=m
CONFIG_NFT_LOG=m
CONFIG_NFT_LIMIT=m
CONFIG_NFT_MASQ=m
CONFIG_NFT_REDIR=m
CONFIG_NFT_NAT=m
CONFIG_NFT_QUEUE=m
CONFIG_NFT_REJECT=m
CONFIG_NFT_REJECT_INET=m
CONFIG_NFT_COMPAT=m
CONFIG_NETFILTER_XTABLES=m

#
# Xtables combined modules
#
CONFIG_NETFILTER_XT_MARK=m
CONFIG_NETFILTER_XT_CONNMARK=m
CONFIG_NETFILTER_XT_SET=m

#
# Xtables targets
#
CONFIG_NETFILTER_XT_TARGET_AUDIT=m
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m
CONFIG_NETFILTER_XT_TARGET_CT=m
CONFIG_NETFILTER_XT_TARGET_DSCP=m
CONFIG_NETFILTER_XT_TARGET_HL=m
CONFIG_NETFILTER_XT_TARGET_HMARK=m
CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m
CONFIG_NETFILTER_XT_TARGET_LED=m
CONFIG_NETFILTER_XT_TARGET_LOG=m
CONFIG_NETFILTER_XT_TARGET_MARK=m
CONFIG_NETFILTER_XT_NAT=m
CONFIG_NETFILTER_XT_TARGET_NETMAP=m
CONFIG_NETFILTER_XT_TARGET_NFLOG=m
CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set
CONFIG_NETFILTER_XT_TARGET_RATEEST=m
CONFIG_NETFILTER_XT_TARGET_REDIRECT=m
CONFIG_NETFILTER_XT_TARGET_TEE=m
CONFIG_NETFILTER_XT_TARGET_TPROXY=m
CONFIG_NETFILTER_XT_TARGET_TRACE=m
CONFIG_NETFILTER_XT_TARGET_SECMARK=m
CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m

#
# Xtables matches
#
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
CONFIG_NETFILTER_XT_MATCH_BPF=m
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NETFILTER_XT_MATCH_CLUSTER=m
CONFIG_NETFILTER_XT_MATCH_COMMENT=m
CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m
CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
CONFIG_NETFILTER_XT_MATCH_CPU=m
CONFIG_NETFILTER_XT_MATCH_DCCP=m
CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m
CONFIG_NETFILTER_XT_MATCH_DSCP=m
CONFIG_NETFILTER_XT_MATCH_ECN=m
CONFIG_NETFILTER_XT_MATCH_ESP=m
CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
CONFIG_NETFILTER_XT_MATCH_HELPER=m
CONFIG_NETFILTER_XT_MATCH_HL=m
CONFIG_NETFILTER_XT_MATCH_IPCOMP=m
CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
CONFIG_NETFILTER_XT_MATCH_IPVS=m
CONFIG_NETFILTER_XT_MATCH_L2TP=m
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
CONFIG_NETFILTER_XT_MATCH_LIMIT=m
CONFIG_NETFILTER_XT_MATCH_MAC=m
CONFIG_NETFILTER_XT_MATCH_MARK=m
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
CONFIG_NETFILTER_XT_MATCH_NFACCT=m
CONFIG_NETFILTER_XT_MATCH_OSF=m
CONFIG_NETFILTER_XT_MATCH_OWNER=m
CONFIG_NETFILTER_XT_MATCH_POLICY=m
CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
CONFIG_NETFILTER_XT_MATCH_QUOTA=m
CONFIG_NETFILTER_XT_MATCH_RATEEST=m
CONFIG_NETFILTER_XT_MATCH_REALM=m
CONFIG_NETFILTER_XT_MATCH_RECENT=m
CONFIG_NETFILTER_XT_MATCH_SCTP=m
CONFIG_NETFILTER_XT_MATCH_SOCKET=m
CONFIG_NETFILTER_XT_MATCH_STATE=m
CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
CONFIG_NETFILTER_XT_MATCH_STRING=m
CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
CONFIG_NETFILTER_XT_MATCH_TIME=m
CONFIG_NETFILTER_XT_MATCH_U32=m
CONFIG_IP_SET=m
CONFIG_IP_SET_MAX=256
CONFIG_IP_SET_BITMAP_IP=m
CONFIG_IP_SET_BITMAP_IPMAC=m
CONFIG_IP_SET_BITMAP_PORT=m
CONFIG_IP_SET_HASH_IP=m
CONFIG_IP_SET_HASH_IPMARK=m
CONFIG_IP_SET_HASH_IPPORT=m
CONFIG_IP_SET_HASH_IPPORTIP=m
CONFIG_IP_SET_HASH_IPPORTNET=m
CONFIG_IP_SET_HASH_MAC=m
CONFIG_IP_SET_HASH_NETPORTNET=m
CONFIG_IP_SET_HASH_NET=m
CONFIG_IP_SET_HASH_NETNET=m
CONFIG_IP_SET_HASH_NETPORT=m
CONFIG_IP_SET_HASH_NETIFACE=m
CONFIG_IP_SET_LIST_SET=m
CONFIG_IP_VS=m
CONFIG_IP_VS_IPV6=y
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12

#
# IPVS transport protocol load balancing support
#
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y

#
# IPVS scheduler
#
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_FO=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m

#
# IPVS SH scheduler
#
CONFIG_IP_VS_SH_TAB_BITS=8

#
# IPVS application helper
#
CONFIG_IP_VS_FTP=m
CONFIG_IP_VS_NFCT=y
CONFIG_IP_VS_PE_SIP=m

#
# IP: Netfilter Configuration
#
CONFIG_NF_DEFRAG_IPV4=m
CONFIG_NF_CONNTRACK_IPV4=m
CONFIG_NF_CONNTRACK_PROC_COMPAT=y
CONFIG_NF_TABLES_IPV4=m
CONFIG_NFT_CHAIN_ROUTE_IPV4=m
CONFIG_NFT_REJECT_IPV4=m
CONFIG_NF_TABLES_ARP=m
CONFIG_NF_LOG_ARP=m
CONFIG_NF_LOG_IPV4=m
CONFIG_NF_REJECT_IPV4=m
CONFIG_NF_NAT_IPV4=m
CONFIG_NFT_CHAIN_NAT_IPV4=m
CONFIG_NF_NAT_MASQUERADE_IPV4=m
CONFIG_NFT_MASQ_IPV4=m
# CONFIG_NFT_REDIR_IPV4 is not set
CONFIG_NF_NAT_SNMP_BASIC=m
CONFIG_NF_NAT_PROTO_GRE=m
CONFIG_NF_NAT_PPTP=m
CONFIG_NF_NAT_H323=m
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_MATCH_AH=m
CONFIG_IP_NF_MATCH_ECN=m
CONFIG_IP_NF_MATCH_RPFILTER=m
CONFIG_IP_NF_MATCH_TTL=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_TARGET_SYNPROXY=m
CONFIG_IP_NF_NAT=m
CONFIG_IP_NF_TARGET_MASQUERADE=m
CONFIG_IP_NF_TARGET_NETMAP=m
CONFIG_IP_NF_TARGET_REDIRECT=m
CONFIG_IP_NF_MANGLE=m
CONFIG_IP_NF_TARGET_CLUSTERIP=m
CONFIG_IP_NF_TARGET_ECN=m
CONFIG_IP_NF_TARGET_TTL=m
CONFIG_IP_NF_RAW=m
CONFIG_IP_NF_SECURITY=m
CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m

#
# IPv6: Netfilter Configuration
#
CONFIG_NF_DEFRAG_IPV6=m
CONFIG_NF_CONNTRACK_IPV6=m
CONFIG_NF_TABLES_IPV6=m
CONFIG_NFT_CHAIN_ROUTE_IPV6=m
CONFIG_NFT_REJECT_IPV6=m
CONFIG_NF_REJECT_IPV6=m
CONFIG_NF_LOG_IPV6=m
CONFIG_NF_NAT_IPV6=m
CONFIG_NFT_CHAIN_NAT_IPV6=m
CONFIG_NF_NAT_MASQUERADE_IPV6=m
CONFIG_NFT_MASQ_IPV6=m
# CONFIG_NFT_REDIR_IPV6 is not set
CONFIG_IP6_NF_IPTABLES=m
CONFIG_IP6_NF_MATCH_AH=m
CONFIG_IP6_NF_MATCH_EUI64=m
CONFIG_IP6_NF_MATCH_FRAG=m
CONFIG_IP6_NF_MATCH_OPTS=m
CONFIG_IP6_NF_MATCH_HL=m
CONFIG_IP6_NF_MATCH_IPV6HEADER=m
CONFIG_IP6_NF_MATCH_MH=m
CONFIG_IP6_NF_MATCH_RPFILTER=m
CONFIG_IP6_NF_MATCH_RT=m
CONFIG_IP6_NF_TARGET_HL=m
CONFIG_IP6_NF_FILTER=m
CONFIG_IP6_NF_TARGET_REJECT=m
CONFIG_IP6_NF_TARGET_SYNPROXY=m
CONFIG_IP6_NF_MANGLE=m
CONFIG_IP6_NF_RAW=m
CONFIG_IP6_NF_SECURITY=m
CONFIG_IP6_NF_NAT=m
CONFIG_IP6_NF_TARGET_MASQUERADE=m
CONFIG_IP6_NF_TARGET_NPT=m

#
# DECnet: Netfilter Configuration
#
CONFIG_DECNET_NF_GRABULATOR=m
CONFIG_NF_TABLES_BRIDGE=m
CONFIG_NFT_BRIDGE_META=m
CONFIG_NFT_BRIDGE_REJECT=m
CONFIG_NF_LOG_BRIDGE=m
CONFIG_BRIDGE_NF_EBTABLES=m
CONFIG_BRIDGE_EBT_BROUTE=m
CONFIG_BRIDGE_EBT_T_FILTER=m
CONFIG_BRIDGE_EBT_T_NAT=m
CONFIG_BRIDGE_EBT_802_3=m
CONFIG_BRIDGE_EBT_AMONG=m
CONFIG_BRIDGE_EBT_ARP=m
CONFIG_BRIDGE_EBT_IP=m
CONFIG_BRIDGE_EBT_IP6=m
CONFIG_BRIDGE_EBT_LIMIT=m
CONFIG_BRIDGE_EBT_MARK=m
CONFIG_BRIDGE_EBT_PKTTYPE=m
CONFIG_BRIDGE_EBT_STP=m
CONFIG_BRIDGE_EBT_VLAN=m
CONFIG_BRIDGE_EBT_ARPREPLY=m
CONFIG_BRIDGE_EBT_DNAT=m
CONFIG_BRIDGE_EBT_MARK_T=m
CONFIG_BRIDGE_EBT_REDIRECT=m
CONFIG_BRIDGE_EBT_SNAT=m
CONFIG_BRIDGE_EBT_LOG=m
CONFIG_BRIDGE_EBT_NFLOG=m
CONFIG_IP_DCCP=m
CONFIG_INET_DCCP_DIAG=m

#
# DCCP CCIDs Configuration
#
# CONFIG_IP_DCCP_CCID2_DEBUG is not set
CONFIG_IP_DCCP_CCID3=y
# CONFIG_IP_DCCP_CCID3_DEBUG is not set
CONFIG_IP_DCCP_TFRC_LIB=y

#
# DCCP Kernel Hacking
#
# CONFIG_IP_DCCP_DEBUG is not set
CONFIG_NET_DCCPPROBE=m
CONFIG_IP_SCTP=m
CONFIG_NET_SCTPPROBE=m
# CONFIG_SCTP_DBG_OBJCNT is not set
CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5=y
# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA1 is not set
# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_NONE is not set
CONFIG_SCTP_COOKIE_HMAC_MD5=y
CONFIG_SCTP_COOKIE_HMAC_SHA1=y
CONFIG_RDS=m
CONFIG_RDS_RDMA=m
CONFIG_RDS_TCP=m
# CONFIG_RDS_DEBUG is not set
CONFIG_TIPC=m
CONFIG_TIPC_MEDIA_IB=y
CONFIG_TIPC_MEDIA_UDP=y
CONFIG_ATM=m
CONFIG_ATM_CLIP=m
# CONFIG_ATM_CLIP_NO_ICMP is not set
CONFIG_ATM_LANE=m
CONFIG_ATM_MPOA=m
CONFIG_ATM_BR2684=m
# CONFIG_ATM_BR2684_IPFILTER is not set
CONFIG_L2TP=m
CONFIG_L2TP_DEBUGFS=m
CONFIG_L2TP_V3=y
CONFIG_L2TP_IP=m
CONFIG_L2TP_ETH=m
CONFIG_STP=m
CONFIG_GARP=m
CONFIG_MRP=m
CONFIG_BRIDGE=m
CONFIG_BRIDGE_IGMP_SNOOPING=y
CONFIG_BRIDGE_VLAN_FILTERING=y
CONFIG_HAVE_NET_DSA=y
CONFIG_VLAN_8021Q=m
CONFIG_VLAN_8021Q_GVRP=y
CONFIG_VLAN_8021Q_MVRP=y
CONFIG_DECNET=m
# CONFIG_DECNET_ROUTER is not set
CONFIG_LLC=m
CONFIG_LLC2=m
CONFIG_IPX=m
# CONFIG_IPX_INTERN is not set
CONFIG_ATALK=m
CONFIG_DEV_APPLETALK=m
CONFIG_IPDDP=m
CONFIG_IPDDP_ENCAP=y
# CONFIG_X25 is not set
CONFIG_LAPB=m
CONFIG_PHONET=m
CONFIG_6LOWPAN=m
CONFIG_6LOWPAN_NHC=m
CONFIG_6LOWPAN_NHC_DEST=m
CONFIG_6LOWPAN_NHC_FRAGMENT=m
CONFIG_6LOWPAN_NHC_HOP=m
CONFIG_6LOWPAN_NHC_IPV6=m
CONFIG_6LOWPAN_NHC_MOBILITY=m
CONFIG_6LOWPAN_NHC_ROUTING=m
CONFIG_6LOWPAN_NHC_UDP=m
CONFIG_IEEE802154=m
CONFIG_IEEE802154_SOCKET=m
CONFIG_IEEE802154_6LOWPAN=m
# CONFIG_MAC802154 is not set
CONFIG_NET_SCHED=y

#
# Queueing/Scheduling
#
CONFIG_NET_SCH_CBQ=m
CONFIG_NET_SCH_HTB=m
CONFIG_NET_SCH_HFSC=m
CONFIG_NET_SCH_ATM=m
CONFIG_NET_SCH_PRIO=m
CONFIG_NET_SCH_MULTIQ=m
CONFIG_NET_SCH_RED=m
CONFIG_NET_SCH_SFB=m
CONFIG_NET_SCH_SFQ=m
CONFIG_NET_SCH_TEQL=m
CONFIG_NET_SCH_TBF=m
CONFIG_NET_SCH_GRED=m
CONFIG_NET_SCH_DSMARK=m
CONFIG_NET_SCH_NETEM=m
CONFIG_NET_SCH_DRR=m
CONFIG_NET_SCH_MQPRIO=m
CONFIG_NET_SCH_CHOKE=m
CONFIG_NET_SCH_QFQ=m
CONFIG_NET_SCH_CODEL=m
CONFIG_NET_SCH_FQ_CODEL=m
CONFIG_NET_SCH_FQ=m
CONFIG_NET_SCH_HHF=m
CONFIG_NET_SCH_PIE=m
CONFIG_NET_SCH_INGRESS=m
CONFIG_NET_SCH_PLUG=m

#
# Classification
#
CONFIG_NET_CLS=y
CONFIG_NET_CLS_BASIC=m
CONFIG_NET_CLS_TCINDEX=m
CONFIG_NET_CLS_ROUTE4=m
CONFIG_NET_CLS_FW=m
CONFIG_NET_CLS_U32=m
CONFIG_CLS_U32_PERF=y
CONFIG_CLS_U32_MARK=y
CONFIG_NET_CLS_RSVP=m
CONFIG_NET_CLS_RSVP6=m
CONFIG_NET_CLS_FLOW=m
CONFIG_NET_CLS_CGROUP=m
CONFIG_NET_CLS_BPF=m
CONFIG_NET_EMATCH=y
CONFIG_NET_EMATCH_STACK=32
CONFIG_NET_EMATCH_CMP=m
CONFIG_NET_EMATCH_NBYTE=m
CONFIG_NET_EMATCH_U32=m
CONFIG_NET_EMATCH_META=m
CONFIG_NET_EMATCH_TEXT=m
CONFIG_NET_EMATCH_CANID=m
CONFIG_NET_EMATCH_IPSET=m
CONFIG_NET_CLS_ACT=y
CONFIG_NET_ACT_POLICE=m
CONFIG_NET_ACT_GACT=m
CONFIG_GACT_PROB=y
CONFIG_NET_ACT_MIRRED=m
CONFIG_NET_ACT_IPT=m
CONFIG_NET_ACT_NAT=m
CONFIG_NET_ACT_PEDIT=m
CONFIG_NET_ACT_SIMP=m
CONFIG_NET_ACT_SKBEDIT=m
CONFIG_NET_ACT_CSUM=m
CONFIG_NET_ACT_VLAN=m
CONFIG_NET_ACT_BPF=m
CONFIG_NET_ACT_CONNMARK=m
CONFIG_NET_CLS_IND=y
CONFIG_NET_SCH_FIFO=y
CONFIG_DCB=y
CONFIG_DNS_RESOLVER=m
CONFIG_BATMAN_ADV=m
CONFIG_BATMAN_ADV_BLA=y
CONFIG_BATMAN_ADV_DAT=y
CONFIG_BATMAN_ADV_NC=y
CONFIG_BATMAN_ADV_MCAST=y
# CONFIG_BATMAN_ADV_DEBUG is not set
CONFIG_OPENVSWITCH=m
CONFIG_OPENVSWITCH_GRE=m
CONFIG_OPENVSWITCH_VXLAN=m
CONFIG_OPENVSWITCH_GENEVE=m
CONFIG_VSOCKETS=m
CONFIG_VMWARE_VMCI_VSOCKETS=m
CONFIG_NETLINK_MMAP=y
CONFIG_NETLINK_DIAG=m
CONFIG_MPLS=y
CONFIG_NET_MPLS_GSO=y
CONFIG_MPLS_ROUTING=m
# CONFIG_HSR is not set
# CONFIG_NET_SWITCHDEV is not set
CONFIG_RPS=y
CONFIG_RFS_ACCEL=y
CONFIG_XPS=y
CONFIG_CGROUP_NET_PRIO=y
CONFIG_CGROUP_NET_CLASSID=y
CONFIG_NET_RX_BUSY_POLL=y
CONFIG_BQL=y
CONFIG_BPF_JIT=y
CONFIG_NET_FLOW_LIMIT=y

#
# Network testing
#
CONFIG_NET_PKTGEN=m
# CONFIG_NET_TCPPROBE is not set
CONFIG_NET_DROP_MONITOR=m
CONFIG_HAMRADIO=y

#
# Packet Radio protocols
#
CONFIG_AX25=m
# CONFIG_AX25_DAMA_SLAVE is not set
CONFIG_NETROM=m
CONFIG_ROSE=m

#
# AX.25 network device drivers
#
CONFIG_MKISS=m
CONFIG_6PACK=m
CONFIG_BPQETHER=m
CONFIG_BAYCOM_SER_FDX=m
CONFIG_BAYCOM_SER_HDX=m
CONFIG_BAYCOM_PAR=m
CONFIG_YAM=m
CONFIG_CAN=m
CONFIG_CAN_RAW=m
CONFIG_CAN_BCM=m
CONFIG_CAN_GW=m

#
# CAN Device Drivers
#
CONFIG_CAN_VCAN=m
CONFIG_CAN_SLCAN=m
CONFIG_CAN_DEV=m
CONFIG_CAN_CALC_BITTIMING=y
# CONFIG_CAN_LEDS is not set
CONFIG_CAN_SJA1000=m
CONFIG_CAN_SJA1000_ISA=m
# CONFIG_CAN_SJA1000_PLATFORM is not set
CONFIG_CAN_EMS_PCMCIA=m
CONFIG_CAN_EMS_PCI=m
CONFIG_CAN_PEAK_PCMCIA=m
CONFIG_CAN_PEAK_PCI=m
CONFIG_CAN_PEAK_PCIEC=y
CONFIG_CAN_KVASER_PCI=m
CONFIG_CAN_PLX_PCI=m
# CONFIG_CAN_C_CAN is not set
# CONFIG_CAN_M_CAN is not set
# CONFIG_CAN_CC770 is not set

#
# CAN SPI interfaces
#
# CONFIG_CAN_MCP251X is not set

#
# CAN USB interfaces
#
CONFIG_CAN_EMS_USB=m
CONFIG_CAN_ESD_USB2=m
CONFIG_CAN_GS_USB=m
CONFIG_CAN_KVASER_USB=m
CONFIG_CAN_PEAK_USB=m
CONFIG_CAN_8DEV_USB=m
CONFIG_CAN_SOFTING=m
CONFIG_CAN_SOFTING_CS=m
# CONFIG_CAN_DEBUG_DEVICES is not set
CONFIG_IRDA=m

#
# IrDA protocols
#
CONFIG_IRLAN=m
CONFIG_IRNET=m
CONFIG_IRCOMM=m
# CONFIG_IRDA_ULTRA is not set

#
# IrDA options
#
CONFIG_IRDA_CACHE_LAST_LSAP=y
CONFIG_IRDA_FAST_RR=y
# CONFIG_IRDA_DEBUG is not set

#
# Infrared-port device drivers
#

#
# SIR device drivers
#
CONFIG_IRTTY_SIR=m

#
# Dongle support
#
CONFIG_DONGLE=y
CONFIG_ESI_DONGLE=m
CONFIG_ACTISYS_DONGLE=m
CONFIG_TEKRAM_DONGLE=m
CONFIG_TOIM3232_DONGLE=m
CONFIG_LITELINK_DONGLE=m
CONFIG_MA600_DONGLE=m
CONFIG_GIRBIL_DONGLE=m
CONFIG_MCP2120_DONGLE=m
CONFIG_OLD_BELKIN_DONGLE=m
CONFIG_ACT200L_DONGLE=m
CONFIG_KINGSUN_DONGLE=m
CONFIG_KSDAZZLE_DONGLE=m
CONFIG_KS959_DONGLE=m

#
# FIR device drivers
#
CONFIG_USB_IRDA=m
CONFIG_SIGMATEL_FIR=m
CONFIG_NSC_FIR=m
CONFIG_WINBOND_FIR=m
CONFIG_SMC_IRCC_FIR=m
CONFIG_ALI_FIR=m
CONFIG_VLSI_FIR=m
CONFIG_VIA_FIR=m
CONFIG_MCS_FIR=m
CONFIG_BT=m
CONFIG_BT_BREDR=y
CONFIG_BT_RFCOMM=m
CONFIG_BT_RFCOMM_TTY=y
CONFIG_BT_BNEP=m
CONFIG_BT_BNEP_MC_FILTER=y
CONFIG_BT_BNEP_PROTO_FILTER=y
CONFIG_BT_CMTP=m
CONFIG_BT_HIDP=m
CONFIG_BT_LE=y
CONFIG_BT_6LOWPAN=m
# CONFIG_BT_SELFTEST is not set
CONFIG_BT_DEBUGFS=y

#
# Bluetooth device drivers
#
CONFIG_BT_INTEL=m
CONFIG_BT_BCM=m
CONFIG_BT_HCIBTUSB=m
CONFIG_BT_HCIBTUSB_BCM=y
CONFIG_BT_HCIBTSDIO=m
CONFIG_BT_HCIUART=m
CONFIG_BT_HCIUART_H4=y
CONFIG_BT_HCIUART_BCSP=y
CONFIG_BT_HCIUART_ATH3K=y
CONFIG_BT_HCIUART_LL=y
CONFIG_BT_HCIUART_3WIRE=y
CONFIG_BT_HCIUART_INTEL=y
CONFIG_BT_HCIUART_BCM=y
CONFIG_BT_HCIBCM203X=m
CONFIG_BT_HCIBPA10X=m
CONFIG_BT_HCIBFUSB=m
CONFIG_BT_HCIDTL1=m
CONFIG_BT_HCIBT3C=m
CONFIG_BT_HCIBLUECARD=m
# CONFIG_BT_HCIBTUART is not set
CONFIG_BT_HCIVHCI=m
CONFIG_BT_MRVL=m
CONFIG_BT_MRVL_SDIO=m
CONFIG_BT_ATH3K=m
CONFIG_AF_RXRPC=m
# CONFIG_AF_RXRPC_DEBUG is not set
CONFIG_RXKAD=m
CONFIG_FIB_RULES=y
CONFIG_WIRELESS=y
CONFIG_WIRELESS_EXT=y
CONFIG_WEXT_CORE=y
CONFIG_WEXT_PROC=y
CONFIG_WEXT_SPY=y
CONFIG_WEXT_PRIV=y
CONFIG_CFG80211=m
# CONFIG_NL80211_TESTMODE is not set
# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set
# CONFIG_CFG80211_REG_DEBUG is not set
# CONFIG_CFG80211_CERTIFICATION_ONUS is not set
CONFIG_CFG80211_DEFAULT_PS=y
# CONFIG_CFG80211_DEBUGFS is not set
# CONFIG_CFG80211_INTERNAL_REGDB is not set
CONFIG_CFG80211_WEXT=y
CONFIG_CFG80211_WEXT_EXPORT=y
CONFIG_LIB80211=m
CONFIG_LIB80211_CRYPT_WEP=m
CONFIG_LIB80211_CRYPT_CCMP=m
CONFIG_LIB80211_CRYPT_TKIP=m
# CONFIG_LIB80211_DEBUG is not set
CONFIG_MAC80211=m
CONFIG_MAC80211_HAS_RC=y
CONFIG_MAC80211_RC_MINSTREL=y
CONFIG_MAC80211_RC_MINSTREL_HT=y
# CONFIG_MAC80211_RC_MINSTREL_VHT is not set
CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
CONFIG_MAC80211_RC_DEFAULT="minstrel_ht"
CONFIG_MAC80211_MESH=y
CONFIG_MAC80211_LEDS=y
# CONFIG_MAC80211_DEBUGFS is not set
# CONFIG_MAC80211_MESSAGE_TRACING is not set
# CONFIG_MAC80211_DEBUG_MENU is not set
CONFIG_WIMAX=m
CONFIG_WIMAX_DEBUG_LEVEL=8
CONFIG_RFKILL=m
CONFIG_RFKILL_LEDS=y
CONFIG_RFKILL_INPUT=y
# CONFIG_RFKILL_GPIO is not set
CONFIG_NET_9P=m
CONFIG_NET_9P_VIRTIO=m
CONFIG_NET_9P_RDMA=m
# CONFIG_NET_9P_DEBUG is not set
# CONFIG_CAIF is not set
CONFIG_CEPH_LIB=m
# CONFIG_CEPH_LIB_PRETTYDEBUG is not set
# CONFIG_CEPH_LIB_USE_DNS_RESOLVER is not set
CONFIG_NFC=m
CONFIG_NFC_DIGITAL=m
# CONFIG_NFC_NCI is not set
CONFIG_NFC_HCI=m
# CONFIG_NFC_SHDLC is not set

#
# Near Field Communication (NFC) devices
#
CONFIG_NFC_PN533=m
# CONFIG_NFC_TRF7970A is not set
CONFIG_NFC_MEI_PHY=m
CONFIG_NFC_SIM=m
CONFIG_NFC_PORT100=m
CONFIG_NFC_PN544=m
CONFIG_NFC_PN544_MEI=m
# CONFIG_NFC_MICROREAD is not set
# CONFIG_NFC_ST21NFCA is not set
CONFIG_HAVE_BPF_JIT=y

#
# Device Drivers
#

#
# Generic Driver Options
#
CONFIG_UEVENT_HELPER=y
CONFIG_UEVENT_HELPER_PATH=""
CONFIG_DEVTMPFS=y
# CONFIG_DEVTMPFS_MOUNT is not set
CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y
CONFIG_FW_LOADER=y
# CONFIG_FIRMWARE_IN_KERNEL is not set
CONFIG_EXTRA_FIRMWARE=""
CONFIG_FW_LOADER_USER_HELPER=y
# CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set
CONFIG_WANT_DEV_COREDUMP=y
CONFIG_ALLOW_DEV_COREDUMP=y
CONFIG_DEV_COREDUMP=y
# CONFIG_DEBUG_DRIVER is not set
# CONFIG_DEBUG_DEVRES is not set
CONFIG_SYS_HYPERVISOR=y
# CONFIG_GENERIC_CPU_DEVICES is not set
CONFIG_GENERIC_CPU_AUTOPROBE=y
CONFIG_REGMAP=y
CONFIG_REGMAP_I2C=m
CONFIG_REGMAP_SPI=m
CONFIG_DMA_SHARED_BUFFER=y
# CONFIG_FENCE_TRACE is not set

#
# Bus devices
#
CONFIG_CONNECTOR=y
CONFIG_PROC_EVENTS=y
CONFIG_MTD=m
# CONFIG_MTD_TESTS is not set
CONFIG_MTD_REDBOOT_PARTS=m
CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
# CONFIG_MTD_CMDLINE_PARTS is not set
CONFIG_MTD_AR7_PARTS=m

#
# User Modules And Translation Layers
#
CONFIG_MTD_BLKDEVS=m
CONFIG_MTD_BLOCK=m
CONFIG_MTD_BLOCK_RO=m
CONFIG_FTL=m
CONFIG_NFTL=m
CONFIG_NFTL_RW=y
CONFIG_INFTL=m
CONFIG_RFD_FTL=m
CONFIG_SSFDC=m
# CONFIG_SM_FTL is not set
CONFIG_MTD_OOPS=m
CONFIG_MTD_SWAP=m
# CONFIG_MTD_PARTITIONED_MASTER is not set

#
# RAM/ROM/Flash chip drivers
#
CONFIG_MTD_CFI=m
CONFIG_MTD_JEDECPROBE=m
CONFIG_MTD_GEN_PROBE=m
# CONFIG_MTD_CFI_ADV_OPTIONS is not set
CONFIG_MTD_MAP_BANK_WIDTH_1=y
CONFIG_MTD_MAP_BANK_WIDTH_2=y
CONFIG_MTD_MAP_BANK_WIDTH_4=y
# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
CONFIG_MTD_CFI_I1=y
CONFIG_MTD_CFI_I2=y
# CONFIG_MTD_CFI_I4 is not set
# CONFIG_MTD_CFI_I8 is not set
CONFIG_MTD_CFI_INTELEXT=m
CONFIG_MTD_CFI_AMDSTD=m
CONFIG_MTD_CFI_STAA=m
CONFIG_MTD_CFI_UTIL=m
CONFIG_MTD_RAM=m
CONFIG_MTD_ROM=m
CONFIG_MTD_ABSENT=m

#
# Mapping drivers for chip access
#
CONFIG_MTD_COMPLEX_MAPPINGS=y
CONFIG_MTD_PHYSMAP=m
# CONFIG_MTD_PHYSMAP_COMPAT is not set
CONFIG_MTD_SBC_GXX=m
# CONFIG_MTD_AMD76XROM is not set
# CONFIG_MTD_ICHXROM is not set
# CONFIG_MTD_ESB2ROM is not set
# CONFIG_MTD_CK804XROM is not set
# CONFIG_MTD_SCB2_FLASH is not set
CONFIG_MTD_NETtel=m
# CONFIG_MTD_L440GX is not set
CONFIG_MTD_PCI=m
CONFIG_MTD_PCMCIA=m
# CONFIG_MTD_PCMCIA_ANONYMOUS is not set
# CONFIG_MTD_GPIO_ADDR is not set
CONFIG_MTD_INTEL_VR_NOR=m
CONFIG_MTD_PLATRAM=m
# CONFIG_MTD_LATCH_ADDR is not set

#
# Self-contained MTD device drivers
#
# CONFIG_MTD_PMC551 is not set
CONFIG_MTD_DATAFLASH=m
# CONFIG_MTD_DATAFLASH_WRITE_VERIFY is not set
# CONFIG_MTD_DATAFLASH_OTP is not set
CONFIG_MTD_M25P80=m
CONFIG_MTD_SST25L=m
CONFIG_MTD_SLRAM=m
CONFIG_MTD_PHRAM=m
CONFIG_MTD_MTDRAM=m
CONFIG_MTDRAM_TOTAL_SIZE=4096
CONFIG_MTDRAM_ERASE_SIZE=128
CONFIG_MTD_BLOCK2MTD=m

#
# Disk-On-Chip Device Drivers
#
# CONFIG_MTD_DOCG3 is not set
CONFIG_MTD_NAND_ECC=m
# CONFIG_MTD_NAND_ECC_SMC is not set
CONFIG_MTD_NAND=m
CONFIG_MTD_NAND_BCH=m
CONFIG_MTD_NAND_ECC_BCH=y
CONFIG_MTD_SM_COMMON=m
# CONFIG_MTD_NAND_DENALI is not set
# CONFIG_MTD_NAND_GPIO is not set
# CONFIG_MTD_NAND_OMAP_BCH_BUILD is not set
CONFIG_MTD_NAND_IDS=m
CONFIG_MTD_NAND_RICOH=m
CONFIG_MTD_NAND_DISKONCHIP=m
# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set
CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0
# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set
# CONFIG_MTD_NAND_DOCG4 is not set
CONFIG_MTD_NAND_CAFE=m
CONFIG_MTD_NAND_NANDSIM=m
# CONFIG_MTD_NAND_PLATFORM is not set
# CONFIG_MTD_NAND_HISI504 is not set
CONFIG_MTD_ONENAND=m
CONFIG_MTD_ONENAND_VERIFY_WRITE=y
# CONFIG_MTD_ONENAND_GENERIC is not set
# CONFIG_MTD_ONENAND_OTP is not set
CONFIG_MTD_ONENAND_2X_PROGRAM=y

#
# LPDDR & LPDDR2 PCM memory drivers
#
CONFIG_MTD_LPDDR=m
CONFIG_MTD_QINFO_PROBE=m
CONFIG_MTD_SPI_NOR=m
CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y
CONFIG_MTD_UBI=m
CONFIG_MTD_UBI_WL_THRESHOLD=4096
CONFIG_MTD_UBI_BEB_LIMIT=20
# CONFIG_MTD_UBI_FASTMAP is not set
# CONFIG_MTD_UBI_GLUEBI is not set
CONFIG_MTD_UBI_BLOCK=y
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
CONFIG_PARPORT=m
CONFIG_PARPORT_PC=m
CONFIG_PARPORT_SERIAL=m
# CONFIG_PARPORT_PC_FIFO is not set
# CONFIG_PARPORT_PC_SUPERIO is not set
CONFIG_PARPORT_PC_PCMCIA=m
# CONFIG_PARPORT_GSC is not set
# CONFIG_PARPORT_AX88796 is not set
CONFIG_PARPORT_1284=y
CONFIG_PARPORT_NOT_PC=y
CONFIG_PNP=y
# CONFIG_PNP_DEBUG_MESSAGES is not set

#
# Protocols
#
CONFIG_PNPACPI=y
CONFIG_BLK_DEV=y
CONFIG_BLK_DEV_NULL_BLK=m
CONFIG_BLK_DEV_FD=m
# CONFIG_PARIDE is not set
CONFIG_BLK_DEV_PCIESSD_MTIP32XX=m
CONFIG_ZRAM=m
CONFIG_ZRAM_LZ4_COMPRESS=y
# CONFIG_ZRAM_DEBUG is not set
CONFIG_BLK_CPQ_CISS_DA=m
CONFIG_CISS_SCSI_TAPE=y
CONFIG_BLK_DEV_DAC960=m
CONFIG_BLK_DEV_UMEM=m
# CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=m
CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
CONFIG_BLK_DEV_DRBD=m
# CONFIG_DRBD_FAULT_INJECTION is not set
CONFIG_BLK_DEV_NBD=m
CONFIG_BLK_DEV_NVME=m
CONFIG_BLK_DEV_SKD=m
CONFIG_BLK_DEV_OSD=m
CONFIG_BLK_DEV_SX8=m
CONFIG_BLK_DEV_RAM=m
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=16384
CONFIG_BLK_DEV_PMEM=m
CONFIG_CDROM_PKTCDVD=m
CONFIG_CDROM_PKTCDVD_BUFFERS=8
# CONFIG_CDROM_PKTCDVD_WCACHE is not set
CONFIG_ATA_OVER_ETH=m
CONFIG_XEN_BLKDEV_FRONTEND=m
CONFIG_XEN_BLKDEV_BACKEND=m
CONFIG_VIRTIO_BLK=m
# CONFIG_BLK_DEV_HD is not set
CONFIG_BLK_DEV_RBD=m
CONFIG_BLK_DEV_RSXX=m

#
# Misc devices
#
CONFIG_SENSORS_LIS3LV02D=m
CONFIG_AD525X_DPOT=m
CONFIG_AD525X_DPOT_I2C=m
CONFIG_AD525X_DPOT_SPI=m
# CONFIG_DUMMY_IRQ is not set
CONFIG_IBM_ASM=m
CONFIG_PHANTOM=m
CONFIG_SGI_IOC4=m
CONFIG_TIFM_CORE=m
CONFIG_TIFM_7XX1=m
CONFIG_ICS932S401=m
CONFIG_ENCLOSURE_SERVICES=m
CONFIG_HP_ILO=m
CONFIG_APDS9802ALS=m
CONFIG_ISL29003=m
CONFIG_ISL29020=m
CONFIG_SENSORS_TSL2550=m
CONFIG_SENSORS_BH1780=m
CONFIG_SENSORS_BH1770=m
CONFIG_SENSORS_APDS990X=m
CONFIG_HMC6352=m
CONFIG_DS1682=m
CONFIG_TI_DAC7512=m
CONFIG_VMWARE_BALLOON=m
# CONFIG_BMP085_I2C is not set
# CONFIG_BMP085_SPI is not set
# CONFIG_USB_SWITCH_FSA9480 is not set
# CONFIG_LATTICE_ECP3_CONFIG is not set
# CONFIG_SRAM is not set
CONFIG_C2PORT=m
CONFIG_C2PORT_DURAMAR_2150=m

#
# EEPROM support
#
CONFIG_EEPROM_AT24=m
CONFIG_EEPROM_AT25=m
CONFIG_EEPROM_LEGACY=m
CONFIG_EEPROM_MAX6875=m
CONFIG_EEPROM_93CX6=m
# CONFIG_EEPROM_93XX46 is not set
CONFIG_CB710_CORE=m
# CONFIG_CB710_DEBUG is not set
CONFIG_CB710_DEBUG_ASSUMPTIONS=y

#
# Texas Instruments shared transport line discipline
#
# CONFIG_TI_ST is not set
CONFIG_SENSORS_LIS3_I2C=m

#
# Altera FPGA firmware download module
#
CONFIG_ALTERA_STAPL=m
CONFIG_INTEL_MEI=m
CONFIG_INTEL_MEI_ME=m
# CONFIG_INTEL_MEI_TXE is not set
CONFIG_VMWARE_VMCI=m

#
# Intel MIC Bus Driver
#
CONFIG_INTEL_MIC_BUS=m

#
# Intel MIC Host Driver
#
CONFIG_INTEL_MIC_HOST=m

#
# Intel MIC Card Driver
#
# CONFIG_INTEL_MIC_CARD is not set
# CONFIG_GENWQE is not set
# CONFIG_ECHO is not set
# CONFIG_CXL_BASE is not set
CONFIG_HAVE_IDE=y
# CONFIG_IDE is not set

#
# SCSI device support
#
CONFIG_SCSI_MOD=m
CONFIG_RAID_ATTRS=m
CONFIG_SCSI=m
CONFIG_SCSI_DMA=y
CONFIG_SCSI_NETLINK=y
# CONFIG_SCSI_MQ_DEFAULT is not set
# CONFIG_SCSI_PROC_FS is not set

#
# SCSI support type (disk, tape, CD-ROM)
#
CONFIG_BLK_DEV_SD=m
CONFIG_CHR_DEV_ST=m
CONFIG_CHR_DEV_OSST=m
CONFIG_BLK_DEV_SR=m
CONFIG_BLK_DEV_SR_VENDOR=y
CONFIG_CHR_DEV_SG=m
CONFIG_CHR_DEV_SCH=m
CONFIG_SCSI_ENCLOSURE=m
CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_LOGGING=y
CONFIG_SCSI_SCAN_ASYNC=y

#
# SCSI Transports
#
CONFIG_SCSI_SPI_ATTRS=m
CONFIG_SCSI_FC_ATTRS=m
CONFIG_SCSI_ISCSI_ATTRS=m
CONFIG_SCSI_SAS_ATTRS=m
CONFIG_SCSI_SAS_LIBSAS=m
CONFIG_SCSI_SAS_ATA=y
CONFIG_SCSI_SAS_HOST_SMP=y
CONFIG_SCSI_SRP_ATTRS=m
CONFIG_SCSI_LOWLEVEL=y
CONFIG_ISCSI_TCP=m
CONFIG_ISCSI_BOOT_SYSFS=m
CONFIG_SCSI_CXGB3_ISCSI=m
CONFIG_SCSI_CXGB4_ISCSI=m
CONFIG_SCSI_BNX2_ISCSI=m
CONFIG_SCSI_BNX2X_FCOE=m
CONFIG_BE2ISCSI=m
CONFIG_BLK_DEV_3W_XXXX_RAID=m
CONFIG_SCSI_HPSA=m
CONFIG_SCSI_3W_9XXX=m
CONFIG_SCSI_3W_SAS=m
CONFIG_SCSI_ACARD=m
CONFIG_SCSI_AACRAID=m
CONFIG_SCSI_AIC7XXX=m
CONFIG_AIC7XXX_CMDS_PER_DEVICE=8
CONFIG_AIC7XXX_RESET_DELAY_MS=15000
CONFIG_AIC7XXX_DEBUG_ENABLE=y
CONFIG_AIC7XXX_DEBUG_MASK=0
CONFIG_AIC7XXX_REG_PRETTY_PRINT=y
CONFIG_SCSI_AIC79XX=m
CONFIG_AIC79XX_CMDS_PER_DEVICE=32
CONFIG_AIC79XX_RESET_DELAY_MS=15000
CONFIG_AIC79XX_DEBUG_ENABLE=y
CONFIG_AIC79XX_DEBUG_MASK=0
CONFIG_AIC79XX_REG_PRETTY_PRINT=y
CONFIG_SCSI_AIC94XX=m
# CONFIG_AIC94XX_DEBUG is not set
CONFIG_SCSI_MVSAS=m
# CONFIG_SCSI_MVSAS_DEBUG is not set
# CONFIG_SCSI_MVSAS_TASKLET is not set
CONFIG_SCSI_MVUMI=m
CONFIG_SCSI_DPT_I2O=m
CONFIG_SCSI_ADVANSYS=m
CONFIG_SCSI_ARCMSR=m
CONFIG_SCSI_ESAS2R=m
CONFIG_MEGARAID_NEWGEN=y
CONFIG_MEGARAID_MM=m
CONFIG_MEGARAID_MAILBOX=m
CONFIG_MEGARAID_LEGACY=m
CONFIG_MEGARAID_SAS=m
CONFIG_SCSI_MPT2SAS=m
CONFIG_SCSI_MPT2SAS_MAX_SGE=128
# CONFIG_SCSI_MPT2SAS_LOGGING is not set
CONFIG_SCSI_MPT3SAS=m
CONFIG_SCSI_MPT3SAS_MAX_SGE=128
# CONFIG_SCSI_MPT3SAS_LOGGING is not set
CONFIG_SCSI_UFSHCD=m
CONFIG_SCSI_UFSHCD_PCI=m
# CONFIG_SCSI_UFSHCD_PLATFORM is not set
CONFIG_SCSI_HPTIOP=m
CONFIG_SCSI_BUSLOGIC=m
# CONFIG_SCSI_FLASHPOINT is not set
CONFIG_VMWARE_PVSCSI=m
CONFIG_XEN_SCSI_FRONTEND=m
CONFIG_HYPERV_STORAGE=m
CONFIG_LIBFC=m
CONFIG_LIBFCOE=m
CONFIG_FCOE=m
CONFIG_FCOE_FNIC=m
CONFIG_SCSI_DMX3191D=m
CONFIG_SCSI_EATA=m
CONFIG_SCSI_EATA_TAGGED_QUEUE=y
CONFIG_SCSI_EATA_LINKED_COMMANDS=y
CONFIG_SCSI_EATA_MAX_TAGS=16
CONFIG_SCSI_FUTURE_DOMAIN=m
CONFIG_SCSI_GDTH=m
CONFIG_SCSI_ISCI=m
CONFIG_SCSI_IPS=m
CONFIG_SCSI_INITIO=m
CONFIG_SCSI_INIA100=m
# CONFIG_SCSI_PPA is not set
# CONFIG_SCSI_IMM is not set
CONFIG_SCSI_STEX=m
CONFIG_SCSI_SYM53C8XX_2=m
CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
CONFIG_SCSI_SYM53C8XX_MMIO=y
CONFIG_SCSI_IPR=m
# CONFIG_SCSI_IPR_TRACE is not set
# CONFIG_SCSI_IPR_DUMP is not set
CONFIG_SCSI_QLOGIC_1280=m
CONFIG_SCSI_QLA_FC=m
CONFIG_TCM_QLA2XXX=m
CONFIG_SCSI_QLA_ISCSI=m
CONFIG_SCSI_LPFC=m
# CONFIG_SCSI_LPFC_DEBUG_FS is not set
CONFIG_SCSI_DC395x=m
CONFIG_SCSI_AM53C974=m
CONFIG_SCSI_WD719X=m
CONFIG_SCSI_DEBUG=m
CONFIG_SCSI_PMCRAID=m
CONFIG_SCSI_PM8001=m
CONFIG_SCSI_BFA_FC=m
CONFIG_SCSI_VIRTIO=m
CONFIG_SCSI_CHELSIO_FCOE=m
CONFIG_SCSI_LOWLEVEL_PCMCIA=y
CONFIG_PCMCIA_AHA152X=m
CONFIG_PCMCIA_FDOMAIN=m
CONFIG_PCMCIA_QLOGIC=m
CONFIG_PCMCIA_SYM53C500=m
CONFIG_SCSI_DH=m
CONFIG_SCSI_DH_RDAC=m
CONFIG_SCSI_DH_HP_SW=m
CONFIG_SCSI_DH_EMC=m
CONFIG_SCSI_DH_ALUA=m
CONFIG_SCSI_OSD_INITIATOR=m
CONFIG_SCSI_OSD_ULD=m
CONFIG_SCSI_OSD_DPRINT_SENSE=1
# CONFIG_SCSI_OSD_DEBUG is not set
CONFIG_ATA=m
# CONFIG_ATA_NONSTANDARD is not set
CONFIG_ATA_VERBOSE_ERROR=y
CONFIG_ATA_ACPI=y
CONFIG_SATA_ZPODD=y
CONFIG_SATA_PMP=y

#
# Controllers with non-SFF native interface
#
CONFIG_SATA_AHCI=m
# CONFIG_SATA_AHCI_PLATFORM is not set
# CONFIG_SATA_INIC162X is not set
CONFIG_SATA_ACARD_AHCI=m
CONFIG_SATA_SIL24=m
CONFIG_ATA_SFF=y

#
# SFF controllers with custom DMA interface
#
CONFIG_PDC_ADMA=m
CONFIG_SATA_QSTOR=m
CONFIG_SATA_SX4=m
CONFIG_ATA_BMDMA=y

#
# SATA SFF controllers with BMDMA
#
CONFIG_ATA_PIIX=m
CONFIG_SATA_MV=m
CONFIG_SATA_NV=m
CONFIG_SATA_PROMISE=m
CONFIG_SATA_SIL=m
CONFIG_SATA_SIS=m
CONFIG_SATA_SVW=m
CONFIG_SATA_ULI=m
CONFIG_SATA_VIA=m
CONFIG_SATA_VITESSE=m

#
# PATA SFF controllers with BMDMA
#
CONFIG_PATA_ALI=m
CONFIG_PATA_AMD=m
CONFIG_PATA_ARTOP=m
CONFIG_PATA_ATIIXP=m
CONFIG_PATA_ATP867X=m
CONFIG_PATA_CMD64X=m
# CONFIG_PATA_CYPRESS is not set
CONFIG_PATA_EFAR=m
CONFIG_PATA_HPT366=m
CONFIG_PATA_HPT37X=m
# CONFIG_PATA_HPT3X2N is not set
# CONFIG_PATA_HPT3X3 is not set
CONFIG_PATA_IT8213=m
CONFIG_PATA_IT821X=m
CONFIG_PATA_JMICRON=m
CONFIG_PATA_MARVELL=m
CONFIG_PATA_NETCELL=m
CONFIG_PATA_NINJA32=m
CONFIG_PATA_NS87415=m
CONFIG_PATA_OLDPIIX=m
# CONFIG_PATA_OPTIDMA is not set
CONFIG_PATA_PDC2027X=m
CONFIG_PATA_PDC_OLD=m
# CONFIG_PATA_RADISYS is not set
CONFIG_PATA_RDC=m
CONFIG_PATA_SCH=m
CONFIG_PATA_SERVERWORKS=m
CONFIG_PATA_SIL680=m
CONFIG_PATA_SIS=m
CONFIG_PATA_TOSHIBA=m
CONFIG_PATA_TRIFLEX=m
CONFIG_PATA_VIA=m
# CONFIG_PATA_WINBOND is not set

#
# PIO-only SFF controllers
#
# CONFIG_PATA_CMD640_PCI is not set
CONFIG_PATA_MPIIX=m
CONFIG_PATA_NS87410=m
# CONFIG_PATA_OPTI is not set
CONFIG_PATA_PCMCIA=m
# CONFIG_PATA_PLATFORM is not set
CONFIG_PATA_RZ1000=m

#
# Generic fallback / legacy drivers
#
# CONFIG_PATA_ACPI is not set
CONFIG_ATA_GENERIC=m
# CONFIG_PATA_LEGACY is not set
CONFIG_MD=y
CONFIG_BLK_DEV_MD=m
CONFIG_MD_LINEAR=m
CONFIG_MD_RAID0=m
CONFIG_MD_RAID1=m
CONFIG_MD_RAID10=m
CONFIG_MD_RAID456=m
CONFIG_MD_MULTIPATH=m
CONFIG_MD_FAULTY=m
# CONFIG_MD_CLUSTER is not set
CONFIG_BCACHE=m
# CONFIG_BCACHE_DEBUG is not set
# CONFIG_BCACHE_CLOSURES_DEBUG is not set
CONFIG_BLK_DEV_DM_BUILTIN=y
CONFIG_BLK_DEV_DM=m
# CONFIG_DM_MQ_DEFAULT is not set
# CONFIG_DM_DEBUG is not set
CONFIG_DM_BUFIO=m
CONFIG_DM_BIO_PRISON=m
CONFIG_DM_PERSISTENT_DATA=m
# CONFIG_DM_DEBUG_BLOCK_STACK_TRACING is not set
CONFIG_DM_CRYPT=m
CONFIG_DM_SNAPSHOT=m
CONFIG_DM_THIN_PROVISIONING=m
CONFIG_DM_CACHE=m
CONFIG_DM_CACHE_MQ=m
CONFIG_DM_CACHE_CLEANER=m
CONFIG_DM_ERA=m
CONFIG_DM_MIRROR=m
CONFIG_DM_LOG_USERSPACE=m
CONFIG_DM_RAID=m
CONFIG_DM_ZERO=m
CONFIG_DM_MULTIPATH=m
CONFIG_DM_MULTIPATH_QL=m
CONFIG_DM_MULTIPATH_ST=m
CONFIG_DM_DELAY=m
CONFIG_DM_UEVENT=y
CONFIG_DM_FLAKEY=m
CONFIG_DM_VERITY=m
CONFIG_DM_SWITCH=m
CONFIG_DM_LOG_WRITES=m
CONFIG_TARGET_CORE=m
CONFIG_TCM_IBLOCK=m
CONFIG_TCM_FILEIO=m
CONFIG_TCM_PSCSI=m
# CONFIG_TCM_USER2 is not set
CONFIG_LOOPBACK_TARGET=m
CONFIG_TCM_FC=m
CONFIG_ISCSI_TARGET=m
CONFIG_SBP_TARGET=m
CONFIG_FUSION=y
CONFIG_FUSION_SPI=m
CONFIG_FUSION_FC=m
CONFIG_FUSION_SAS=m
CONFIG_FUSION_MAX_SGE=128
CONFIG_FUSION_CTL=m
CONFIG_FUSION_LAN=m
# CONFIG_FUSION_LOGGING is not set

#
# IEEE 1394 (FireWire) support
#
CONFIG_FIREWIRE=m
CONFIG_FIREWIRE_OHCI=m
CONFIG_FIREWIRE_SBP2=m
CONFIG_FIREWIRE_NET=m
CONFIG_FIREWIRE_NOSY=m
CONFIG_MACINTOSH_DRIVERS=y
CONFIG_MAC_EMUMOUSEBTN=y
CONFIG_NETDEVICES=y
CONFIG_MII=m
CONFIG_NET_CORE=y
CONFIG_BONDING=m
CONFIG_DUMMY=m
CONFIG_EQUALIZER=m
CONFIG_NET_FC=y
CONFIG_IFB=m
CONFIG_NET_TEAM=m
CONFIG_NET_TEAM_MODE_BROADCAST=m
CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
CONFIG_NET_TEAM_MODE_RANDOM=m
CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m
CONFIG_NET_TEAM_MODE_LOADBALANCE=m
CONFIG_MACVLAN=m
CONFIG_MACVTAP=m
CONFIG_IPVLAN=m
CONFIG_VXLAN=m
CONFIG_NETCONSOLE=m
CONFIG_NETCONSOLE_DYNAMIC=y
CONFIG_NETPOLL=y
CONFIG_NET_POLL_CONTROLLER=y
CONFIG_TUN=m
CONFIG_VETH=m
CONFIG_VIRTIO_NET=m
CONFIG_NLMON=m
CONFIG_SUNGEM_PHY=m
CONFIG_ARCNET=m
CONFIG_ARCNET_1201=m
CONFIG_ARCNET_1051=m
CONFIG_ARCNET_RAW=m
CONFIG_ARCNET_CAP=m
CONFIG_ARCNET_COM90xx=m
CONFIG_ARCNET_COM90xxIO=m
CONFIG_ARCNET_RIM_I=m
CONFIG_ARCNET_COM20020=m
CONFIG_ARCNET_COM20020_PCI=m
CONFIG_ARCNET_COM20020_CS=m
CONFIG_ATM_DRIVERS=y
CONFIG_ATM_DUMMY=m
CONFIG_ATM_TCP=m
CONFIG_ATM_LANAI=m
CONFIG_ATM_ENI=m
# CONFIG_ATM_ENI_DEBUG is not set
# CONFIG_ATM_ENI_TUNE_BURST is not set
CONFIG_ATM_FIRESTREAM=m
CONFIG_ATM_ZATM=m
# CONFIG_ATM_ZATM_DEBUG is not set
CONFIG_ATM_NICSTAR=m
CONFIG_ATM_NICSTAR_USE_SUNI=y
CONFIG_ATM_NICSTAR_USE_IDT77105=y
CONFIG_ATM_IDT77252=m
# CONFIG_ATM_IDT77252_DEBUG is not set
# CONFIG_ATM_IDT77252_RCV_ALL is not set
CONFIG_ATM_IDT77252_USE_SUNI=y
CONFIG_ATM_AMBASSADOR=m
# CONFIG_ATM_AMBASSADOR_DEBUG is not set
CONFIG_ATM_HORIZON=m
# CONFIG_ATM_HORIZON_DEBUG is not set
CONFIG_ATM_IA=m
# CONFIG_ATM_IA_DEBUG is not set
CONFIG_ATM_FORE200E=m
# CONFIG_ATM_FORE200E_USE_TASKLET is not set
CONFIG_ATM_FORE200E_TX_RETRY=16
CONFIG_ATM_FORE200E_DEBUG=0
CONFIG_ATM_HE=m
CONFIG_ATM_HE_USE_SUNI=y
CONFIG_ATM_SOLOS=m

#
# CAIF transport drivers
#
CONFIG_VHOST_NET=m
CONFIG_VHOST_SCSI=m
CONFIG_VHOST_RING=m
CONFIG_VHOST=m

#
# Distributed Switch Architecture drivers
#
# CONFIG_NET_DSA_MV88E6XXX is not set
# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set
CONFIG_ETHERNET=y
CONFIG_MDIO=m
CONFIG_NET_VENDOR_3COM=y
CONFIG_PCMCIA_3C574=m
CONFIG_PCMCIA_3C589=m
CONFIG_VORTEX=m
CONFIG_TYPHOON=m
CONFIG_NET_VENDOR_ADAPTEC=y
CONFIG_ADAPTEC_STARFIRE=m
CONFIG_NET_VENDOR_AGERE=y
CONFIG_ET131X=m
CONFIG_NET_VENDOR_ALTEON=y
CONFIG_ACENIC=m
# CONFIG_ACENIC_OMIT_TIGON_I is not set
# CONFIG_ALTERA_TSE is not set
CONFIG_NET_VENDOR_AMD=y
CONFIG_AMD8111_ETH=m
CONFIG_PCNET32=m
CONFIG_PCMCIA_NMCLAN=m
# CONFIG_NET_VENDOR_ARC is not set
CONFIG_NET_VENDOR_ATHEROS=y
CONFIG_ATL2=m
CONFIG_ATL1=m
CONFIG_ATL1E=m
CONFIG_ATL1C=m
CONFIG_ALX=m
CONFIG_NET_CADENCE=y
# CONFIG_MACB is not set
CONFIG_NET_VENDOR_BROADCOM=y
CONFIG_B44=m
CONFIG_B44_PCI_AUTOSELECT=y
CONFIG_B44_PCICORE_AUTOSELECT=y
CONFIG_B44_PCI=y
# CONFIG_BCMGENET is not set
CONFIG_BNX2=m
CONFIG_CNIC=m
CONFIG_TIGON3=m
CONFIG_BNX2X=m
CONFIG_BNX2X_SRIOV=y
CONFIG_NET_VENDOR_BROCADE=y
CONFIG_BNA=m
CONFIG_NET_VENDOR_CHELSIO=y
CONFIG_CHELSIO_T1=m
CONFIG_CHELSIO_T1_1G=y
CONFIG_CHELSIO_T3=m
CONFIG_CHELSIO_T4=m
CONFIG_CHELSIO_T4_DCB=y
# CONFIG_CHELSIO_T4_FCOE is not set
CONFIG_CHELSIO_T4VF=m
CONFIG_NET_VENDOR_CISCO=y
CONFIG_ENIC=m
# CONFIG_CX_ECAT is not set
# CONFIG_DNET is not set
CONFIG_NET_VENDOR_DEC=y
CONFIG_NET_TULIP=y
CONFIG_DE2104X=m
CONFIG_DE2104X_DSL=0
CONFIG_TULIP=m
# CONFIG_TULIP_MWI is not set
# CONFIG_TULIP_MMIO is not set
CONFIG_TULIP_NAPI=y
CONFIG_TULIP_NAPI_HW_MITIGATION=y
# CONFIG_DE4X5 is not set
CONFIG_WINBOND_840=m
CONFIG_DM9102=m
CONFIG_ULI526X=m
CONFIG_PCMCIA_XIRCOM=m
CONFIG_NET_VENDOR_DLINK=y
CONFIG_DL2K=m
CONFIG_SUNDANCE=m
# CONFIG_SUNDANCE_MMIO is not set
CONFIG_NET_VENDOR_EMULEX=y
CONFIG_BE2NET=m
CONFIG_BE2NET_VXLAN=y
CONFIG_NET_VENDOR_EXAR=y
CONFIG_S2IO=m
CONFIG_VXGE=m
# CONFIG_VXGE_DEBUG_TRACE_ALL is not set
CONFIG_NET_VENDOR_FUJITSU=y
CONFIG_PCMCIA_FMVJ18X=m
CONFIG_NET_VENDOR_HP=y
CONFIG_HP100=m
CONFIG_NET_VENDOR_INTEL=y
CONFIG_E100=m
CONFIG_E1000=m
CONFIG_E1000E=m
CONFIG_IGB=m
CONFIG_IGB_HWMON=y
CONFIG_IGB_DCA=y
CONFIG_IGBVF=m
CONFIG_IXGB=m
CONFIG_IXGBE=m
CONFIG_IXGBE_VXLAN=y
CONFIG_IXGBE_HWMON=y
CONFIG_IXGBE_DCA=y
CONFIG_IXGBE_DCB=y
CONFIG_IXGBEVF=m
CONFIG_I40E=m
CONFIG_I40E_VXLAN=y
CONFIG_I40E_DCB=y
CONFIG_I40E_FCOE=y
CONFIG_I40EVF=m
# CONFIG_FM10K is not set
CONFIG_NET_VENDOR_I825XX=y
CONFIG_IP1000=m
CONFIG_JME=m
CONFIG_NET_VENDOR_MARVELL=y
# CONFIG_MVMDIO is not set
CONFIG_SKGE=m
# CONFIG_SKGE_DEBUG is not set
CONFIG_SKGE_GENESIS=y
CONFIG_SKY2=m
# CONFIG_SKY2_DEBUG is not set
CONFIG_NET_VENDOR_MELLANOX=y
CONFIG_MLX4_EN=m
CONFIG_MLX4_EN_DCB=y
CONFIG_MLX4_EN_VXLAN=y
CONFIG_MLX4_CORE=m
CONFIG_MLX4_DEBUG=y
CONFIG_MLX5_CORE=m
CONFIG_NET_VENDOR_MICREL=y
# CONFIG_KS8842 is not set
# CONFIG_KS8851 is not set
# CONFIG_KS8851_MLL is not set
CONFIG_KSZ884X_PCI=m
CONFIG_NET_VENDOR_MICROCHIP=y
# CONFIG_ENC28J60 is not set
CONFIG_NET_VENDOR_MYRI=y
CONFIG_MYRI10GE=m
CONFIG_MYRI10GE_DCA=y
CONFIG_FEALNX=m
CONFIG_NET_VENDOR_NATSEMI=y
CONFIG_NATSEMI=m
CONFIG_NS83820=m
CONFIG_NET_VENDOR_8390=y
CONFIG_PCMCIA_AXNET=m
CONFIG_NE2K_PCI=m
CONFIG_PCMCIA_PCNET=m
CONFIG_NET_VENDOR_NVIDIA=y
CONFIG_FORCEDETH=m
CONFIG_NET_VENDOR_OKI=y
# CONFIG_ETHOC is not set
CONFIG_NET_PACKET_ENGINE=y
CONFIG_HAMACHI=m
CONFIG_YELLOWFIN=m
CONFIG_NET_VENDOR_QLOGIC=y
CONFIG_QLA3XXX=m
CONFIG_QLCNIC=m
CONFIG_QLCNIC_SRIOV=y
CONFIG_QLCNIC_DCB=y
CONFIG_QLCNIC_VXLAN=y
CONFIG_QLCNIC_HWMON=y
CONFIG_QLGE=m
CONFIG_NETXEN_NIC=m
CONFIG_NET_VENDOR_QUALCOMM=y
CONFIG_NET_VENDOR_REALTEK=y
# CONFIG_ATP is not set
CONFIG_8139CP=m
CONFIG_8139TOO=m
# CONFIG_8139TOO_PIO is not set
CONFIG_8139TOO_TUNE_TWISTER=y
CONFIG_8139TOO_8129=y
# CONFIG_8139_OLD_RX_RESET is not set
CONFIG_R8169=m
CONFIG_NET_VENDOR_RDC=y
CONFIG_R6040=m
CONFIG_NET_VENDOR_ROCKER=y
CONFIG_NET_VENDOR_SAMSUNG=y
# CONFIG_SXGBE_ETH is not set
# CONFIG_NET_VENDOR_SEEQ is not set
CONFIG_NET_VENDOR_SILAN=y
CONFIG_SC92031=m
CONFIG_NET_VENDOR_SIS=y
CONFIG_SIS900=m
CONFIG_SIS190=m
CONFIG_SFC=m
CONFIG_SFC_MTD=y
CONFIG_SFC_MCDI_MON=y
CONFIG_SFC_SRIOV=y
CONFIG_NET_VENDOR_SMSC=y
CONFIG_PCMCIA_SMC91C92=m
CONFIG_EPIC100=m
# CONFIG_SMSC911X is not set
CONFIG_SMSC9420=m
CONFIG_NET_VENDOR_STMICRO=y
# CONFIG_STMMAC_ETH is not set
CONFIG_NET_VENDOR_SUN=y
CONFIG_HAPPYMEAL=m
CONFIG_SUNGEM=m
CONFIG_CASSINI=m
CONFIG_NIU=m
CONFIG_NET_VENDOR_TEHUTI=y
CONFIG_TEHUTI=m
CONFIG_NET_VENDOR_TI=y
# CONFIG_TI_CPSW_ALE is not set
CONFIG_TLAN=m
CONFIG_NET_VENDOR_VIA=y
CONFIG_VIA_RHINE=m
# CONFIG_VIA_RHINE_MMIO is not set
CONFIG_VIA_VELOCITY=m
CONFIG_NET_VENDOR_WIZNET=y
# CONFIG_WIZNET_W5100 is not set
# CONFIG_WIZNET_W5300 is not set
CONFIG_NET_VENDOR_XIRCOM=y
CONFIG_PCMCIA_XIRC2PS=m
CONFIG_FDDI=y
CONFIG_DEFXX=m
# CONFIG_DEFXX_MMIO is not set
CONFIG_SKFP=m
CONFIG_HIPPI=y
CONFIG_ROADRUNNER=m
# CONFIG_ROADRUNNER_LARGE_RINGS is not set
CONFIG_NET_SB1000=m
CONFIG_PHYLIB=m

#
# MII PHY device drivers
#
CONFIG_AT803X_PHY=m
CONFIG_AMD_PHY=m
CONFIG_MARVELL_PHY=m
CONFIG_DAVICOM_PHY=m
CONFIG_QSEMI_PHY=m
CONFIG_LXT_PHY=m
CONFIG_CICADA_PHY=m
CONFIG_VITESSE_PHY=m
CONFIG_SMSC_PHY=m
CONFIG_BROADCOM_PHY=m
# CONFIG_BCM7XXX_PHY is not set
CONFIG_BCM87XX_PHY=m
CONFIG_ICPLUS_PHY=m
CONFIG_REALTEK_PHY=m
CONFIG_NATIONAL_PHY=m
CONFIG_STE10XP=m
CONFIG_LSI_ET1011C_PHY=m
CONFIG_MICREL_PHY=m
# CONFIG_FIXED_PHY is not set
# CONFIG_MDIO_BITBANG is not set
# CONFIG_MDIO_BCM_UNIMAC is not set
# CONFIG_MICREL_KS8995MA is not set
CONFIG_PLIP=m
CONFIG_PPP=m
CONFIG_PPP_BSDCOMP=m
CONFIG_PPP_DEFLATE=m
CONFIG_PPP_FILTER=y
CONFIG_PPP_MPPE=m
CONFIG_PPP_MULTILINK=y
CONFIG_PPPOATM=m
CONFIG_PPPOE=m
CONFIG_PPTP=m
CONFIG_PPPOL2TP=m
CONFIG_PPP_ASYNC=m
CONFIG_PPP_SYNC_TTY=m
CONFIG_SLIP=m
CONFIG_SLHC=m
CONFIG_SLIP_COMPRESSED=y
CONFIG_SLIP_SMART=y
CONFIG_SLIP_MODE_SLIP6=y

#
# Host-side USB support is needed for USB Network Adapter support
#
CONFIG_USB_NET_DRIVERS=m
CONFIG_USB_CATC=m
CONFIG_USB_KAWETH=m
CONFIG_USB_PEGASUS=m
CONFIG_USB_RTL8150=m
CONFIG_USB_RTL8152=m
CONFIG_USB_USBNET=m
CONFIG_USB_NET_AX8817X=m
CONFIG_USB_NET_AX88179_178A=m
CONFIG_USB_NET_CDCETHER=m
CONFIG_USB_NET_CDC_EEM=m
CONFIG_USB_NET_CDC_NCM=m
CONFIG_USB_NET_HUAWEI_CDC_NCM=m
CONFIG_USB_NET_CDC_MBIM=m
CONFIG_USB_NET_DM9601=m
CONFIG_USB_NET_SR9700=m
CONFIG_USB_NET_SR9800=m
CONFIG_USB_NET_SMSC75XX=m
CONFIG_USB_NET_SMSC95XX=m
CONFIG_USB_NET_GL620A=m
CONFIG_USB_NET_NET1080=m
CONFIG_USB_NET_PLUSB=m
CONFIG_USB_NET_MCS7830=m
CONFIG_USB_NET_RNDIS_HOST=m
CONFIG_USB_NET_CDC_SUBSET=m
CONFIG_USB_ALI_M5632=y
CONFIG_USB_AN2720=y
CONFIG_USB_BELKIN=y
CONFIG_USB_ARMLINUX=y
CONFIG_USB_EPSON2888=y
CONFIG_USB_KC2190=y
CONFIG_USB_NET_ZAURUS=m
CONFIG_USB_NET_CX82310_ETH=m
CONFIG_USB_NET_KALMIA=m
CONFIG_USB_NET_QMI_WWAN=m
CONFIG_USB_HSO=m
CONFIG_USB_NET_INT51X1=m
CONFIG_USB_CDC_PHONET=m
CONFIG_USB_IPHETH=m
CONFIG_USB_SIERRA_NET=m
CONFIG_USB_VL600=m
CONFIG_WLAN=y
CONFIG_PCMCIA_RAYCS=m
CONFIG_LIBERTAS_THINFIRM=m
# CONFIG_LIBERTAS_THINFIRM_DEBUG is not set
CONFIG_LIBERTAS_THINFIRM_USB=m
CONFIG_AIRO=m
CONFIG_ATMEL=m
CONFIG_PCI_ATMEL=m
CONFIG_PCMCIA_ATMEL=m
CONFIG_AT76C50X_USB=m
CONFIG_AIRO_CS=m
CONFIG_PCMCIA_WL3501=m
# CONFIG_PRISM54 is not set
CONFIG_USB_ZD1201=m
CONFIG_USB_NET_RNDIS_WLAN=m
CONFIG_RTL8180=m
CONFIG_RTL8187=m
CONFIG_RTL8187_LEDS=y
CONFIG_ADM8211=m
CONFIG_MAC80211_HWSIM=m
CONFIG_MWL8K=m
CONFIG_ATH_COMMON=m
CONFIG_ATH_CARDS=m
# CONFIG_ATH_DEBUG is not set
CONFIG_ATH5K=m
# CONFIG_ATH5K_DEBUG is not set
# CONFIG_ATH5K_TRACER is not set
CONFIG_ATH5K_PCI=y
CONFIG_ATH9K_HW=m
CONFIG_ATH9K_COMMON=m
CONFIG_ATH9K_BTCOEX_SUPPORT=y
CONFIG_ATH9K=m
CONFIG_ATH9K_PCI=y
# CONFIG_ATH9K_AHB is not set
# CONFIG_ATH9K_DEBUGFS is not set
# CONFIG_ATH9K_DYNACK is not set
# CONFIG_ATH9K_WOW is not set
CONFIG_ATH9K_RFKILL=y
# CONFIG_ATH9K_CHANNEL_CONTEXT is not set
CONFIG_ATH9K_PCOEM=y
CONFIG_ATH9K_HTC=m
# CONFIG_ATH9K_HTC_DEBUGFS is not set
CONFIG_CARL9170=m
CONFIG_CARL9170_LEDS=y
CONFIG_CARL9170_WPC=y
# CONFIG_CARL9170_HWRNG is not set
CONFIG_ATH6KL=m
CONFIG_ATH6KL_SDIO=m
CONFIG_ATH6KL_USB=m
# CONFIG_ATH6KL_DEBUG is not set
# CONFIG_ATH6KL_TRACING is not set
CONFIG_AR5523=m
CONFIG_WIL6210=m
CONFIG_WIL6210_ISR_COR=y
CONFIG_WIL6210_TRACING=y
CONFIG_ATH10K=m
CONFIG_ATH10K_PCI=m
# CONFIG_ATH10K_DEBUG is not set
# CONFIG_ATH10K_DEBUGFS is not set
# CONFIG_ATH10K_TRACING is not set
# CONFIG_WCN36XX is not set
CONFIG_B43=m
CONFIG_B43_BCMA=y
CONFIG_B43_SSB=y
CONFIG_B43_BUSES_BCMA_AND_SSB=y
# CONFIG_B43_BUSES_BCMA is not set
# CONFIG_B43_BUSES_SSB is not set
CONFIG_B43_PCI_AUTOSELECT=y
CONFIG_B43_PCICORE_AUTOSELECT=y
CONFIG_B43_PCMCIA=y
CONFIG_B43_SDIO=y
CONFIG_B43_BCMA_PIO=y
CONFIG_B43_PIO=y
CONFIG_B43_PHY_G=y
CONFIG_B43_PHY_N=y
CONFIG_B43_PHY_LP=y
CONFIG_B43_PHY_HT=y
CONFIG_B43_LEDS=y
CONFIG_B43_HWRNG=y
# CONFIG_B43_DEBUG is not set
CONFIG_B43LEGACY=m
CONFIG_B43LEGACY_PCI_AUTOSELECT=y
CONFIG_B43LEGACY_PCICORE_AUTOSELECT=y
CONFIG_B43LEGACY_LEDS=y
CONFIG_B43LEGACY_HWRNG=y
CONFIG_B43LEGACY_DEBUG=y
CONFIG_B43LEGACY_DMA=y
CONFIG_B43LEGACY_PIO=y
CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y
# CONFIG_B43LEGACY_DMA_MODE is not set
# CONFIG_B43LEGACY_PIO_MODE is not set
CONFIG_BRCMUTIL=m
CONFIG_BRCMSMAC=m
CONFIG_BRCMFMAC=m
CONFIG_BRCMFMAC_PROTO_BCDC=y
CONFIG_BRCMFMAC_PROTO_MSGBUF=y
CONFIG_BRCMFMAC_SDIO=y
CONFIG_BRCMFMAC_USB=y
CONFIG_BRCMFMAC_PCIE=y
# CONFIG_BRCM_TRACING is not set
# CONFIG_BRCMDBG is not set
CONFIG_HOSTAP=m
CONFIG_HOSTAP_FIRMWARE=y
# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set
CONFIG_HOSTAP_PLX=m
CONFIG_HOSTAP_PCI=m
CONFIG_HOSTAP_CS=m
# CONFIG_IPW2100 is not set
CONFIG_IPW2200=m
CONFIG_IPW2200_MONITOR=y
CONFIG_IPW2200_RADIOTAP=y
CONFIG_IPW2200_PROMISCUOUS=y
CONFIG_IPW2200_QOS=y
# CONFIG_IPW2200_DEBUG is not set
CONFIG_LIBIPW=m
# CONFIG_LIBIPW_DEBUG is not set
CONFIG_IWLWIFI=m
CONFIG_IWLWIFI_LEDS=y
CONFIG_IWLDVM=m
CONFIG_IWLMVM=m
CONFIG_IWLWIFI_OPMODE_MODULAR=y
# CONFIG_IWLWIFI_BCAST_FILTERING is not set
# CONFIG_IWLWIFI_UAPSD is not set

#
# Debugging Options
#
# CONFIG_IWLWIFI_DEBUG is not set
# CONFIG_IWLWIFI_DEVICE_TRACING is not set
CONFIG_IWLEGACY=m
CONFIG_IWL4965=m
CONFIG_IWL3945=m

#
# iwl3945 / iwl4965 Debugging Options
#
# CONFIG_IWLEGACY_DEBUG is not set
CONFIG_LIBERTAS=m
CONFIG_LIBERTAS_USB=m
CONFIG_LIBERTAS_CS=m
CONFIG_LIBERTAS_SDIO=m
# CONFIG_LIBERTAS_SPI is not set
# CONFIG_LIBERTAS_DEBUG is not set
CONFIG_LIBERTAS_MESH=y
CONFIG_HERMES=m
# CONFIG_HERMES_PRISM is not set
CONFIG_HERMES_CACHE_FW_ON_INIT=y
CONFIG_PLX_HERMES=m
CONFIG_TMD_HERMES=m
CONFIG_NORTEL_HERMES=m
CONFIG_PCMCIA_HERMES=m
CONFIG_PCMCIA_SPECTRUM=m
CONFIG_ORINOCO_USB=m
CONFIG_P54_COMMON=m
CONFIG_P54_USB=m
CONFIG_P54_PCI=m
# CONFIG_P54_SPI is not set
CONFIG_P54_LEDS=y
CONFIG_RT2X00=m
CONFIG_RT2400PCI=m
CONFIG_RT2500PCI=m
CONFIG_RT61PCI=m
CONFIG_RT2800PCI=m
CONFIG_RT2800PCI_RT33XX=y
CONFIG_RT2800PCI_RT35XX=y
CONFIG_RT2800PCI_RT53XX=y
CONFIG_RT2800PCI_RT3290=y
CONFIG_RT2500USB=m
CONFIG_RT73USB=m
CONFIG_RT2800USB=m
CONFIG_RT2800USB_RT33XX=y
CONFIG_RT2800USB_RT35XX=y
CONFIG_RT2800USB_RT3573=y
CONFIG_RT2800USB_RT53XX=y
CONFIG_RT2800USB_RT55XX=y
# CONFIG_RT2800USB_UNKNOWN is not set
CONFIG_RT2800_LIB=m
CONFIG_RT2800_LIB_MMIO=m
CONFIG_RT2X00_LIB_MMIO=m
CONFIG_RT2X00_LIB_PCI=m
CONFIG_RT2X00_LIB_USB=m
CONFIG_RT2X00_LIB=m
CONFIG_RT2X00_LIB_FIRMWARE=y
CONFIG_RT2X00_LIB_CRYPTO=y
CONFIG_RT2X00_LIB_LEDS=y
# CONFIG_RT2X00_DEBUG is not set
CONFIG_RTL_CARDS=m
CONFIG_RTL8192CE=m
CONFIG_RTL8192SE=m
CONFIG_RTL8192DE=m
CONFIG_RTL8723AE=m
CONFIG_RTL8723BE=m
CONFIG_RTL8188EE=m
CONFIG_RTL8192EE=m
CONFIG_RTL8821AE=m
CONFIG_RTL8192CU=m
CONFIG_RTLWIFI=m
CONFIG_RTLWIFI_PCI=m
CONFIG_RTLWIFI_USB=m
# CONFIG_RTLWIFI_DEBUG is not set
CONFIG_RTL8192C_COMMON=m
CONFIG_RTL8723_COMMON=m
CONFIG_RTLBTCOEXIST=m
# CONFIG_WL_TI is not set
CONFIG_ZD1211RW=m
# CONFIG_ZD1211RW_DEBUG is not set
CONFIG_MWIFIEX=m
CONFIG_MWIFIEX_SDIO=m
CONFIG_MWIFIEX_PCIE=m
CONFIG_MWIFIEX_USB=m
# CONFIG_CW1200 is not set
CONFIG_RSI_91X=m
CONFIG_RSI_DEBUGFS=y
# CONFIG_RSI_SDIO is not set
CONFIG_RSI_USB=m

#
# WiMAX Wireless Broadband devices
#
CONFIG_WIMAX_I2400M=m
CONFIG_WIMAX_I2400M_USB=m
CONFIG_WIMAX_I2400M_DEBUG_LEVEL=8
CONFIG_WAN=y
CONFIG_LANMEDIA=m
CONFIG_HDLC=m
CONFIG_HDLC_RAW=m
CONFIG_HDLC_RAW_ETH=m
CONFIG_HDLC_CISCO=m
CONFIG_HDLC_FR=m
CONFIG_HDLC_PPP=m
# CONFIG_HDLC_X25 is not set
CONFIG_PCI200SYN=m
CONFIG_WANXL=m
# CONFIG_PC300TOO is not set
CONFIG_FARSYNC=m
CONFIG_DSCC4=m
CONFIG_DSCC4_PCISYNC=y
CONFIG_DSCC4_PCI_RST=y
CONFIG_DLCI=m
CONFIG_DLCI_MAX=8
# CONFIG_SBNI is not set
CONFIG_IEEE802154_DRIVERS=m
CONFIG_XEN_NETDEV_FRONTEND=m
CONFIG_XEN_NETDEV_BACKEND=m
CONFIG_VMXNET3=m
CONFIG_HYPERV_NET=m
CONFIG_ISDN=y
# CONFIG_ISDN_I4L is not set
CONFIG_ISDN_CAPI=m
CONFIG_CAPI_TRACE=y
CONFIG_ISDN_CAPI_CAPI20=m
CONFIG_ISDN_CAPI_MIDDLEWARE=y

#
# CAPI hardware drivers
#
CONFIG_CAPI_AVM=y
CONFIG_ISDN_DRV_AVMB1_B1PCI=m
CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y
CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m
CONFIG_ISDN_DRV_AVMB1_AVM_CS=m
CONFIG_ISDN_DRV_AVMB1_T1PCI=m
CONFIG_ISDN_DRV_AVMB1_C4=m
CONFIG_CAPI_EICON=y
CONFIG_ISDN_DIVAS=m
CONFIG_ISDN_DIVAS_BRIPCI=y
CONFIG_ISDN_DIVAS_PRIPCI=y
CONFIG_ISDN_DIVAS_DIVACAPI=m
CONFIG_ISDN_DIVAS_USERIDI=m
CONFIG_ISDN_DIVAS_MAINT=m
CONFIG_ISDN_DRV_GIGASET=m
CONFIG_GIGASET_CAPI=y
# CONFIG_GIGASET_DUMMYLL is not set
CONFIG_GIGASET_BASE=m
CONFIG_GIGASET_M105=m
CONFIG_GIGASET_M101=m
# CONFIG_GIGASET_DEBUG is not set
CONFIG_HYSDN=m
CONFIG_HYSDN_CAPI=y
CONFIG_MISDN=m
CONFIG_MISDN_DSP=m
CONFIG_MISDN_L1OIP=m

#
# mISDN hardware drivers
#
CONFIG_MISDN_HFCPCI=m
CONFIG_MISDN_HFCMULTI=m
CONFIG_MISDN_HFCUSB=m
CONFIG_MISDN_AVMFRITZ=m
CONFIG_MISDN_SPEEDFAX=m
CONFIG_MISDN_INFINEON=m
CONFIG_MISDN_W6692=m
# CONFIG_MISDN_NETJET is not set
CONFIG_MISDN_IPAC=m
CONFIG_MISDN_ISAR=m

#
# Input device support
#
CONFIG_INPUT=y
CONFIG_INPUT_FF_MEMLESS=m
CONFIG_INPUT_POLLDEV=m
CONFIG_INPUT_SPARSEKMAP=m
# CONFIG_INPUT_MATRIXKMAP is not set

#
# Userland interfaces
#
CONFIG_INPUT_MOUSEDEV=y
CONFIG_INPUT_MOUSEDEV_PSAUX=y
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
CONFIG_INPUT_JOYDEV=m
CONFIG_INPUT_EVDEV=m
# CONFIG_INPUT_EVBUG is not set

#
# Input Device Drivers
#
CONFIG_INPUT_KEYBOARD=y
CONFIG_KEYBOARD_ADP5588=m
# CONFIG_KEYBOARD_ADP5589 is not set
CONFIG_KEYBOARD_ATKBD=y
# CONFIG_KEYBOARD_QT1070 is not set
CONFIG_KEYBOARD_QT2160=m
CONFIG_KEYBOARD_LKKBD=m
# CONFIG_KEYBOARD_GPIO is not set
# CONFIG_KEYBOARD_GPIO_POLLED is not set
# CONFIG_KEYBOARD_TCA6416 is not set
# CONFIG_KEYBOARD_TCA8418 is not set
# CONFIG_KEYBOARD_MATRIX is not set
CONFIG_KEYBOARD_LM8323=m
# CONFIG_KEYBOARD_LM8333 is not set
CONFIG_KEYBOARD_MAX7359=m
# CONFIG_KEYBOARD_MCS is not set
# CONFIG_KEYBOARD_MPR121 is not set
CONFIG_KEYBOARD_NEWTON=m
CONFIG_KEYBOARD_OPENCORES=m
# CONFIG_KEYBOARD_SAMSUNG is not set
CONFIG_KEYBOARD_STOWAWAY=m
CONFIG_KEYBOARD_SUNKBD=m
CONFIG_KEYBOARD_XTKBD=m
CONFIG_INPUT_MOUSE=y
CONFIG_MOUSE_PS2=m
CONFIG_MOUSE_PS2_ALPS=y
CONFIG_MOUSE_PS2_LOGIPS2PP=y
CONFIG_MOUSE_PS2_SYNAPTICS=y
CONFIG_MOUSE_PS2_CYPRESS=y
CONFIG_MOUSE_PS2_LIFEBOOK=y
CONFIG_MOUSE_PS2_TRACKPOINT=y
CONFIG_MOUSE_PS2_ELANTECH=y
CONFIG_MOUSE_PS2_SENTELIC=y
# CONFIG_MOUSE_PS2_TOUCHKIT is not set
CONFIG_MOUSE_PS2_FOCALTECH=y
# CONFIG_MOUSE_PS2_VMMOUSE is not set
CONFIG_MOUSE_SERIAL=m
CONFIG_MOUSE_APPLETOUCH=m
CONFIG_MOUSE_BCM5974=m
CONFIG_MOUSE_CYAPA=m
# CONFIG_MOUSE_ELAN_I2C is not set
CONFIG_MOUSE_VSXXXAA=m
# CONFIG_MOUSE_GPIO is not set
CONFIG_MOUSE_SYNAPTICS_I2C=m
CONFIG_MOUSE_SYNAPTICS_USB=m
CONFIG_INPUT_JOYSTICK=y
CONFIG_JOYSTICK_ANALOG=m
CONFIG_JOYSTICK_A3D=m
CONFIG_JOYSTICK_ADI=m
CONFIG_JOYSTICK_COBRA=m
CONFIG_JOYSTICK_GF2K=m
CONFIG_JOYSTICK_GRIP=m
CONFIG_JOYSTICK_GRIP_MP=m
CONFIG_JOYSTICK_GUILLEMOT=m
CONFIG_JOYSTICK_INTERACT=m
CONFIG_JOYSTICK_SIDEWINDER=m
CONFIG_JOYSTICK_TMDC=m
CONFIG_JOYSTICK_IFORCE=m
CONFIG_JOYSTICK_IFORCE_USB=y
CONFIG_JOYSTICK_IFORCE_232=y
CONFIG_JOYSTICK_WARRIOR=m
CONFIG_JOYSTICK_MAGELLAN=m
CONFIG_JOYSTICK_SPACEORB=m
CONFIG_JOYSTICK_SPACEBALL=m
CONFIG_JOYSTICK_STINGER=m
CONFIG_JOYSTICK_TWIDJOY=m
CONFIG_JOYSTICK_ZHENHUA=m
CONFIG_JOYSTICK_DB9=m
CONFIG_JOYSTICK_GAMECON=m
CONFIG_JOYSTICK_TURBOGRAFX=m
# CONFIG_JOYSTICK_AS5011 is not set
CONFIG_JOYSTICK_JOYDUMP=m
CONFIG_JOYSTICK_XPAD=m
CONFIG_JOYSTICK_XPAD_FF=y
CONFIG_JOYSTICK_XPAD_LEDS=y
CONFIG_JOYSTICK_WALKERA0701=m
CONFIG_INPUT_TABLET=y
CONFIG_TABLET_USB_ACECAD=m
CONFIG_TABLET_USB_AIPTEK=m
CONFIG_TABLET_USB_GTCO=m
CONFIG_TABLET_USB_HANWANG=m
CONFIG_TABLET_USB_KBTAB=m
CONFIG_TABLET_SERIAL_WACOM4=m
CONFIG_INPUT_TOUCHSCREEN=y
CONFIG_TOUCHSCREEN_ADS7846=m
CONFIG_TOUCHSCREEN_AD7877=m
CONFIG_TOUCHSCREEN_AD7879=m
CONFIG_TOUCHSCREEN_AD7879_I2C=m
# CONFIG_TOUCHSCREEN_AD7879_SPI is not set
CONFIG_TOUCHSCREEN_ATMEL_MXT=m
# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
# CONFIG_TOUCHSCREEN_BU21013 is not set
# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set
# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set
CONFIG_TOUCHSCREEN_DYNAPRO=m
CONFIG_TOUCHSCREEN_HAMPSHIRE=m
CONFIG_TOUCHSCREEN_EETI=m
CONFIG_TOUCHSCREEN_FUJITSU=m
# CONFIG_TOUCHSCREEN_GOODIX is not set
# CONFIG_TOUCHSCREEN_ILI210X is not set
CONFIG_TOUCHSCREEN_GUNZE=m
# CONFIG_TOUCHSCREEN_ELAN is not set
CONFIG_TOUCHSCREEN_ELO=m
CONFIG_TOUCHSCREEN_WACOM_W8001=m
# CONFIG_TOUCHSCREEN_WACOM_I2C is not set
# CONFIG_TOUCHSCREEN_MAX11801 is not set
CONFIG_TOUCHSCREEN_MCS5000=m
# CONFIG_TOUCHSCREEN_MMS114 is not set
CONFIG_TOUCHSCREEN_MTOUCH=m
CONFIG_TOUCHSCREEN_INEXIO=m
CONFIG_TOUCHSCREEN_MK712=m
CONFIG_TOUCHSCREEN_PENMOUNT=m
# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set
CONFIG_TOUCHSCREEN_TOUCHRIGHT=m
CONFIG_TOUCHSCREEN_TOUCHWIN=m
# CONFIG_TOUCHSCREEN_PIXCIR is not set
CONFIG_TOUCHSCREEN_WM97XX=m
CONFIG_TOUCHSCREEN_WM9705=y
CONFIG_TOUCHSCREEN_WM9712=y
CONFIG_TOUCHSCREEN_WM9713=y
CONFIG_TOUCHSCREEN_USB_COMPOSITE=m
CONFIG_TOUCHSCREEN_USB_EGALAX=y
CONFIG_TOUCHSCREEN_USB_PANJIT=y
CONFIG_TOUCHSCREEN_USB_3M=y
CONFIG_TOUCHSCREEN_USB_ITM=y
CONFIG_TOUCHSCREEN_USB_ETURBO=y
CONFIG_TOUCHSCREEN_USB_GUNZE=y
CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y
CONFIG_TOUCHSCREEN_USB_IRTOUCH=y
CONFIG_TOUCHSCREEN_USB_IDEALTEK=y
CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y
CONFIG_TOUCHSCREEN_USB_GOTOP=y
CONFIG_TOUCHSCREEN_USB_JASTEC=y
CONFIG_TOUCHSCREEN_USB_ELO=y
CONFIG_TOUCHSCREEN_USB_E2I=y
CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y
CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y
CONFIG_TOUCHSCREEN_USB_NEXIO=y
CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y
CONFIG_TOUCHSCREEN_TOUCHIT213=m
CONFIG_TOUCHSCREEN_TSC_SERIO=m
# CONFIG_TOUCHSCREEN_TSC2005 is not set
CONFIG_TOUCHSCREEN_TSC2007=m
# CONFIG_TOUCHSCREEN_ST1232 is not set
CONFIG_TOUCHSCREEN_SUR40=m
# CONFIG_TOUCHSCREEN_SX8654 is not set
CONFIG_TOUCHSCREEN_TPS6507X=m
# CONFIG_TOUCHSCREEN_ZFORCE is not set
CONFIG_INPUT_MISC=y
# CONFIG_INPUT_AD714X is not set
# CONFIG_INPUT_BMA150 is not set
# CONFIG_INPUT_E3X0_BUTTON is not set
CONFIG_INPUT_PCSPKR=m
# CONFIG_INPUT_MMA8450 is not set
# CONFIG_INPUT_MPU3050 is not set
CONFIG_INPUT_APANEL=m
# CONFIG_INPUT_GP2A is not set
# CONFIG_INPUT_GPIO_BEEPER is not set
# CONFIG_INPUT_GPIO_TILT_POLLED is not set
CONFIG_INPUT_ATLAS_BTNS=m
CONFIG_INPUT_ATI_REMOTE2=m
CONFIG_INPUT_KEYSPAN_REMOTE=m
# CONFIG_INPUT_KXTJ9 is not set
CONFIG_INPUT_POWERMATE=m
CONFIG_INPUT_YEALINK=m
CONFIG_INPUT_CM109=m
CONFIG_INPUT_UINPUT=m
# CONFIG_INPUT_PCF8574 is not set
# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set
# CONFIG_INPUT_ADXL34X is not set
# CONFIG_INPUT_IMS_PCU is not set
# CONFIG_INPUT_CMA3000 is not set
CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y
CONFIG_INPUT_IDEAPAD_SLIDEBAR=m
# CONFIG_INPUT_DRV260X_HAPTICS is not set
# CONFIG_INPUT_DRV2667_HAPTICS is not set

#
# Hardware I/O ports
#
CONFIG_SERIO=y
CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y
CONFIG_SERIO_I8042=y
CONFIG_SERIO_SERPORT=m
CONFIG_SERIO_CT82C710=m
CONFIG_SERIO_PARKBD=m
CONFIG_SERIO_PCIPS2=m
CONFIG_SERIO_LIBPS2=y
CONFIG_SERIO_RAW=m
CONFIG_SERIO_ALTERA_PS2=m
# CONFIG_SERIO_PS2MULT is not set
# CONFIG_SERIO_ARC_PS2 is not set
CONFIG_HYPERV_KEYBOARD=m
CONFIG_GAMEPORT=m
CONFIG_GAMEPORT_NS558=m
CONFIG_GAMEPORT_L4=m
CONFIG_GAMEPORT_EMU10K1=m
CONFIG_GAMEPORT_FM801=m

#
# Character devices
#
CONFIG_TTY=y
CONFIG_VT=y
CONFIG_CONSOLE_TRANSLATIONS=y
CONFIG_VT_CONSOLE=y
CONFIG_VT_CONSOLE_SLEEP=y
CONFIG_HW_CONSOLE=y
CONFIG_VT_HW_CONSOLE_BINDING=y
CONFIG_UNIX98_PTYS=y
CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
# CONFIG_LEGACY_PTYS is not set
CONFIG_SERIAL_NONSTANDARD=y
CONFIG_ROCKETPORT=m
CONFIG_CYCLADES=m
# CONFIG_CYZ_INTR is not set
CONFIG_MOXA_INTELLIO=m
CONFIG_MOXA_SMARTIO=m
CONFIG_SYNCLINK=m
CONFIG_SYNCLINKMP=m
CONFIG_SYNCLINK_GT=m
CONFIG_NOZOMI=m
CONFIG_ISI=m
CONFIG_N_HDLC=m
CONFIG_N_GSM=m
# CONFIG_TRACE_SINK is not set
CONFIG_DEVMEM=y
# CONFIG_DEVKMEM is not set

#
# Serial drivers
#
CONFIG_SERIAL_EARLYCON=y
CONFIG_SERIAL_8250=y
# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set
CONFIG_SERIAL_8250_PNP=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_DMA=y
CONFIG_SERIAL_8250_PCI=y
CONFIG_SERIAL_8250_CS=m
CONFIG_SERIAL_8250_NR_UARTS=32
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_SHARE_IRQ=y
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
CONFIG_SERIAL_8250_RSA=y
CONFIG_SERIAL_8250_DW=y
CONFIG_SERIAL_8250_FINTEK=m

#
# Non-8250 serial port support
#
# CONFIG_SERIAL_MAX3100 is not set
# CONFIG_SERIAL_MAX310X is not set
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_SERIAL_JSM=m
# CONFIG_SERIAL_SCCNXP is not set
# CONFIG_SERIAL_SC16IS7XX is not set
# CONFIG_SERIAL_ALTERA_JTAGUART is not set
# CONFIG_SERIAL_ALTERA_UART is not set
# CONFIG_SERIAL_IFX6X60 is not set
# CONFIG_SERIAL_ARC is not set
CONFIG_SERIAL_RP2=m
CONFIG_SERIAL_RP2_NR_UARTS=32
# CONFIG_SERIAL_FSL_LPUART is not set
# CONFIG_TTY_PRINTK is not set
CONFIG_PRINTER=m
# CONFIG_LP_CONSOLE is not set
CONFIG_PPDEV=m
CONFIG_HVC_DRIVER=y
CONFIG_HVC_IRQ=y
CONFIG_HVC_XEN=y
CONFIG_HVC_XEN_FRONTEND=y
CONFIG_VIRTIO_CONSOLE=m
CONFIG_IPMI_HANDLER=m
# CONFIG_IPMI_PANIC_EVENT is not set
CONFIG_IPMI_DEVICE_INTERFACE=m
CONFIG_IPMI_SI=m
# CONFIG_IPMI_SI_PROBE_DEFAULTS is not set
# CONFIG_IPMI_SSIF is not set
CONFIG_IPMI_WATCHDOG=m
CONFIG_IPMI_POWEROFF=m
CONFIG_HW_RANDOM=m
# CONFIG_HW_RANDOM_TIMERIOMEM is not set
CONFIG_HW_RANDOM_INTEL=m
CONFIG_HW_RANDOM_AMD=m
CONFIG_HW_RANDOM_VIA=m
CONFIG_HW_RANDOM_VIRTIO=m
CONFIG_HW_RANDOM_TPM=m
CONFIG_NVRAM=m
CONFIG_R3964=m
CONFIG_APPLICOM=m

#
# PCMCIA character devices
#
CONFIG_SYNCLINK_CS=m
CONFIG_CARDMAN_4000=m
CONFIG_CARDMAN_4040=m
CONFIG_IPWIRELESS=m
CONFIG_MWAVE=m
CONFIG_RAW_DRIVER=m
CONFIG_MAX_RAW_DEVS=256
CONFIG_HPET=y
CONFIG_HPET_MMAP=y
CONFIG_HPET_MMAP_DEFAULT=y
CONFIG_HANGCHECK_TIMER=m
CONFIG_TCG_TPM=m
CONFIG_TCG_TIS=m
CONFIG_TCG_TIS_I2C_ATMEL=m
CONFIG_TCG_TIS_I2C_INFINEON=m
CONFIG_TCG_TIS_I2C_NUVOTON=m
CONFIG_TCG_NSC=m
CONFIG_TCG_ATMEL=m
CONFIG_TCG_INFINEON=m
CONFIG_TCG_XEN=m
CONFIG_TCG_CRB=m
CONFIG_TCG_TIS_ST33ZP24=m
CONFIG_TCG_TIS_ST33ZP24_I2C=m
# CONFIG_TCG_TIS_ST33ZP24_SPI is not set
CONFIG_TELCLOCK=m
CONFIG_DEVPORT=y
# CONFIG_XILLYBUS is not set

#
# I2C support
#
CONFIG_I2C=y
CONFIG_ACPI_I2C_OPREGION=y
CONFIG_I2C_BOARDINFO=y
CONFIG_I2C_COMPAT=y
CONFIG_I2C_CHARDEV=m
CONFIG_I2C_MUX=m

#
# Multiplexer I2C Chip support
#
# CONFIG_I2C_MUX_GPIO is not set
# CONFIG_I2C_MUX_PCA9541 is not set
# CONFIG_I2C_MUX_PCA954x is not set
# CONFIG_I2C_MUX_PINCTRL is not set
CONFIG_I2C_HELPER_AUTO=y
CONFIG_I2C_SMBUS=m
CONFIG_I2C_ALGOBIT=m
CONFIG_I2C_ALGOPCA=m

#
# I2C Hardware Bus support
#

#
# PC SMBus host controller drivers
#
CONFIG_I2C_ALI1535=m
CONFIG_I2C_ALI1563=m
CONFIG_I2C_ALI15X3=m
CONFIG_I2C_AMD756=m
CONFIG_I2C_AMD756_S4882=m
CONFIG_I2C_AMD8111=m
CONFIG_I2C_I801=m
CONFIG_I2C_ISCH=m
CONFIG_I2C_ISMT=m
CONFIG_I2C_PIIX4=m
CONFIG_I2C_NFORCE2=m
CONFIG_I2C_NFORCE2_S4985=m
CONFIG_I2C_SIS5595=m
CONFIG_I2C_SIS630=m
CONFIG_I2C_SIS96X=m
CONFIG_I2C_VIA=m
CONFIG_I2C_VIAPRO=m

#
# ACPI drivers
#
CONFIG_I2C_SCMI=m

#
# I2C system bus drivers (mostly embedded / system-on-chip)
#
# CONFIG_I2C_CBUS_GPIO is not set
CONFIG_I2C_DESIGNWARE_CORE=m
CONFIG_I2C_DESIGNWARE_PLATFORM=m
CONFIG_I2C_DESIGNWARE_PCI=m
# CONFIG_I2C_GPIO is not set
CONFIG_I2C_KEMPLD=m
CONFIG_I2C_OCORES=m
CONFIG_I2C_PCA_PLATFORM=m
# CONFIG_I2C_PXA_PCI is not set
CONFIG_I2C_SIMTEC=m
# CONFIG_I2C_XILINX is not set

#
# External I2C/SMBus adapter drivers
#
CONFIG_I2C_DIOLAN_U2C=m
CONFIG_I2C_PARPORT=m
CONFIG_I2C_PARPORT_LIGHT=m
CONFIG_I2C_ROBOTFUZZ_OSIF=m
CONFIG_I2C_TAOS_EVM=m
CONFIG_I2C_TINY_USB=m
CONFIG_I2C_VIPERBOARD=m

#
# Other I2C/SMBus bus drivers
#
CONFIG_I2C_STUB=m
# CONFIG_I2C_SLAVE is not set
# CONFIG_I2C_DEBUG_CORE is not set
# CONFIG_I2C_DEBUG_ALGO is not set
# CONFIG_I2C_DEBUG_BUS is not set
CONFIG_SPI=y
# CONFIG_SPI_DEBUG is not set
CONFIG_SPI_MASTER=y

#
# SPI Master Controller Drivers
#
# CONFIG_SPI_ALTERA is not set
CONFIG_SPI_BITBANG=m
CONFIG_SPI_BUTTERFLY=m
# CONFIG_SPI_CADENCE is not set
# CONFIG_SPI_GPIO is not set
CONFIG_SPI_LM70_LLP=m
# CONFIG_SPI_OC_TINY is not set
# CONFIG_SPI_PXA2XX is not set
# CONFIG_SPI_PXA2XX_PCI is not set
# CONFIG_SPI_SC18IS602 is not set
# CONFIG_SPI_XCOMM is not set
# CONFIG_SPI_XILINX is not set
# CONFIG_SPI_DESIGNWARE is not set

#
# SPI Protocol Masters
#
# CONFIG_SPI_SPIDEV is not set
# CONFIG_SPI_TLE62X0 is not set
# CONFIG_SPMI is not set
# CONFIG_HSI is not set

#
# PPS support
#
CONFIG_PPS=m
# CONFIG_PPS_DEBUG is not set
# CONFIG_NTP_PPS is not set

#
# PPS clients support
#
# CONFIG_PPS_CLIENT_KTIMER is not set
CONFIG_PPS_CLIENT_LDISC=m
CONFIG_PPS_CLIENT_PARPORT=m
# CONFIG_PPS_CLIENT_GPIO is not set

#
# PPS generators support
#

#
# PTP clock support
#
CONFIG_PTP_1588_CLOCK=m

#
# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
#
CONFIG_PINCTRL=y

#
# Pin controllers
#
# CONFIG_DEBUG_PINCTRL is not set
# CONFIG_PINCTRL_AMD is not set
# CONFIG_PINCTRL_BAYTRAIL is not set
# CONFIG_PINCTRL_CHERRYVIEW is not set
# CONFIG_PINCTRL_SUNRISEPOINT is not set
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
CONFIG_GPIOLIB=y
CONFIG_GPIO_DEVRES=y
CONFIG_GPIO_ACPI=y
# CONFIG_DEBUG_GPIO is not set
# CONFIG_GPIO_SYSFS is not set

#
# Memory mapped GPIO drivers
#
# CONFIG_GPIO_DWAPB is not set
# CONFIG_GPIO_F7188X is not set
# CONFIG_GPIO_GENERIC_PLATFORM is not set
# CONFIG_GPIO_ICH is not set
# CONFIG_GPIO_IT8761E is not set
# CONFIG_GPIO_LYNXPOINT is not set
# CONFIG_GPIO_SCH is not set
# CONFIG_GPIO_SCH311X is not set
# CONFIG_GPIO_VX855 is not set

#
# I2C GPIO expanders
#
# CONFIG_GPIO_ADP5588 is not set
# CONFIG_GPIO_MAX7300 is not set
# CONFIG_GPIO_MAX732X is not set
# CONFIG_GPIO_PCA953X is not set
# CONFIG_GPIO_PCF857X is not set
# CONFIG_GPIO_SX150X is not set

#
# MFD GPIO expanders
#
CONFIG_GPIO_KEMPLD=m

#
# PCI GPIO expanders
#
# CONFIG_GPIO_AMD8111 is not set
# CONFIG_GPIO_INTEL_MID is not set
CONFIG_GPIO_ML_IOH=m
# CONFIG_GPIO_RDC321X is not set

#
# SPI GPIO expanders
#
# CONFIG_GPIO_MAX7301 is not set
# CONFIG_GPIO_MCP23S08 is not set
# CONFIG_GPIO_MC33880 is not set

#
# USB GPIO expanders
#
CONFIG_GPIO_VIPERBOARD=m
CONFIG_W1=m
CONFIG_W1_CON=y

#
# 1-wire Bus Masters
#
CONFIG_W1_MASTER_MATROX=m
CONFIG_W1_MASTER_DS2490=m
CONFIG_W1_MASTER_DS2482=m
# CONFIG_W1_MASTER_DS1WM is not set
# CONFIG_W1_MASTER_GPIO is not set

#
# 1-wire Slaves
#
CONFIG_W1_SLAVE_THERM=m
CONFIG_W1_SLAVE_SMEM=m
# CONFIG_W1_SLAVE_DS2408 is not set
# CONFIG_W1_SLAVE_DS2413 is not set
# CONFIG_W1_SLAVE_DS2406 is not set
# CONFIG_W1_SLAVE_DS2423 is not set
CONFIG_W1_SLAVE_DS2431=m
CONFIG_W1_SLAVE_DS2433=m
# CONFIG_W1_SLAVE_DS2433_CRC is not set
# CONFIG_W1_SLAVE_DS2760 is not set
# CONFIG_W1_SLAVE_DS2780 is not set
# CONFIG_W1_SLAVE_DS2781 is not set
# CONFIG_W1_SLAVE_DS28E04 is not set
CONFIG_W1_SLAVE_BQ27000=m
CONFIG_POWER_SUPPLY=y
# CONFIG_POWER_SUPPLY_DEBUG is not set
# CONFIG_PDA_POWER is not set
# CONFIG_GENERIC_ADC_BATTERY is not set
# CONFIG_TEST_POWER is not set
# CONFIG_BATTERY_DS2780 is not set
# CONFIG_BATTERY_DS2781 is not set
# CONFIG_BATTERY_DS2782 is not set
CONFIG_BATTERY_SBS=m
# CONFIG_BATTERY_BQ27x00 is not set
# CONFIG_BATTERY_MAX17040 is not set
# CONFIG_BATTERY_MAX17042 is not set
# CONFIG_CHARGER_MAX8903 is not set
# CONFIG_CHARGER_LP8727 is not set
# CONFIG_CHARGER_GPIO is not set
# CONFIG_CHARGER_BQ2415X is not set
# CONFIG_CHARGER_BQ24190 is not set
# CONFIG_CHARGER_BQ24735 is not set
# CONFIG_CHARGER_SMB347 is not set
# CONFIG_BATTERY_GAUGE_LTC2941 is not set
# CONFIG_POWER_RESET is not set
# CONFIG_POWER_AVS is not set
CONFIG_HWMON=y
CONFIG_HWMON_VID=m
# CONFIG_HWMON_DEBUG_CHIP is not set

#
# Native drivers
#
CONFIG_SENSORS_ABITUGURU=m
CONFIG_SENSORS_ABITUGURU3=m
# CONFIG_SENSORS_AD7314 is not set
CONFIG_SENSORS_AD7414=m
CONFIG_SENSORS_AD7418=m
CONFIG_SENSORS_ADM1021=m
CONFIG_SENSORS_ADM1025=m
CONFIG_SENSORS_ADM1026=m
CONFIG_SENSORS_ADM1029=m
CONFIG_SENSORS_ADM1031=m
CONFIG_SENSORS_ADM9240=m
# CONFIG_SENSORS_ADT7310 is not set
# CONFIG_SENSORS_ADT7410 is not set
CONFIG_SENSORS_ADT7411=m
CONFIG_SENSORS_ADT7462=m
CONFIG_SENSORS_ADT7470=m
CONFIG_SENSORS_ADT7475=m
CONFIG_SENSORS_ASC7621=m
CONFIG_SENSORS_K8TEMP=m
CONFIG_SENSORS_K10TEMP=m
CONFIG_SENSORS_FAM15H_POWER=m
CONFIG_SENSORS_APPLESMC=m
CONFIG_SENSORS_ASB100=m
CONFIG_SENSORS_ATXP1=m
CONFIG_SENSORS_DS620=m
CONFIG_SENSORS_DS1621=m
CONFIG_SENSORS_I5K_AMB=m
CONFIG_SENSORS_F71805F=m
CONFIG_SENSORS_F71882FG=m
CONFIG_SENSORS_F75375S=m
CONFIG_SENSORS_FSCHMD=m
CONFIG_SENSORS_GL518SM=m
CONFIG_SENSORS_GL520SM=m
CONFIG_SENSORS_G760A=m
# CONFIG_SENSORS_G762 is not set
# CONFIG_SENSORS_GPIO_FAN is not set
# CONFIG_SENSORS_HIH6130 is not set
CONFIG_SENSORS_IBMAEM=m
CONFIG_SENSORS_IBMPEX=m
# CONFIG_SENSORS_IIO_HWMON is not set
# CONFIG_SENSORS_I5500 is not set
CONFIG_SENSORS_CORETEMP=m
CONFIG_SENSORS_IT87=m
CONFIG_SENSORS_JC42=m
# CONFIG_SENSORS_POWR1220 is not set
CONFIG_SENSORS_LINEAGE=m
# CONFIG_SENSORS_LTC2945 is not set
CONFIG_SENSORS_LTC4151=m
CONFIG_SENSORS_LTC4215=m
# CONFIG_SENSORS_LTC4222 is not set
CONFIG_SENSORS_LTC4245=m
# CONFIG_SENSORS_LTC4260 is not set
CONFIG_SENSORS_LTC4261=m
CONFIG_SENSORS_MAX1111=m
CONFIG_SENSORS_MAX16065=m
CONFIG_SENSORS_MAX1619=m
CONFIG_SENSORS_MAX1668=m
# CONFIG_SENSORS_MAX197 is not set
CONFIG_SENSORS_MAX6639=m
CONFIG_SENSORS_MAX6642=m
CONFIG_SENSORS_MAX6650=m
# CONFIG_SENSORS_MAX6697 is not set
# CONFIG_SENSORS_HTU21 is not set
# CONFIG_SENSORS_MCP3021 is not set
CONFIG_SENSORS_MENF21BMC_HWMON=m
CONFIG_SENSORS_ADCXX=m
CONFIG_SENSORS_LM63=m
CONFIG_SENSORS_LM70=m
CONFIG_SENSORS_LM73=m
CONFIG_SENSORS_LM75=m
CONFIG_SENSORS_LM77=m
CONFIG_SENSORS_LM78=m
CONFIG_SENSORS_LM80=m
CONFIG_SENSORS_LM83=m
CONFIG_SENSORS_LM85=m
CONFIG_SENSORS_LM87=m
CONFIG_SENSORS_LM90=m
CONFIG_SENSORS_LM92=m
CONFIG_SENSORS_LM93=m
# CONFIG_SENSORS_LM95234 is not set
CONFIG_SENSORS_LM95241=m
CONFIG_SENSORS_LM95245=m
CONFIG_SENSORS_PC87360=m
CONFIG_SENSORS_PC87427=m
CONFIG_SENSORS_NTC_THERMISTOR=m
CONFIG_SENSORS_NCT6683=m
CONFIG_SENSORS_NCT6775=m
# CONFIG_SENSORS_NCT7802 is not set
# CONFIG_SENSORS_NCT7904 is not set
CONFIG_SENSORS_PCF8591=m
# CONFIG_PMBUS is not set
# CONFIG_SENSORS_SHT15 is not set
CONFIG_SENSORS_SHT21=m
# CONFIG_SENSORS_SHTC1 is not set
CONFIG_SENSORS_SIS5595=m
CONFIG_SENSORS_DME1737=m
CONFIG_SENSORS_EMC1403=m
CONFIG_SENSORS_EMC2103=m
CONFIG_SENSORS_EMC6W201=m
CONFIG_SENSORS_SMSC47M1=m
CONFIG_SENSORS_SMSC47M192=m
CONFIG_SENSORS_SMSC47B397=m
CONFIG_SENSORS_SCH56XX_COMMON=m
CONFIG_SENSORS_SCH5627=m
CONFIG_SENSORS_SCH5636=m
CONFIG_SENSORS_SMM665=m
# CONFIG_SENSORS_ADC128D818 is not set
CONFIG_SENSORS_ADS1015=m
CONFIG_SENSORS_ADS7828=m
CONFIG_SENSORS_ADS7871=m
CONFIG_SENSORS_AMC6821=m
# CONFIG_SENSORS_INA209 is not set
# CONFIG_SENSORS_INA2XX is not set
CONFIG_SENSORS_THMC50=m
CONFIG_SENSORS_TMP102=m
# CONFIG_SENSORS_TMP103 is not set
CONFIG_SENSORS_TMP401=m
CONFIG_SENSORS_TMP421=m
CONFIG_SENSORS_VIA_CPUTEMP=m
CONFIG_SENSORS_VIA686A=m
CONFIG_SENSORS_VT1211=m
CONFIG_SENSORS_VT8231=m
CONFIG_SENSORS_W83781D=m
CONFIG_SENSORS_W83791D=m
CONFIG_SENSORS_W83792D=m
CONFIG_SENSORS_W83793=m
CONFIG_SENSORS_W83795=m
# CONFIG_SENSORS_W83795_FANCTRL is not set
CONFIG_SENSORS_W83L785TS=m
CONFIG_SENSORS_W83L786NG=m
CONFIG_SENSORS_W83627HF=m
CONFIG_SENSORS_W83627EHF=m

#
# ACPI drivers
#
CONFIG_SENSORS_ACPI_POWER=m
CONFIG_SENSORS_ATK0110=m
CONFIG_THERMAL=m
CONFIG_THERMAL_HWMON=y
CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set
# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set
CONFIG_THERMAL_GOV_FAIR_SHARE=y
CONFIG_THERMAL_GOV_STEP_WISE=y
CONFIG_THERMAL_GOV_BANG_BANG=y
CONFIG_THERMAL_GOV_USER_SPACE=y
# CONFIG_THERMAL_EMULATION is not set
CONFIG_INTEL_POWERCLAMP=m
CONFIG_X86_PKG_TEMP_THERMAL=m
# CONFIG_INTEL_SOC_DTS_THERMAL is not set
CONFIG_INT340X_THERMAL=m
CONFIG_ACPI_THERMAL_REL=m

#
# Texas Instruments thermal drivers
#
CONFIG_WATCHDOG=y
CONFIG_WATCHDOG_CORE=y
# CONFIG_WATCHDOG_NOWAYOUT is not set

#
# Watchdog Device Drivers
#
CONFIG_SOFT_WATCHDOG=m
CONFIG_MENF21BMC_WATCHDOG=m
# CONFIG_XILINX_WATCHDOG is not set
# CONFIG_CADENCE_WATCHDOG is not set
# CONFIG_DW_WATCHDOG is not set
CONFIG_ACQUIRE_WDT=m
CONFIG_ADVANTECH_WDT=m
CONFIG_ALIM1535_WDT=m
CONFIG_ALIM7101_WDT=m
CONFIG_F71808E_WDT=m
CONFIG_SP5100_TCO=m
CONFIG_SBC_FITPC2_WATCHDOG=m
CONFIG_EUROTECH_WDT=m
CONFIG_IB700_WDT=m
CONFIG_IBMASR=m
CONFIG_WAFER_WDT=m
CONFIG_I6300ESB_WDT=m
CONFIG_IE6XX_WDT=m
CONFIG_ITCO_WDT=m
CONFIG_ITCO_VENDOR_SUPPORT=y
CONFIG_IT8712F_WDT=m
CONFIG_IT87_WDT=m
CONFIG_HP_WATCHDOG=m
CONFIG_KEMPLD_WDT=m
CONFIG_HPWDT_NMI_DECODING=y
CONFIG_SC1200_WDT=m
CONFIG_PC87413_WDT=m
CONFIG_NV_TCO=m
CONFIG_60XX_WDT=m
CONFIG_CPU5_WDT=m
CONFIG_SMSC_SCH311X_WDT=m
CONFIG_SMSC37B787_WDT=m
CONFIG_VIA_WDT=m
CONFIG_W83627HF_WDT=m
CONFIG_W83877F_WDT=m
CONFIG_W83977F_WDT=m
CONFIG_MACHZ_WDT=m
CONFIG_SBC_EPX_C3_WATCHDOG=m
# CONFIG_MEN_A21_WDT is not set
CONFIG_XEN_WDT=m

#
# PCI-based Watchdog Cards
#
CONFIG_PCIPCWATCHDOG=m
CONFIG_WDTPCI=m

#
# USB-based Watchdog Cards
#
CONFIG_USBPCWATCHDOG=m
CONFIG_SSB_POSSIBLE=y

#
# Sonics Silicon Backplane
#
CONFIG_SSB=m
CONFIG_SSB_SPROM=y
CONFIG_SSB_BLOCKIO=y
CONFIG_SSB_PCIHOST_POSSIBLE=y
CONFIG_SSB_PCIHOST=y
CONFIG_SSB_B43_PCI_BRIDGE=y
CONFIG_SSB_PCMCIAHOST_POSSIBLE=y
CONFIG_SSB_PCMCIAHOST=y
CONFIG_SSB_SDIOHOST_POSSIBLE=y
CONFIG_SSB_SDIOHOST=y
# CONFIG_SSB_SILENT is not set
# CONFIG_SSB_DEBUG is not set
CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y
CONFIG_SSB_DRIVER_PCICORE=y
# CONFIG_SSB_DRIVER_GPIO is not set
CONFIG_BCMA_POSSIBLE=y

#
# Broadcom specific AMBA
#
CONFIG_BCMA=m
CONFIG_BCMA_BLOCKIO=y
CONFIG_BCMA_HOST_PCI_POSSIBLE=y
CONFIG_BCMA_HOST_PCI=y
# CONFIG_BCMA_HOST_SOC is not set
CONFIG_BCMA_DRIVER_PCI=y
# CONFIG_BCMA_DRIVER_GMAC_CMN is not set
# CONFIG_BCMA_DRIVER_GPIO is not set
# CONFIG_BCMA_DEBUG is not set

#
# Multifunction device drivers
#
CONFIG_MFD_CORE=m
# CONFIG_MFD_AS3711 is not set
# CONFIG_PMIC_ADP5520 is not set
# CONFIG_MFD_AAT2870_CORE is not set
# CONFIG_MFD_BCM590XX is not set
# CONFIG_MFD_AXP20X is not set
# CONFIG_MFD_CROS_EC is not set
# CONFIG_PMIC_DA903X is not set
# CONFIG_MFD_DA9052_SPI is not set
# CONFIG_MFD_DA9052_I2C is not set
# CONFIG_MFD_DA9055 is not set
# CONFIG_MFD_DA9063 is not set
# CONFIG_MFD_DA9150 is not set
# CONFIG_MFD_DLN2 is not set
# CONFIG_MFD_MC13XXX_SPI is not set
# CONFIG_MFD_MC13XXX_I2C is not set
# CONFIG_HTC_PASIC3 is not set
# CONFIG_HTC_I2CPLD is not set
# CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set
CONFIG_LPC_ICH=m
CONFIG_LPC_SCH=m
# CONFIG_INTEL_SOC_PMIC is not set
# CONFIG_MFD_JANZ_CMODIO is not set
CONFIG_MFD_KEMPLD=m
# CONFIG_MFD_88PM800 is not set
# CONFIG_MFD_88PM805 is not set
# CONFIG_MFD_88PM860X is not set
# CONFIG_MFD_MAX14577 is not set
# CONFIG_MFD_MAX77693 is not set
# CONFIG_MFD_MAX77843 is not set
# CONFIG_MFD_MAX8907 is not set
# CONFIG_MFD_MAX8925 is not set
# CONFIG_MFD_MAX8997 is not set
# CONFIG_MFD_MAX8998 is not set
# CONFIG_MFD_MT6397 is not set
CONFIG_MFD_MENF21BMC=m
# CONFIG_EZX_PCAP is not set
CONFIG_MFD_VIPERBOARD=m
# CONFIG_MFD_RETU is not set
# CONFIG_MFD_PCF50633 is not set
# CONFIG_UCB1400_CORE is not set
# CONFIG_MFD_RDC321X is not set
CONFIG_MFD_RTSX_PCI=m
# CONFIG_MFD_RT5033 is not set
CONFIG_MFD_RTSX_USB=m
# CONFIG_MFD_RC5T583 is not set
# CONFIG_MFD_RN5T618 is not set
# CONFIG_MFD_SEC_CORE is not set
# CONFIG_MFD_SI476X_CORE is not set
# CONFIG_MFD_SM501 is not set
# CONFIG_MFD_SKY81452 is not set
# CONFIG_MFD_SMSC is not set
# CONFIG_ABX500_CORE is not set
# CONFIG_MFD_SYSCON is not set
# CONFIG_MFD_TI_AM335X_TSCADC is not set
# CONFIG_MFD_LP3943 is not set
# CONFIG_MFD_LP8788 is not set
# CONFIG_MFD_PALMAS is not set
# CONFIG_TPS6105X is not set
# CONFIG_TPS65010 is not set
# CONFIG_TPS6507X is not set
# CONFIG_MFD_TPS65090 is not set
# CONFIG_MFD_TPS65217 is not set
# CONFIG_MFD_TPS65218 is not set
# CONFIG_MFD_TPS6586X is not set
# CONFIG_MFD_TPS65910 is not set
# CONFIG_MFD_TPS65912 is not set
# CONFIG_MFD_TPS65912_I2C is not set
# CONFIG_MFD_TPS65912_SPI is not set
# CONFIG_MFD_TPS80031 is not set
# CONFIG_TWL4030_CORE is not set
# CONFIG_TWL6040_CORE is not set
# CONFIG_MFD_WL1273_CORE is not set
# CONFIG_MFD_LM3533 is not set
# CONFIG_MFD_TMIO is not set
# CONFIG_MFD_VX855 is not set
# CONFIG_MFD_ARIZONA_I2C is not set
# CONFIG_MFD_ARIZONA_SPI is not set
# CONFIG_MFD_WM8400 is not set
# CONFIG_MFD_WM831X_I2C is not set
# CONFIG_MFD_WM831X_SPI is not set
# CONFIG_MFD_WM8350_I2C is not set
# CONFIG_MFD_WM8994 is not set
# CONFIG_REGULATOR is not set
CONFIG_MEDIA_SUPPORT=m

#
# Multimedia core support
#
CONFIG_MEDIA_CAMERA_SUPPORT=y
CONFIG_MEDIA_ANALOG_TV_SUPPORT=y
CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y
CONFIG_MEDIA_RADIO_SUPPORT=y
CONFIG_MEDIA_SDR_SUPPORT=y
CONFIG_MEDIA_RC_SUPPORT=y
CONFIG_MEDIA_CONTROLLER=y
CONFIG_VIDEO_DEV=m
# CONFIG_VIDEO_V4L2_SUBDEV_API is not set
CONFIG_VIDEO_V4L2=m
# CONFIG_VIDEO_ADV_DEBUG is not set
# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
CONFIG_VIDEO_TUNER=m
CONFIG_VIDEOBUF_GEN=m
CONFIG_VIDEOBUF_DMA_SG=m
CONFIG_VIDEOBUF_VMALLOC=m
CONFIG_VIDEOBUF_DVB=m
CONFIG_VIDEOBUF2_CORE=m
CONFIG_VIDEOBUF2_MEMOPS=m
CONFIG_VIDEOBUF2_DMA_CONTIG=m
CONFIG_VIDEOBUF2_VMALLOC=m
CONFIG_VIDEOBUF2_DMA_SG=m
CONFIG_VIDEOBUF2_DVB=m
CONFIG_DVB_CORE=m
CONFIG_DVB_NET=y
CONFIG_TTPCI_EEPROM=m
CONFIG_DVB_MAX_ADAPTERS=8
CONFIG_DVB_DYNAMIC_MINORS=y

#
# Media drivers
#
CONFIG_RC_CORE=m
CONFIG_RC_MAP=m
CONFIG_RC_DECODERS=y
CONFIG_LIRC=m
CONFIG_IR_LIRC_CODEC=m
CONFIG_IR_NEC_DECODER=m
CONFIG_IR_RC5_DECODER=m
CONFIG_IR_RC6_DECODER=m
CONFIG_IR_JVC_DECODER=m
CONFIG_IR_SONY_DECODER=m
CONFIG_IR_SANYO_DECODER=m
CONFIG_IR_SHARP_DECODER=m
CONFIG_IR_MCE_KBD_DECODER=m
CONFIG_IR_XMP_DECODER=m
CONFIG_RC_DEVICES=y
CONFIG_RC_ATI_REMOTE=m
CONFIG_IR_ENE=m
# CONFIG_IR_HIX5HD2 is not set
CONFIG_IR_IMON=m
CONFIG_IR_MCEUSB=m
CONFIG_IR_ITE_CIR=m
CONFIG_IR_FINTEK=m
CONFIG_IR_NUVOTON=m
CONFIG_IR_REDRAT3=m
CONFIG_IR_STREAMZAP=m
CONFIG_IR_WINBOND_CIR=m
CONFIG_IR_IGORPLUGUSB=m
CONFIG_IR_IGUANA=m
CONFIG_IR_TTUSBIR=m
CONFIG_RC_LOOPBACK=m
# CONFIG_IR_GPIO_CIR is not set
CONFIG_MEDIA_USB_SUPPORT=y

#
# Webcam devices
#
CONFIG_USB_VIDEO_CLASS=m
CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
CONFIG_USB_GSPCA=m
CONFIG_USB_M5602=m
CONFIG_USB_STV06XX=m
CONFIG_USB_GL860=m
CONFIG_USB_GSPCA_BENQ=m
CONFIG_USB_GSPCA_CONEX=m
CONFIG_USB_GSPCA_CPIA1=m
CONFIG_USB_GSPCA_DTCS033=m
CONFIG_USB_GSPCA_ETOMS=m
CONFIG_USB_GSPCA_FINEPIX=m
CONFIG_USB_GSPCA_JEILINJ=m
CONFIG_USB_GSPCA_JL2005BCD=m
CONFIG_USB_GSPCA_KINECT=m
CONFIG_USB_GSPCA_KONICA=m
CONFIG_USB_GSPCA_MARS=m
CONFIG_USB_GSPCA_MR97310A=m
CONFIG_USB_GSPCA_NW80X=m
CONFIG_USB_GSPCA_OV519=m
CONFIG_USB_GSPCA_OV534=m
CONFIG_USB_GSPCA_OV534_9=m
CONFIG_USB_GSPCA_PAC207=m
CONFIG_USB_GSPCA_PAC7302=m
CONFIG_USB_GSPCA_PAC7311=m
CONFIG_USB_GSPCA_SE401=m
CONFIG_USB_GSPCA_SN9C2028=m
CONFIG_USB_GSPCA_SN9C20X=m
CONFIG_USB_GSPCA_SONIXB=m
CONFIG_USB_GSPCA_SONIXJ=m
CONFIG_USB_GSPCA_SPCA500=m
CONFIG_USB_GSPCA_SPCA501=m
CONFIG_USB_GSPCA_SPCA505=m
CONFIG_USB_GSPCA_SPCA506=m
CONFIG_USB_GSPCA_SPCA508=m
CONFIG_USB_GSPCA_SPCA561=m
CONFIG_USB_GSPCA_SPCA1528=m
CONFIG_USB_GSPCA_SQ905=m
CONFIG_USB_GSPCA_SQ905C=m
CONFIG_USB_GSPCA_SQ930X=m
CONFIG_USB_GSPCA_STK014=m
CONFIG_USB_GSPCA_STK1135=m
CONFIG_USB_GSPCA_STV0680=m
CONFIG_USB_GSPCA_SUNPLUS=m
CONFIG_USB_GSPCA_T613=m
CONFIG_USB_GSPCA_TOPRO=m
# CONFIG_USB_GSPCA_TOUPTEK is not set
CONFIG_USB_GSPCA_TV8532=m
CONFIG_USB_GSPCA_VC032X=m
CONFIG_USB_GSPCA_VICAM=m
CONFIG_USB_GSPCA_XIRLINK_CIT=m
CONFIG_USB_GSPCA_ZC3XX=m
CONFIG_USB_PWC=m
# CONFIG_USB_PWC_DEBUG is not set
CONFIG_USB_PWC_INPUT_EVDEV=y
CONFIG_VIDEO_CPIA2=m
CONFIG_USB_ZR364XX=m
CONFIG_USB_STKWEBCAM=m
CONFIG_USB_S2255=m
CONFIG_VIDEO_USBTV=m

#
# Analog TV USB devices
#
CONFIG_VIDEO_PVRUSB2=m
CONFIG_VIDEO_PVRUSB2_SYSFS=y
CONFIG_VIDEO_PVRUSB2_DVB=y
# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set
CONFIG_VIDEO_HDPVR=m
CONFIG_VIDEO_USBVISION=m
CONFIG_VIDEO_STK1160_COMMON=m
CONFIG_VIDEO_STK1160_AC97=y
CONFIG_VIDEO_STK1160=m
# CONFIG_VIDEO_GO7007 is not set

#
# Analog/digital TV USB devices
#
CONFIG_VIDEO_AU0828=m
CONFIG_VIDEO_AU0828_V4L2=y
CONFIG_VIDEO_AU0828_RC=y
CONFIG_VIDEO_CX231XX=m
CONFIG_VIDEO_CX231XX_RC=y
CONFIG_VIDEO_CX231XX_ALSA=m
CONFIG_VIDEO_CX231XX_DVB=m
CONFIG_VIDEO_TM6000=m
CONFIG_VIDEO_TM6000_ALSA=m
CONFIG_VIDEO_TM6000_DVB=m

#
# Digital TV USB devices
#
CONFIG_DVB_USB=m
# CONFIG_DVB_USB_DEBUG is not set
CONFIG_DVB_USB_A800=m
CONFIG_DVB_USB_DIBUSB_MB=m
CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y
CONFIG_DVB_USB_DIBUSB_MC=m
CONFIG_DVB_USB_DIB0700=m
CONFIG_DVB_USB_UMT_010=m
CONFIG_DVB_USB_CXUSB=m
CONFIG_DVB_USB_M920X=m
CONFIG_DVB_USB_DIGITV=m
CONFIG_DVB_USB_VP7045=m
CONFIG_DVB_USB_VP702X=m
CONFIG_DVB_USB_GP8PSK=m
CONFIG_DVB_USB_NOVA_T_USB2=m
CONFIG_DVB_USB_TTUSB2=m
CONFIG_DVB_USB_DTT200U=m
CONFIG_DVB_USB_OPERA1=m
CONFIG_DVB_USB_AF9005=m
CONFIG_DVB_USB_AF9005_REMOTE=m
CONFIG_DVB_USB_PCTV452E=m
CONFIG_DVB_USB_DW2102=m
CONFIG_DVB_USB_CINERGY_T2=m
CONFIG_DVB_USB_DTV5100=m
CONFIG_DVB_USB_FRIIO=m
CONFIG_DVB_USB_AZ6027=m
CONFIG_DVB_USB_TECHNISAT_USB2=m
CONFIG_DVB_USB_V2=m
CONFIG_DVB_USB_AF9015=m
CONFIG_DVB_USB_AF9035=m
CONFIG_DVB_USB_ANYSEE=m
CONFIG_DVB_USB_AU6610=m
CONFIG_DVB_USB_AZ6007=m
CONFIG_DVB_USB_CE6230=m
CONFIG_DVB_USB_EC168=m
CONFIG_DVB_USB_GL861=m
CONFIG_DVB_USB_LME2510=m
CONFIG_DVB_USB_MXL111SF=m
CONFIG_DVB_USB_RTL28XXU=m
CONFIG_DVB_USB_DVBSKY=m
CONFIG_DVB_TTUSB_BUDGET=m
CONFIG_DVB_TTUSB_DEC=m
CONFIG_SMS_USB_DRV=m
CONFIG_DVB_B2C2_FLEXCOP_USB=m
# CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set
CONFIG_DVB_AS102=m

#
# Webcam, TV (analog/digital) USB devices
#
CONFIG_VIDEO_EM28XX=m
CONFIG_VIDEO_EM28XX_V4L2=m
CONFIG_VIDEO_EM28XX_ALSA=m
CONFIG_VIDEO_EM28XX_DVB=m
CONFIG_VIDEO_EM28XX_RC=m

#
# Software defined radio USB devices
#
CONFIG_USB_AIRSPY=m
CONFIG_USB_HACKRF=m
CONFIG_USB_MSI2500=m
CONFIG_MEDIA_PCI_SUPPORT=y

#
# Media capture support
#
CONFIG_VIDEO_MEYE=m

#
# Media capture/analog TV support
#
CONFIG_VIDEO_IVTV=m
CONFIG_VIDEO_IVTV_ALSA=m
CONFIG_VIDEO_FB_IVTV=m
CONFIG_VIDEO_ZORAN=m
CONFIG_VIDEO_ZORAN_DC30=m
CONFIG_VIDEO_ZORAN_ZR36060=m
CONFIG_VIDEO_ZORAN_BUZ=m
CONFIG_VIDEO_ZORAN_DC10=m
CONFIG_VIDEO_ZORAN_LML33=m
CONFIG_VIDEO_ZORAN_LML33R10=m
CONFIG_VIDEO_ZORAN_AVS6EYES=m
CONFIG_VIDEO_HEXIUM_GEMINI=m
CONFIG_VIDEO_HEXIUM_ORION=m
CONFIG_VIDEO_MXB=m
CONFIG_VIDEO_SOLO6X10=m
CONFIG_VIDEO_TW68=m

#
# Media capture/analog/hybrid TV support
#
CONFIG_VIDEO_CX18=m
CONFIG_VIDEO_CX18_ALSA=m
CONFIG_VIDEO_CX23885=m
CONFIG_MEDIA_ALTERA_CI=m
# CONFIG_VIDEO_CX25821 is not set
CONFIG_VIDEO_CX88=m
CONFIG_VIDEO_CX88_ALSA=m
CONFIG_VIDEO_CX88_BLACKBIRD=m
CONFIG_VIDEO_CX88_DVB=m
CONFIG_VIDEO_CX88_ENABLE_VP3054=y
CONFIG_VIDEO_CX88_VP3054=m
CONFIG_VIDEO_CX88_MPEG=m
CONFIG_VIDEO_BT848=m
CONFIG_DVB_BT8XX=m
CONFIG_VIDEO_SAA7134=m
CONFIG_VIDEO_SAA7134_ALSA=m
CONFIG_VIDEO_SAA7134_RC=y
CONFIG_VIDEO_SAA7134_DVB=m
CONFIG_VIDEO_SAA7164=m

#
# Media digital TV PCI Adapters
#
CONFIG_DVB_AV7110_IR=y
CONFIG_DVB_AV7110=m
CONFIG_DVB_AV7110_OSD=y
CONFIG_DVB_BUDGET_CORE=m
CONFIG_DVB_BUDGET=m
CONFIG_DVB_BUDGET_CI=m
CONFIG_DVB_BUDGET_AV=m
CONFIG_DVB_BUDGET_PATCH=m
CONFIG_DVB_B2C2_FLEXCOP_PCI=m
# CONFIG_DVB_B2C2_FLEXCOP_PCI_DEBUG is not set
CONFIG_DVB_PLUTO2=m
CONFIG_DVB_DM1105=m
CONFIG_DVB_PT1=m
CONFIG_DVB_PT3=m
CONFIG_MANTIS_CORE=m
CONFIG_DVB_MANTIS=m
CONFIG_DVB_HOPPER=m
CONFIG_DVB_NGENE=m
CONFIG_DVB_DDBRIDGE=m
CONFIG_DVB_SMIPCIE=m
CONFIG_V4L_PLATFORM_DRIVERS=y
CONFIG_VIDEO_CAFE_CCIC=m
CONFIG_VIDEO_VIA_CAMERA=m
# CONFIG_SOC_CAMERA is not set
CONFIG_V4L_MEM2MEM_DRIVERS=y
# CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set
# CONFIG_VIDEO_SH_VEU is not set
CONFIG_V4L_TEST_DRIVERS=y
CONFIG_VIDEO_VIVID=m
# CONFIG_VIDEO_VIM2M is not set

#
# Supported MMC/SDIO adapters
#
CONFIG_SMS_SDIO_DRV=m
CONFIG_RADIO_ADAPTERS=y
CONFIG_RADIO_TEA575X=m
CONFIG_RADIO_SI470X=y
CONFIG_USB_SI470X=m
# CONFIG_I2C_SI470X is not set
# CONFIG_RADIO_SI4713 is not set
CONFIG_USB_MR800=m
CONFIG_USB_DSBR=m
CONFIG_RADIO_MAXIRADIO=m
CONFIG_RADIO_SHARK=m
CONFIG_RADIO_SHARK2=m
CONFIG_USB_KEENE=m
CONFIG_USB_RAREMONO=m
CONFIG_USB_MA901=m
# CONFIG_RADIO_TEA5764 is not set
# CONFIG_RADIO_SAA7706H is not set
# CONFIG_RADIO_TEF6862 is not set
# CONFIG_RADIO_WL1273 is not set

#
# Texas Instruments WL128x FM driver (ST based)
#

#
# Supported FireWire (IEEE 1394) Adapters
#
CONFIG_DVB_FIREDTV=m
CONFIG_DVB_FIREDTV_INPUT=y
CONFIG_MEDIA_COMMON_OPTIONS=y

#
# common driver options
#
CONFIG_VIDEO_CX2341X=m
CONFIG_VIDEO_TVEEPROM=m
CONFIG_CYPRESS_FIRMWARE=m
CONFIG_DVB_B2C2_FLEXCOP=m
CONFIG_VIDEO_SAA7146=m
CONFIG_VIDEO_SAA7146_VV=m
CONFIG_SMS_SIANO_MDTV=m
CONFIG_SMS_SIANO_RC=y
# CONFIG_SMS_SIANO_DEBUGFS is not set

#
# Media ancillary drivers (tuners, sensors, i2c, frontends)
#
CONFIG_MEDIA_SUBDRV_AUTOSELECT=y
CONFIG_MEDIA_ATTACH=y
CONFIG_VIDEO_IR_I2C=m

#
# Audio decoders, processors and mixers
#
CONFIG_VIDEO_TVAUDIO=m
CONFIG_VIDEO_TDA7432=m
CONFIG_VIDEO_TDA9840=m
CONFIG_VIDEO_TEA6415C=m
CONFIG_VIDEO_TEA6420=m
CONFIG_VIDEO_MSP3400=m
CONFIG_VIDEO_CS5345=m
CONFIG_VIDEO_CS53L32A=m
CONFIG_VIDEO_WM8775=m
CONFIG_VIDEO_WM8739=m
CONFIG_VIDEO_VP27SMPX=m

#
# RDS decoders
#
CONFIG_VIDEO_SAA6588=m

#
# Video decoders
#
CONFIG_VIDEO_BT819=m
CONFIG_VIDEO_BT856=m
CONFIG_VIDEO_BT866=m
CONFIG_VIDEO_KS0127=m
CONFIG_VIDEO_SAA7110=m
CONFIG_VIDEO_SAA711X=m
CONFIG_VIDEO_TVP5150=m
CONFIG_VIDEO_VPX3220=m

#
# Video and audio decoders
#
CONFIG_VIDEO_SAA717X=m
CONFIG_VIDEO_CX25840=m

#
# Video encoders
#
CONFIG_VIDEO_SAA7127=m
CONFIG_VIDEO_SAA7185=m
CONFIG_VIDEO_ADV7170=m
CONFIG_VIDEO_ADV7175=m

#
# Camera sensor devices
#
CONFIG_VIDEO_OV7670=m
CONFIG_VIDEO_MT9V011=m

#
# Flash devices
#

#
# Video improvement chips
#
CONFIG_VIDEO_UPD64031A=m
CONFIG_VIDEO_UPD64083=m

#
# Audio/Video compression chips
#
CONFIG_VIDEO_SAA6752HS=m

#
# Miscellaneous helper chips
#
CONFIG_VIDEO_M52790=m

#
# Sensors used on soc_camera driver
#
CONFIG_MEDIA_TUNER=m
CONFIG_MEDIA_TUNER_SIMPLE=m
CONFIG_MEDIA_TUNER_TDA8290=m
CONFIG_MEDIA_TUNER_TDA827X=m
CONFIG_MEDIA_TUNER_TDA18271=m
CONFIG_MEDIA_TUNER_TDA9887=m
CONFIG_MEDIA_TUNER_TEA5761=m
CONFIG_MEDIA_TUNER_TEA5767=m
CONFIG_MEDIA_TUNER_MSI001=m
CONFIG_MEDIA_TUNER_MT20XX=m
CONFIG_MEDIA_TUNER_MT2060=m
CONFIG_MEDIA_TUNER_MT2063=m
CONFIG_MEDIA_TUNER_MT2266=m
CONFIG_MEDIA_TUNER_MT2131=m
CONFIG_MEDIA_TUNER_QT1010=m
CONFIG_MEDIA_TUNER_XC2028=m
CONFIG_MEDIA_TUNER_XC5000=m
CONFIG_MEDIA_TUNER_XC4000=m
CONFIG_MEDIA_TUNER_MXL5005S=m
CONFIG_MEDIA_TUNER_MXL5007T=m
CONFIG_MEDIA_TUNER_MC44S803=m
CONFIG_MEDIA_TUNER_MAX2165=m
CONFIG_MEDIA_TUNER_TDA18218=m
CONFIG_MEDIA_TUNER_FC0011=m
CONFIG_MEDIA_TUNER_FC0012=m
CONFIG_MEDIA_TUNER_FC0013=m
CONFIG_MEDIA_TUNER_TDA18212=m
CONFIG_MEDIA_TUNER_E4000=m
CONFIG_MEDIA_TUNER_FC2580=m
CONFIG_MEDIA_TUNER_M88RS6000T=m
CONFIG_MEDIA_TUNER_TUA9001=m
CONFIG_MEDIA_TUNER_SI2157=m
CONFIG_MEDIA_TUNER_IT913X=m
CONFIG_MEDIA_TUNER_R820T=m
CONFIG_MEDIA_TUNER_MXL301RF=m
CONFIG_MEDIA_TUNER_QM1D1C0042=m

#
# Multistandard (satellite) frontends
#
CONFIG_DVB_STB0899=m
CONFIG_DVB_STB6100=m
CONFIG_DVB_STV090x=m
CONFIG_DVB_STV6110x=m
CONFIG_DVB_M88DS3103=m

#
# Multistandard (cable + terrestrial) frontends
#
CONFIG_DVB_DRXK=m
CONFIG_DVB_TDA18271C2DD=m
CONFIG_DVB_SI2165=m

#
# DVB-S (satellite) frontends
#
CONFIG_DVB_CX24110=m
CONFIG_DVB_CX24123=m
CONFIG_DVB_MT312=m
CONFIG_DVB_ZL10036=m
CONFIG_DVB_ZL10039=m
CONFIG_DVB_S5H1420=m
CONFIG_DVB_STV0288=m
CONFIG_DVB_STB6000=m
CONFIG_DVB_STV0299=m
CONFIG_DVB_STV6110=m
CONFIG_DVB_STV0900=m
CONFIG_DVB_TDA8083=m
CONFIG_DVB_TDA10086=m
CONFIG_DVB_TDA8261=m
CONFIG_DVB_VES1X93=m
CONFIG_DVB_TUNER_ITD1000=m
CONFIG_DVB_TUNER_CX24113=m
CONFIG_DVB_TDA826X=m
CONFIG_DVB_TUA6100=m
CONFIG_DVB_CX24116=m
CONFIG_DVB_CX24117=m
CONFIG_DVB_SI21XX=m
CONFIG_DVB_TS2020=m
CONFIG_DVB_DS3000=m
CONFIG_DVB_MB86A16=m
CONFIG_DVB_TDA10071=m

#
# DVB-T (terrestrial) frontends
#
CONFIG_DVB_SP8870=m
CONFIG_DVB_SP887X=m
CONFIG_DVB_CX22700=m
CONFIG_DVB_CX22702=m
CONFIG_DVB_DRXD=m
CONFIG_DVB_L64781=m
CONFIG_DVB_TDA1004X=m
CONFIG_DVB_NXT6000=m
CONFIG_DVB_MT352=m
CONFIG_DVB_ZL10353=m
CONFIG_DVB_DIB3000MB=m
CONFIG_DVB_DIB3000MC=m
CONFIG_DVB_DIB7000M=m
CONFIG_DVB_DIB7000P=m
CONFIG_DVB_TDA10048=m
CONFIG_DVB_AF9013=m
CONFIG_DVB_EC100=m
CONFIG_DVB_STV0367=m
CONFIG_DVB_CXD2820R=m
CONFIG_DVB_RTL2830=m
CONFIG_DVB_RTL2832=m
CONFIG_DVB_RTL2832_SDR=m
CONFIG_DVB_SI2168=m
CONFIG_DVB_AS102_FE=m

#
# DVB-C (cable) frontends
#
CONFIG_DVB_VES1820=m
CONFIG_DVB_TDA10021=m
CONFIG_DVB_TDA10023=m
CONFIG_DVB_STV0297=m

#
# ATSC (North American/Korean Terrestrial/Cable DTV) frontends
#
CONFIG_DVB_NXT200X=m
CONFIG_DVB_OR51211=m
CONFIG_DVB_OR51132=m
CONFIG_DVB_BCM3510=m
CONFIG_DVB_LGDT330X=m
CONFIG_DVB_LGDT3305=m
CONFIG_DVB_LGDT3306A=m
CONFIG_DVB_LG2160=m
CONFIG_DVB_S5H1409=m
CONFIG_DVB_AU8522=m
CONFIG_DVB_AU8522_DTV=m
CONFIG_DVB_AU8522_V4L=m
CONFIG_DVB_S5H1411=m

#
# ISDB-T (terrestrial) frontends
#
CONFIG_DVB_S921=m
CONFIG_DVB_DIB8000=m
CONFIG_DVB_MB86A20S=m

#
# ISDB-S (satellite) & ISDB-T (terrestrial) frontends
#
CONFIG_DVB_TC90522=m

#
# Digital terrestrial only tuners/PLL
#
CONFIG_DVB_PLL=m
CONFIG_DVB_TUNER_DIB0070=m
CONFIG_DVB_TUNER_DIB0090=m

#
# SEC control devices for DVB-S
#
CONFIG_DVB_DRX39XYJ=m
CONFIG_DVB_LNBP21=m
CONFIG_DVB_LNBP22=m
CONFIG_DVB_ISL6405=m
CONFIG_DVB_ISL6421=m
CONFIG_DVB_ISL6423=m
CONFIG_DVB_A8293=m
CONFIG_DVB_SP2=m
CONFIG_DVB_LGS8GXX=m
CONFIG_DVB_ATBM8830=m
CONFIG_DVB_TDA665x=m
CONFIG_DVB_IX2505V=m
CONFIG_DVB_M88RS2000=m
CONFIG_DVB_AF9033=m

#
# Tools to develop new frontends
#
# CONFIG_DVB_DUMMY_FE is not set

#
# Graphics support
#
CONFIG_AGP=y
CONFIG_AGP_AMD64=y
CONFIG_AGP_INTEL=y
CONFIG_AGP_SIS=y
CONFIG_AGP_VIA=y
CONFIG_INTEL_GTT=y
CONFIG_VGA_ARB=y
CONFIG_VGA_ARB_MAX_GPUS=16
CONFIG_VGA_SWITCHEROO=y

#
# Direct Rendering Manager
#
CONFIG_DRM=m
CONFIG_DRM_MIPI_DSI=y
CONFIG_DRM_KMS_HELPER=m
CONFIG_DRM_KMS_FB_HELPER=y
CONFIG_DRM_LOAD_EDID_FIRMWARE=y
CONFIG_DRM_TTM=m

#
# I2C encoder or helper chips
#
# CONFIG_DRM_I2C_ADV7511 is not set
CONFIG_DRM_I2C_CH7006=m
CONFIG_DRM_I2C_SIL164=m
# CONFIG_DRM_I2C_NXP_TDA998X is not set
CONFIG_DRM_TDFX=m
CONFIG_DRM_R128=m
CONFIG_DRM_RADEON=m
# CONFIG_DRM_RADEON_USERPTR is not set
# CONFIG_DRM_RADEON_UMS is not set
CONFIG_DRM_NOUVEAU=m
CONFIG_NOUVEAU_DEBUG=5
CONFIG_NOUVEAU_DEBUG_DEFAULT=3
CONFIG_DRM_NOUVEAU_BACKLIGHT=y
# CONFIG_DRM_I810 is not set
CONFIG_DRM_I915=m
CONFIG_DRM_I915_KMS=y
CONFIG_DRM_I915_FBDEV=y
# CONFIG_DRM_I915_PRELIMINARY_HW_SUPPORT is not set
CONFIG_DRM_MGA=m
CONFIG_DRM_SIS=m
CONFIG_DRM_VIA=m
CONFIG_DRM_SAVAGE=m
CONFIG_DRM_VGEM=m
CONFIG_DRM_VMWGFX=m
CONFIG_DRM_VMWGFX_FBCON=y
CONFIG_DRM_GMA500=m
CONFIG_DRM_GMA600=y
CONFIG_DRM_GMA3600=y
CONFIG_DRM_UDL=m
CONFIG_DRM_AST=m
CONFIG_DRM_MGAG200=m
CONFIG_DRM_CIRRUS_QEMU=m
CONFIG_DRM_QXL=m
CONFIG_DRM_BOCHS=m
CONFIG_DRM_PANEL=y

#
# Display Panels
#
# CONFIG_HSA_AMD is not set

#
# Frame buffer Devices
#
CONFIG_FB=y
CONFIG_FIRMWARE_EDID=y
CONFIG_FB_CMDLINE=y
CONFIG_FB_DDC=m
CONFIG_FB_BOOT_VESA_SUPPORT=y
CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y
# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
CONFIG_FB_SYS_FILLRECT=y
CONFIG_FB_SYS_COPYAREA=y
CONFIG_FB_SYS_IMAGEBLIT=y
# CONFIG_FB_FOREIGN_ENDIAN is not set
CONFIG_FB_SYS_FOPS=y
CONFIG_FB_DEFERRED_IO=y
CONFIG_FB_HECUBA=m
CONFIG_FB_SVGALIB=m
# CONFIG_FB_MACMODES is not set
CONFIG_FB_BACKLIGHT=y
CONFIG_FB_MODE_HELPERS=y
CONFIG_FB_TILEBLITTING=y

#
# Frame buffer hardware drivers
#
CONFIG_FB_CIRRUS=m
CONFIG_FB_PM2=m
CONFIG_FB_PM2_FIFO_DISCONNECT=y
CONFIG_FB_CYBER2000=m
CONFIG_FB_CYBER2000_DDC=y
CONFIG_FB_ARC=m
# CONFIG_FB_ASILIANT is not set
# CONFIG_FB_IMSTT is not set
CONFIG_FB_VGA16=m
CONFIG_FB_UVESA=m
CONFIG_FB_VESA=y
CONFIG_FB_EFI=y
CONFIG_FB_N411=m
CONFIG_FB_HGA=m
# CONFIG_FB_OPENCORES is not set
# CONFIG_FB_S1D13XXX is not set
# CONFIG_FB_NVIDIA is not set
# CONFIG_FB_RIVA is not set
# CONFIG_FB_I740 is not set
CONFIG_FB_LE80578=m
CONFIG_FB_CARILLO_RANCH=m
# CONFIG_FB_INTEL is not set
CONFIG_FB_MATROX=m
CONFIG_FB_MATROX_MILLENIUM=y
CONFIG_FB_MATROX_MYSTIQUE=y
CONFIG_FB_MATROX_G=y
CONFIG_FB_MATROX_I2C=m
CONFIG_FB_MATROX_MAVEN=m
CONFIG_FB_RADEON=m
CONFIG_FB_RADEON_I2C=y
CONFIG_FB_RADEON_BACKLIGHT=y
# CONFIG_FB_RADEON_DEBUG is not set
CONFIG_FB_ATY128=m
CONFIG_FB_ATY128_BACKLIGHT=y
CONFIG_FB_ATY=m
CONFIG_FB_ATY_CT=y
# CONFIG_FB_ATY_GENERIC_LCD is not set
CONFIG_FB_ATY_GX=y
CONFIG_FB_ATY_BACKLIGHT=y
CONFIG_FB_S3=m
CONFIG_FB_S3_DDC=y
CONFIG_FB_SAVAGE=m
# CONFIG_FB_SAVAGE_I2C is not set
# CONFIG_FB_SAVAGE_ACCEL is not set
CONFIG_FB_SIS=m
CONFIG_FB_SIS_300=y
CONFIG_FB_SIS_315=y
CONFIG_FB_VIA=m
# CONFIG_FB_VIA_DIRECT_PROCFS is not set
CONFIG_FB_VIA_X_COMPATIBILITY=y
CONFIG_FB_NEOMAGIC=m
CONFIG_FB_KYRO=m
CONFIG_FB_3DFX=m
# CONFIG_FB_3DFX_ACCEL is not set
CONFIG_FB_3DFX_I2C=y
CONFIG_FB_VOODOO1=m
CONFIG_FB_VT8623=m
CONFIG_FB_TRIDENT=m
CONFIG_FB_ARK=m
CONFIG_FB_PM3=m
# CONFIG_FB_CARMINE is not set
CONFIG_FB_SMSCUFX=m
CONFIG_FB_UDL=m
CONFIG_FB_VIRTUAL=m
CONFIG_XEN_FBDEV_FRONTEND=y
# CONFIG_FB_METRONOME is not set
CONFIG_FB_MB862XX=m
CONFIG_FB_MB862XX_PCI_GDC=y
CONFIG_FB_MB862XX_I2C=y
# CONFIG_FB_BROADSHEET is not set
# CONFIG_FB_AUO_K190X is not set
CONFIG_FB_HYPERV=m
CONFIG_FB_SIMPLE=y
CONFIG_BACKLIGHT_LCD_SUPPORT=y
# CONFIG_LCD_CLASS_DEVICE is not set
CONFIG_BACKLIGHT_CLASS_DEVICE=y
# CONFIG_BACKLIGHT_GENERIC is not set
CONFIG_BACKLIGHT_APPLE=m
# CONFIG_BACKLIGHT_SAHARA is not set
# CONFIG_BACKLIGHT_ADP8860 is not set
# CONFIG_BACKLIGHT_ADP8870 is not set
# CONFIG_BACKLIGHT_LM3639 is not set
# CONFIG_BACKLIGHT_GPIO is not set
# CONFIG_BACKLIGHT_LV5207LP is not set
# CONFIG_BACKLIGHT_BD6107 is not set
CONFIG_VGASTATE=m
CONFIG_HDMI=y

#
# Console display driver support
#
CONFIG_VGA_CONSOLE=y
# CONFIG_VGACON_SOFT_SCROLLBACK is not set
CONFIG_DUMMY_CONSOLE=y
CONFIG_DUMMY_CONSOLE_COLUMNS=80
CONFIG_DUMMY_CONSOLE_ROWS=25
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
# CONFIG_LOGO is not set
CONFIG_SOUND=m
CONFIG_SOUND_OSS_CORE=y
# CONFIG_SOUND_OSS_CORE_PRECLAIM is not set
CONFIG_SND=m
CONFIG_SND_TIMER=m
CONFIG_SND_PCM=m
CONFIG_SND_HWDEP=m
CONFIG_SND_RAWMIDI=m
CONFIG_SND_COMPRESS_OFFLOAD=m
CONFIG_SND_JACK=y
CONFIG_SND_SEQUENCER=m
CONFIG_SND_SEQ_DUMMY=m
CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=m
CONFIG_SND_PCM_OSS=m
CONFIG_SND_PCM_OSS_PLUGINS=y
# CONFIG_SND_SEQUENCER_OSS is not set
CONFIG_SND_HRTIMER=m
CONFIG_SND_SEQ_HRTIMER_DEFAULT=y
CONFIG_SND_DYNAMIC_MINORS=y
CONFIG_SND_MAX_CARDS=32
CONFIG_SND_SUPPORT_OLD_API=y
CONFIG_SND_VERBOSE_PROCFS=y
# CONFIG_SND_VERBOSE_PRINTK is not set
# CONFIG_SND_DEBUG is not set
CONFIG_SND_VMASTER=y
CONFIG_SND_KCTL_JACK=y
CONFIG_SND_DMA_SGBUF=y
CONFIG_SND_RAWMIDI_SEQ=m
CONFIG_SND_OPL3_LIB_SEQ=m
# CONFIG_SND_OPL4_LIB_SEQ is not set
# CONFIG_SND_SBAWE_SEQ is not set
CONFIG_SND_EMU10K1_SEQ=m
CONFIG_SND_MPU401_UART=m
CONFIG_SND_OPL3_LIB=m
CONFIG_SND_VX_LIB=m
CONFIG_SND_AC97_CODEC=m
CONFIG_SND_DRIVERS=y
CONFIG_SND_PCSP=m
CONFIG_SND_DUMMY=m
CONFIG_SND_ALOOP=m
CONFIG_SND_VIRMIDI=m
CONFIG_SND_MTPAV=m
CONFIG_SND_MTS64=m
CONFIG_SND_SERIAL_U16550=m
CONFIG_SND_MPU401=m
CONFIG_SND_PORTMAN2X4=m
CONFIG_SND_AC97_POWER_SAVE=y
CONFIG_SND_AC97_POWER_SAVE_DEFAULT=0
CONFIG_SND_SB_COMMON=m
CONFIG_SND_PCI=y
CONFIG_SND_AD1889=m
CONFIG_SND_ALS300=m
CONFIG_SND_ALS4000=m
CONFIG_SND_ALI5451=m
CONFIG_SND_ASIHPI=m
CONFIG_SND_ATIIXP=m
CONFIG_SND_ATIIXP_MODEM=m
CONFIG_SND_AU8810=m
CONFIG_SND_AU8820=m
CONFIG_SND_AU8830=m
# CONFIG_SND_AW2 is not set
CONFIG_SND_AZT3328=m
CONFIG_SND_BT87X=m
# CONFIG_SND_BT87X_OVERCLOCK is not set
CONFIG_SND_CA0106=m
CONFIG_SND_CMIPCI=m
CONFIG_SND_OXYGEN_LIB=m
CONFIG_SND_OXYGEN=m
CONFIG_SND_CS4281=m
CONFIG_SND_CS46XX=m
CONFIG_SND_CS46XX_NEW_DSP=y
CONFIG_SND_CTXFI=m
CONFIG_SND_DARLA20=m
CONFIG_SND_GINA20=m
CONFIG_SND_LAYLA20=m
CONFIG_SND_DARLA24=m
CONFIG_SND_GINA24=m
CONFIG_SND_LAYLA24=m
CONFIG_SND_MONA=m
CONFIG_SND_MIA=m
CONFIG_SND_ECHO3G=m
CONFIG_SND_INDIGO=m
CONFIG_SND_INDIGOIO=m
CONFIG_SND_INDIGODJ=m
CONFIG_SND_INDIGOIOX=m
CONFIG_SND_INDIGODJX=m
CONFIG_SND_EMU10K1=m
CONFIG_SND_EMU10K1X=m
CONFIG_SND_ENS1370=m
CONFIG_SND_ENS1371=m
CONFIG_SND_ES1938=m
CONFIG_SND_ES1968=m
CONFIG_SND_ES1968_INPUT=y
CONFIG_SND_ES1968_RADIO=y
CONFIG_SND_FM801=m
CONFIG_SND_FM801_TEA575X_BOOL=y
CONFIG_SND_HDSP=m
CONFIG_SND_HDSPM=m
CONFIG_SND_ICE1712=m
CONFIG_SND_ICE1724=m
CONFIG_SND_INTEL8X0=m
CONFIG_SND_INTEL8X0M=m
CONFIG_SND_KORG1212=m
CONFIG_SND_LOLA=m
CONFIG_SND_LX6464ES=m
CONFIG_SND_MAESTRO3=m
CONFIG_SND_MAESTRO3_INPUT=y
CONFIG_SND_MIXART=m
CONFIG_SND_NM256=m
CONFIG_SND_PCXHR=m
CONFIG_SND_RIPTIDE=m
CONFIG_SND_RME32=m
CONFIG_SND_RME96=m
CONFIG_SND_RME9652=m
CONFIG_SND_SONICVIBES=m
CONFIG_SND_TRIDENT=m
CONFIG_SND_VIA82XX=m
CONFIG_SND_VIA82XX_MODEM=m
CONFIG_SND_VIRTUOSO=m
CONFIG_SND_VX222=m
CONFIG_SND_YMFPCI=m

#
# HD-Audio
#
CONFIG_SND_HDA=m
CONFIG_SND_HDA_INTEL=m
CONFIG_SND_HDA_DSP_LOADER=y
CONFIG_SND_HDA_PREALLOC_SIZE=64
CONFIG_SND_HDA_HWDEP=y
CONFIG_SND_HDA_RECONFIG=y
CONFIG_SND_HDA_INPUT_BEEP=y
CONFIG_SND_HDA_INPUT_BEEP_MODE=1
CONFIG_SND_HDA_INPUT_JACK=y
CONFIG_SND_HDA_PATCH_LOADER=y
CONFIG_SND_HDA_CODEC_REALTEK=m
CONFIG_SND_HDA_CODEC_ANALOG=m
CONFIG_SND_HDA_CODEC_SIGMATEL=m
CONFIG_SND_HDA_CODEC_VIA=m
CONFIG_SND_HDA_CODEC_HDMI=m
CONFIG_SND_HDA_I915=y
CONFIG_SND_HDA_CODEC_CIRRUS=m
CONFIG_SND_HDA_CODEC_CONEXANT=m
CONFIG_SND_HDA_CODEC_CA0110=m
CONFIG_SND_HDA_CODEC_CA0132=m
CONFIG_SND_HDA_CODEC_CA0132_DSP=y
CONFIG_SND_HDA_CODEC_CMEDIA=m
CONFIG_SND_HDA_CODEC_SI3054=m
CONFIG_SND_HDA_GENERIC=m
CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0
CONFIG_SND_HDA_CORE=m
CONFIG_SND_SPI=y
CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=m
CONFIG_SND_USB_UA101=m
CONFIG_SND_USB_USX2Y=m
CONFIG_SND_USB_CAIAQ=m
CONFIG_SND_USB_CAIAQ_INPUT=y
CONFIG_SND_USB_US122L=m
CONFIG_SND_USB_6FIRE=m
CONFIG_SND_USB_HIFACE=m
CONFIG_SND_BCD2000=m
CONFIG_SND_USB_LINE6=m
CONFIG_SND_USB_POD=m
CONFIG_SND_USB_PODHD=m
CONFIG_SND_USB_TONEPORT=m
CONFIG_SND_USB_VARIAX=m
CONFIG_SND_FIREWIRE=y
CONFIG_SND_FIREWIRE_LIB=m
CONFIG_SND_DICE=m
CONFIG_SND_OXFW=m
CONFIG_SND_ISIGHT=m
CONFIG_SND_SCS1X=m
CONFIG_SND_FIREWORKS=m
CONFIG_SND_BEBOB=m
CONFIG_SND_PCMCIA=y
CONFIG_SND_VXPOCKET=m
CONFIG_SND_PDAUDIOCF=m
CONFIG_SND_SOC=m
# CONFIG_SND_ATMEL_SOC is not set
# CONFIG_SND_DESIGNWARE_I2S is not set

#
# SoC Audio for Freescale CPUs
#

#
# Common SoC Audio options for Freescale CPUs:
#
# CONFIG_SND_SOC_FSL_ASRC is not set
# CONFIG_SND_SOC_FSL_SAI is not set
# CONFIG_SND_SOC_FSL_SSI is not set
# CONFIG_SND_SOC_FSL_SPDIF is not set
# CONFIG_SND_SOC_FSL_ESAI is not set
# CONFIG_SND_SOC_IMX_AUDMUX is not set
CONFIG_SND_SOC_INTEL_SST=m
CONFIG_SND_SOC_INTEL_SST_ACPI=m
CONFIG_SND_SOC_INTEL_HASWELL=m
CONFIG_SND_SOC_INTEL_BAYTRAIL=m
CONFIG_SND_SOC_INTEL_HASWELL_MACH=m
CONFIG_SND_SOC_INTEL_BYT_RT5640_MACH=m
CONFIG_SND_SOC_INTEL_BYT_MAX98090_MACH=m
CONFIG_SND_SOC_INTEL_BROADWELL_MACH=m
# CONFIG_SND_SOC_INTEL_BYTCR_RT5640_MACH is not set
# CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH is not set
# CONFIG_SND_SOC_INTEL_CHT_BSW_RT5645_MACH is not set
# CONFIG_SND_SOC_QCOM is not set
# CONFIG_SND_SOC_XTFPGA_I2S is not set
CONFIG_SND_SOC_I2C_AND_SPI=m

#
# CODEC drivers
#
# CONFIG_SND_SOC_ADAU1701 is not set
# CONFIG_SND_SOC_AK4104 is not set
# CONFIG_SND_SOC_AK4554 is not set
# CONFIG_SND_SOC_AK4642 is not set
# CONFIG_SND_SOC_AK5386 is not set
# CONFIG_SND_SOC_ALC5623 is not set
# CONFIG_SND_SOC_CS35L32 is not set
# CONFIG_SND_SOC_CS42L51_I2C is not set
# CONFIG_SND_SOC_CS42L52 is not set
# CONFIG_SND_SOC_CS42L56 is not set
# CONFIG_SND_SOC_CS42L73 is not set
# CONFIG_SND_SOC_CS4265 is not set
# CONFIG_SND_SOC_CS4270 is not set
# CONFIG_SND_SOC_CS4271_I2C is not set
# CONFIG_SND_SOC_CS4271_SPI is not set
# CONFIG_SND_SOC_CS42XX8_I2C is not set
# CONFIG_SND_SOC_HDMI_CODEC is not set
# CONFIG_SND_SOC_ES8328 is not set
CONFIG_SND_SOC_MAX98090=m
# CONFIG_SND_SOC_PCM1681 is not set
# CONFIG_SND_SOC_PCM1792A is not set
# CONFIG_SND_SOC_PCM512x_I2C is not set
# CONFIG_SND_SOC_PCM512x_SPI is not set
CONFIG_SND_SOC_RL6231=m
CONFIG_SND_SOC_RT286=m
# CONFIG_SND_SOC_RT5631 is not set
CONFIG_SND_SOC_RT5640=m
# CONFIG_SND_SOC_RT5677_SPI is not set
# CONFIG_SND_SOC_SGTL5000 is not set
# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set
# CONFIG_SND_SOC_SPDIF is not set
# CONFIG_SND_SOC_SSM2602_SPI is not set
# CONFIG_SND_SOC_SSM2602_I2C is not set
# CONFIG_SND_SOC_SSM4567 is not set
# CONFIG_SND_SOC_STA32X is not set
# CONFIG_SND_SOC_STA350 is not set
# CONFIG_SND_SOC_TAS2552 is not set
# CONFIG_SND_SOC_TAS5086 is not set
# CONFIG_SND_SOC_TFA9879 is not set
# CONFIG_SND_SOC_TLV320AIC23_I2C is not set
# CONFIG_SND_SOC_TLV320AIC23_SPI is not set
# CONFIG_SND_SOC_TLV320AIC31XX is not set
# CONFIG_SND_SOC_TLV320AIC3X is not set
# CONFIG_SND_SOC_TS3A227E is not set
# CONFIG_SND_SOC_WM8510 is not set
# CONFIG_SND_SOC_WM8523 is not set
# CONFIG_SND_SOC_WM8580 is not set
# CONFIG_SND_SOC_WM8711 is not set
# CONFIG_SND_SOC_WM8728 is not set
# CONFIG_SND_SOC_WM8731 is not set
# CONFIG_SND_SOC_WM8737 is not set
# CONFIG_SND_SOC_WM8741 is not set
# CONFIG_SND_SOC_WM8750 is not set
# CONFIG_SND_SOC_WM8753 is not set
# CONFIG_SND_SOC_WM8770 is not set
# CONFIG_SND_SOC_WM8776 is not set
# CONFIG_SND_SOC_WM8804_I2C is not set
# CONFIG_SND_SOC_WM8804_SPI is not set
# CONFIG_SND_SOC_WM8903 is not set
# CONFIG_SND_SOC_WM8962 is not set
# CONFIG_SND_SOC_WM8978 is not set
# CONFIG_SND_SOC_TPA6130A2 is not set
# CONFIG_SND_SIMPLE_CARD is not set
# CONFIG_SOUND_PRIME is not set
CONFIG_AC97_BUS=m

#
# HID support
#
CONFIG_HID=m
CONFIG_HID_BATTERY_STRENGTH=y
CONFIG_HIDRAW=y
CONFIG_UHID=m
CONFIG_HID_GENERIC=m

#
# Special HID drivers
#
CONFIG_HID_A4TECH=m
CONFIG_HID_ACRUX=m
CONFIG_HID_ACRUX_FF=y
CONFIG_HID_APPLE=m
CONFIG_HID_APPLEIR=m
CONFIG_HID_AUREAL=m
CONFIG_HID_BELKIN=m
# CONFIG_HID_BETOP_FF is not set
CONFIG_HID_CHERRY=m
CONFIG_HID_CHICONY=m
CONFIG_HID_PRODIKEYS=m
CONFIG_HID_CP2112=m
CONFIG_HID_CYPRESS=m
CONFIG_HID_DRAGONRISE=m
CONFIG_DRAGONRISE_FF=y
CONFIG_HID_EMS_FF=m
CONFIG_HID_ELECOM=m
CONFIG_HID_ELO=m
CONFIG_HID_EZKEY=m
CONFIG_HID_HOLTEK=m
CONFIG_HOLTEK_FF=y
# CONFIG_HID_GT683R is not set
CONFIG_HID_KEYTOUCH=m
CONFIG_HID_KYE=m
CONFIG_HID_UCLOGIC=m
CONFIG_HID_WALTOP=m
CONFIG_HID_GYRATION=m
CONFIG_HID_ICADE=m
CONFIG_HID_TWINHAN=m
CONFIG_HID_KENSINGTON=m
CONFIG_HID_LCPOWER=m
CONFIG_HID_LENOVO=m
CONFIG_HID_LOGITECH=m
CONFIG_HID_LOGITECH_DJ=m
CONFIG_HID_LOGITECH_HIDPP=m
CONFIG_LOGITECH_FF=y
CONFIG_LOGIRUMBLEPAD2_FF=y
CONFIG_LOGIG940_FF=y
CONFIG_LOGIWHEELS_FF=y
CONFIG_HID_MAGICMOUSE=m
CONFIG_HID_MICROSOFT=m
CONFIG_HID_MONTEREY=m
CONFIG_HID_MULTITOUCH=m
CONFIG_HID_NTRIG=m
CONFIG_HID_ORTEK=m
CONFIG_HID_PANTHERLORD=m
CONFIG_PANTHERLORD_FF=y
CONFIG_HID_PENMOUNT=m
CONFIG_HID_PETALYNX=m
CONFIG_HID_PICOLCD=m
CONFIG_HID_PICOLCD_FB=y
CONFIG_HID_PICOLCD_BACKLIGHT=y
CONFIG_HID_PICOLCD_LEDS=y
CONFIG_HID_PICOLCD_CIR=y
# CONFIG_HID_PLANTRONICS is not set
CONFIG_HID_PRIMAX=m
CONFIG_HID_ROCCAT=m
CONFIG_HID_SAITEK=m
CONFIG_HID_SAMSUNG=m
CONFIG_HID_SONY=m
CONFIG_SONY_FF=y
CONFIG_HID_SPEEDLINK=m
CONFIG_HID_STEELSERIES=m
CONFIG_HID_SUNPLUS=m
CONFIG_HID_RMI=m
CONFIG_HID_GREENASIA=m
CONFIG_GREENASIA_FF=y
CONFIG_HID_HYPERV_MOUSE=m
CONFIG_HID_SMARTJOYPLUS=m
CONFIG_SMARTJOYPLUS_FF=y
CONFIG_HID_TIVO=m
CONFIG_HID_TOPSEED=m
CONFIG_HID_THINGM=m
CONFIG_HID_THRUSTMASTER=m
CONFIG_THRUSTMASTER_FF=y
CONFIG_HID_WACOM=m
CONFIG_HID_WIIMOTE=m
CONFIG_HID_XINMO=m
CONFIG_HID_ZEROPLUS=m
CONFIG_ZEROPLUS_FF=y
CONFIG_HID_ZYDACRON=m
CONFIG_HID_SENSOR_HUB=m
# CONFIG_HID_SENSOR_CUSTOM_SENSOR is not set

#
# USB HID support
#
CONFIG_USB_HID=m
CONFIG_HID_PID=y
CONFIG_USB_HIDDEV=y

#
# USB HID Boot Protocol drivers
#
# CONFIG_USB_KBD is not set
# CONFIG_USB_MOUSE is not set

#
# I2C HID support
#
CONFIG_I2C_HID=m
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
CONFIG_USB_SUPPORT=y
CONFIG_USB_COMMON=m
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB=m
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y

#
# Miscellaneous USB options
#
CONFIG_USB_DEFAULT_PERSIST=y
CONFIG_USB_DYNAMIC_MINORS=y
# CONFIG_USB_OTG is not set
# CONFIG_USB_OTG_WHITELIST is not set
# CONFIG_USB_OTG_BLACKLIST_HUB is not set
# CONFIG_USB_OTG_FSM is not set
CONFIG_USB_MON=m
CONFIG_USB_WUSB=m
CONFIG_USB_WUSB_CBAF=m
# CONFIG_USB_WUSB_CBAF_DEBUG is not set

#
# USB Host Controller Drivers
#
# CONFIG_USB_C67X00_HCD is not set
CONFIG_USB_XHCI_HCD=m
CONFIG_USB_XHCI_PCI=m
CONFIG_USB_EHCI_HCD=m
CONFIG_USB_EHCI_ROOT_HUB_TT=y
CONFIG_USB_EHCI_TT_NEWSCHED=y
CONFIG_USB_EHCI_PCI=m
# CONFIG_USB_EHCI_HCD_PLATFORM is not set
# CONFIG_USB_OXU210HP_HCD is not set
# CONFIG_USB_ISP116X_HCD is not set
# CONFIG_USB_ISP1362_HCD is not set
# CONFIG_USB_FUSBH200_HCD is not set
# CONFIG_USB_FOTG210_HCD is not set
# CONFIG_USB_MAX3421_HCD is not set
CONFIG_USB_OHCI_HCD=m
CONFIG_USB_OHCI_HCD_PCI=m
# CONFIG_USB_OHCI_HCD_SSB is not set
# CONFIG_USB_OHCI_HCD_PLATFORM is not set
CONFIG_USB_UHCI_HCD=m
CONFIG_USB_U132_HCD=m
CONFIG_USB_SL811_HCD=m
# CONFIG_USB_SL811_HCD_ISO is not set
CONFIG_USB_SL811_CS=m
# CONFIG_USB_R8A66597_HCD is not set
CONFIG_USB_WHCI_HCD=m
CONFIG_USB_HWA_HCD=m
# CONFIG_USB_HCD_BCMA is not set
# CONFIG_USB_HCD_SSB is not set
# CONFIG_USB_HCD_TEST_MODE is not set

#
# USB Device Class drivers
#
CONFIG_USB_ACM=m
CONFIG_USB_PRINTER=m
CONFIG_USB_WDM=m
CONFIG_USB_TMC=m

#
# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
#

#
# also be needed; see USB_STORAGE Help for more info
#
CONFIG_USB_STORAGE=m
# CONFIG_USB_STORAGE_DEBUG is not set
CONFIG_USB_STORAGE_REALTEK=m
CONFIG_REALTEK_AUTOPM=y
CONFIG_USB_STORAGE_DATAFAB=m
CONFIG_USB_STORAGE_FREECOM=m
CONFIG_USB_STORAGE_ISD200=m
CONFIG_USB_STORAGE_USBAT=m
CONFIG_USB_STORAGE_SDDR09=m
CONFIG_USB_STORAGE_SDDR55=m
CONFIG_USB_STORAGE_JUMPSHOT=m
CONFIG_USB_STORAGE_ALAUDA=m
CONFIG_USB_STORAGE_ONETOUCH=m
CONFIG_USB_STORAGE_KARMA=m
CONFIG_USB_STORAGE_CYPRESS_ATACB=m
CONFIG_USB_STORAGE_ENE_UB6250=m
CONFIG_USB_UAS=m

#
# USB Imaging devices
#
CONFIG_USB_MDC800=m
CONFIG_USB_MICROTEK=m
CONFIG_USBIP_CORE=m
CONFIG_USBIP_VHCI_HCD=m
CONFIG_USBIP_HOST=m
# CONFIG_USBIP_DEBUG is not set
# CONFIG_USB_MUSB_HDRC is not set
# CONFIG_USB_DWC3 is not set
# CONFIG_USB_DWC2 is not set
# CONFIG_USB_CHIPIDEA is not set
# CONFIG_USB_ISP1760 is not set

#
# USB port drivers
#
CONFIG_USB_USS720=m
CONFIG_USB_SERIAL=m
CONFIG_USB_SERIAL_GENERIC=y
CONFIG_USB_SERIAL_SIMPLE=m
CONFIG_USB_SERIAL_AIRCABLE=m
CONFIG_USB_SERIAL_ARK3116=m
CONFIG_USB_SERIAL_BELKIN=m
CONFIG_USB_SERIAL_CH341=m
CONFIG_USB_SERIAL_WHITEHEAT=m
CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
CONFIG_USB_SERIAL_CP210X=m
CONFIG_USB_SERIAL_CYPRESS_M8=m
CONFIG_USB_SERIAL_EMPEG=m
CONFIG_USB_SERIAL_FTDI_SIO=m
CONFIG_USB_SERIAL_VISOR=m
CONFIG_USB_SERIAL_IPAQ=m
CONFIG_USB_SERIAL_IR=m
CONFIG_USB_SERIAL_EDGEPORT=m
CONFIG_USB_SERIAL_EDGEPORT_TI=m
CONFIG_USB_SERIAL_F81232=m
CONFIG_USB_SERIAL_GARMIN=m
CONFIG_USB_SERIAL_IPW=m
CONFIG_USB_SERIAL_IUU=m
CONFIG_USB_SERIAL_KEYSPAN_PDA=m
CONFIG_USB_SERIAL_KEYSPAN=m
CONFIG_USB_SERIAL_KLSI=m
CONFIG_USB_SERIAL_KOBIL_SCT=m
CONFIG_USB_SERIAL_MCT_U232=m
CONFIG_USB_SERIAL_METRO=m
CONFIG_USB_SERIAL_MOS7720=m
CONFIG_USB_SERIAL_MOS7715_PARPORT=y
CONFIG_USB_SERIAL_MOS7840=m
CONFIG_USB_SERIAL_MXUPORT=m
CONFIG_USB_SERIAL_NAVMAN=m
CONFIG_USB_SERIAL_PL2303=m
CONFIG_USB_SERIAL_OTI6858=m
CONFIG_USB_SERIAL_QCAUX=m
CONFIG_USB_SERIAL_QUALCOMM=m
CONFIG_USB_SERIAL_SPCP8X5=m
CONFIG_USB_SERIAL_SAFE=m
# CONFIG_USB_SERIAL_SAFE_PADDED is not set
CONFIG_USB_SERIAL_SIERRAWIRELESS=m
CONFIG_USB_SERIAL_SYMBOL=m
CONFIG_USB_SERIAL_TI=m
CONFIG_USB_SERIAL_CYBERJACK=m
CONFIG_USB_SERIAL_XIRCOM=m
CONFIG_USB_SERIAL_WWAN=m
CONFIG_USB_SERIAL_OPTION=m
CONFIG_USB_SERIAL_OMNINET=m
CONFIG_USB_SERIAL_OPTICON=m
CONFIG_USB_SERIAL_XSENS_MT=m
CONFIG_USB_SERIAL_WISHBONE=m
CONFIG_USB_SERIAL_SSU100=m
CONFIG_USB_SERIAL_QT2=m
CONFIG_USB_SERIAL_DEBUG=m

#
# USB Miscellaneous drivers
#
CONFIG_USB_EMI62=m
CONFIG_USB_EMI26=m
CONFIG_USB_ADUTUX=m
CONFIG_USB_SEVSEG=m
CONFIG_USB_RIO500=m
CONFIG_USB_LEGOTOWER=m
CONFIG_USB_LCD=m
CONFIG_USB_LED=m
CONFIG_USB_CYPRESS_CY7C63=m
CONFIG_USB_CYTHERM=m
CONFIG_USB_IDMOUSE=m
CONFIG_USB_FTDI_ELAN=m
CONFIG_USB_APPLEDISPLAY=m
CONFIG_USB_SISUSBVGA=m
CONFIG_USB_SISUSBVGA_CON=y
CONFIG_USB_LD=m
CONFIG_USB_TRANCEVIBRATOR=m
CONFIG_USB_IOWARRIOR=m
CONFIG_USB_TEST=m
CONFIG_USB_EHSET_TEST_FIXTURE=m
CONFIG_USB_ISIGHTFW=m
CONFIG_USB_YUREX=m
CONFIG_USB_EZUSB_FX2=m
# CONFIG_USB_HSIC_USB3503 is not set
# CONFIG_USB_LINK_LAYER_TEST is not set
# CONFIG_USB_CHAOSKEY is not set
CONFIG_USB_ATM=m
CONFIG_USB_SPEEDTOUCH=m
CONFIG_USB_CXACRU=m
CONFIG_USB_UEAGLEATM=m
CONFIG_USB_XUSBATM=m

#
# USB Physical Layer drivers
#
# CONFIG_USB_PHY is not set
# CONFIG_NOP_USB_XCEIV is not set
# CONFIG_USB_GPIO_VBUS is not set
# CONFIG_USB_ISP1301 is not set
CONFIG_USB_GADGET=m
# CONFIG_USB_GADGET_DEBUG is not set
# CONFIG_USB_GADGET_DEBUG_FILES is not set
# CONFIG_USB_GADGET_DEBUG_FS is not set
CONFIG_USB_GADGET_VBUS_DRAW=2
CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2

#
# USB Peripheral Controller
#
# CONFIG_USB_FOTG210_UDC is not set
# CONFIG_USB_GR_UDC is not set
# CONFIG_USB_R8A66597 is not set
# CONFIG_USB_PXA27X is not set
# CONFIG_USB_MV_UDC is not set
# CONFIG_USB_MV_U3D is not set
# CONFIG_USB_M66592 is not set
# CONFIG_USB_BDC_UDC is not set
# CONFIG_USB_AMD5536UDC is not set
# CONFIG_USB_NET2272 is not set
CONFIG_USB_NET2280=m
# CONFIG_USB_GOKU is not set
CONFIG_USB_EG20T=m
# CONFIG_USB_DUMMY_HCD is not set
# CONFIG_USB_CONFIGFS is not set
# CONFIG_USB_ZERO is not set
# CONFIG_USB_AUDIO is not set
# CONFIG_USB_ETH is not set
# CONFIG_USB_G_NCM is not set
# CONFIG_USB_GADGETFS is not set
# CONFIG_USB_FUNCTIONFS is not set
# CONFIG_USB_MASS_STORAGE is not set
# CONFIG_USB_GADGET_TARGET is not set
# CONFIG_USB_G_SERIAL is not set
# CONFIG_USB_MIDI_GADGET is not set
# CONFIG_USB_G_PRINTER is not set
# CONFIG_USB_CDC_COMPOSITE is not set
# CONFIG_USB_G_NOKIA is not set
# CONFIG_USB_G_ACM_MS is not set
# CONFIG_USB_G_MULTI is not set
# CONFIG_USB_G_HID is not set
# CONFIG_USB_G_DBGP is not set
# CONFIG_USB_G_WEBCAM is not set
CONFIG_USB_LED_TRIG=y
CONFIG_UWB=m
CONFIG_UWB_HWA=m
CONFIG_UWB_WHCI=m
CONFIG_UWB_I1480U=m
CONFIG_MMC=m
# CONFIG_MMC_DEBUG is not set
# CONFIG_MMC_CLKGATE is not set

#
# MMC/SD/SDIO Card Drivers
#
CONFIG_MMC_BLOCK=m
CONFIG_MMC_BLOCK_MINORS=256
CONFIG_MMC_BLOCK_BOUNCE=y
CONFIG_SDIO_UART=m
# CONFIG_MMC_TEST is not set

#
# MMC/SD/SDIO Host Controller Drivers
#
CONFIG_MMC_SDHCI=m
CONFIG_MMC_SDHCI_PCI=m
CONFIG_MMC_RICOH_MMC=y
CONFIG_MMC_SDHCI_ACPI=m
# CONFIG_MMC_SDHCI_PLTFM is not set
CONFIG_MMC_WBSD=m
CONFIG_MMC_TIFM_SD=m
# CONFIG_MMC_SPI is not set
CONFIG_MMC_SDRICOH_CS=m
CONFIG_MMC_CB710=m
CONFIG_MMC_VIA_SDMMC=m
CONFIG_MMC_VUB300=m
CONFIG_MMC_USHC=m
# CONFIG_MMC_USDHI6ROL0 is not set
CONFIG_MMC_REALTEK_PCI=m
CONFIG_MMC_REALTEK_USB=m
CONFIG_MMC_TOSHIBA_PCI=m
CONFIG_MEMSTICK=m
# CONFIG_MEMSTICK_DEBUG is not set

#
# MemoryStick drivers
#
# CONFIG_MEMSTICK_UNSAFE_RESUME is not set
CONFIG_MSPRO_BLOCK=m
# CONFIG_MS_BLOCK is not set

#
# MemoryStick Host Controller Drivers
#
CONFIG_MEMSTICK_TIFM_MS=m
CONFIG_MEMSTICK_JMICRON_38X=m
CONFIG_MEMSTICK_R592=m
CONFIG_MEMSTICK_REALTEK_PCI=m
CONFIG_MEMSTICK_REALTEK_USB=m
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y
# CONFIG_LEDS_CLASS_FLASH is not set

#
# LED drivers
#
# CONFIG_LEDS_LM3530 is not set
# CONFIG_LEDS_LM3642 is not set
# CONFIG_LEDS_PCA9532 is not set
# CONFIG_LEDS_GPIO is not set
CONFIG_LEDS_LP3944=m
# CONFIG_LEDS_LP5521 is not set
# CONFIG_LEDS_LP5523 is not set
# CONFIG_LEDS_LP5562 is not set
# CONFIG_LEDS_LP8501 is not set
# CONFIG_LEDS_LP8860 is not set
CONFIG_LEDS_CLEVO_MAIL=m
CONFIG_LEDS_PCA955X=m
# CONFIG_LEDS_PCA963X is not set
CONFIG_LEDS_DAC124S085=m
CONFIG_LEDS_BD2802=m
CONFIG_LEDS_INTEL_SS4200=m
CONFIG_LEDS_LT3593=m
CONFIG_LEDS_DELL_NETBOOKS=m
# CONFIG_LEDS_TCA6507 is not set
# CONFIG_LEDS_LM355x is not set
CONFIG_LEDS_MENF21BMC=m

#
# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM)
#
# CONFIG_LEDS_BLINKM is not set
# CONFIG_LEDS_PM8941_WLED is not set

#
# LED Triggers
#
CONFIG_LEDS_TRIGGERS=y
CONFIG_LEDS_TRIGGER_TIMER=m
CONFIG_LEDS_TRIGGER_ONESHOT=m
CONFIG_LEDS_TRIGGER_HEARTBEAT=m
CONFIG_LEDS_TRIGGER_BACKLIGHT=m
CONFIG_LEDS_TRIGGER_CPU=y
CONFIG_LEDS_TRIGGER_GPIO=m
CONFIG_LEDS_TRIGGER_DEFAULT_ON=m

#
# iptables trigger is under Netfilter config (LED target)
#
CONFIG_LEDS_TRIGGER_TRANSIENT=m
CONFIG_LEDS_TRIGGER_CAMERA=m
CONFIG_ACCESSIBILITY=y
CONFIG_A11Y_BRAILLE_CONSOLE=y
CONFIG_INFINIBAND=m
CONFIG_INFINIBAND_USER_MAD=m
CONFIG_INFINIBAND_USER_ACCESS=m
CONFIG_INFINIBAND_USER_MEM=y
CONFIG_INFINIBAND_ON_DEMAND_PAGING=y
CONFIG_INFINIBAND_ADDR_TRANS=y
CONFIG_INFINIBAND_MTHCA=m
CONFIG_INFINIBAND_MTHCA_DEBUG=y
CONFIG_INFINIBAND_IPATH=m
CONFIG_INFINIBAND_QIB=m
CONFIG_INFINIBAND_QIB_DCA=y
CONFIG_INFINIBAND_AMSO1100=m
# CONFIG_INFINIBAND_AMSO1100_DEBUG is not set
CONFIG_INFINIBAND_CXGB3=m
# CONFIG_INFINIBAND_CXGB3_DEBUG is not set
CONFIG_INFINIBAND_CXGB4=m
CONFIG_MLX4_INFINIBAND=m
CONFIG_MLX5_INFINIBAND=m
CONFIG_INFINIBAND_NES=m
# CONFIG_INFINIBAND_NES_DEBUG is not set
CONFIG_INFINIBAND_OCRDMA=m
# CONFIG_INFINIBAND_USNIC is not set
CONFIG_INFINIBAND_IPOIB=m
CONFIG_INFINIBAND_IPOIB_CM=y
CONFIG_INFINIBAND_IPOIB_DEBUG=y
# CONFIG_INFINIBAND_IPOIB_DEBUG_DATA is not set
CONFIG_INFINIBAND_SRP=m
CONFIG_INFINIBAND_SRPT=m
CONFIG_INFINIBAND_ISER=m
CONFIG_INFINIBAND_ISERT=m
CONFIG_EDAC=y
CONFIG_EDAC_LEGACY_SYSFS=y
# CONFIG_EDAC_DEBUG is not set
CONFIG_EDAC_DECODE_MCE=m
# CONFIG_EDAC_MCE_INJ is not set
CONFIG_EDAC_MM_EDAC=m
CONFIG_EDAC_AMD64=m
# CONFIG_EDAC_AMD64_ERROR_INJECTION is not set
CONFIG_EDAC_E752X=m
CONFIG_EDAC_I82975X=m
CONFIG_EDAC_I3000=m
CONFIG_EDAC_I3200=m
CONFIG_EDAC_IE31200=m
CONFIG_EDAC_X38=m
CONFIG_EDAC_I5400=m
CONFIG_EDAC_I7CORE=m
CONFIG_EDAC_I5000=m
CONFIG_EDAC_I5100=m
CONFIG_EDAC_I7300=m
CONFIG_EDAC_SBRIDGE=m
CONFIG_RTC_LIB=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_HCTOSYS=y
CONFIG_RTC_SYSTOHC=y
CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
# CONFIG_RTC_DEBUG is not set

#
# RTC interfaces
#
CONFIG_RTC_INTF_SYSFS=y
CONFIG_RTC_INTF_PROC=y
CONFIG_RTC_INTF_DEV=y
# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
# CONFIG_RTC_DRV_TEST is not set

#
# I2C RTC drivers
#
# CONFIG_RTC_DRV_ABB5ZES3 is not set
# CONFIG_RTC_DRV_ABX80X is not set
# CONFIG_RTC_DRV_DS1307 is not set
# CONFIG_RTC_DRV_DS1374 is not set
# CONFIG_RTC_DRV_DS1672 is not set
# CONFIG_RTC_DRV_DS3232 is not set
# CONFIG_RTC_DRV_MAX6900 is not set
# CONFIG_RTC_DRV_RS5C372 is not set
# CONFIG_RTC_DRV_ISL1208 is not set
# CONFIG_RTC_DRV_ISL12022 is not set
# CONFIG_RTC_DRV_ISL12057 is not set
# CONFIG_RTC_DRV_X1205 is not set
# CONFIG_RTC_DRV_PCF2127 is not set
# CONFIG_RTC_DRV_PCF8523 is not set
# CONFIG_RTC_DRV_PCF8563 is not set
# CONFIG_RTC_DRV_PCF85063 is not set
# CONFIG_RTC_DRV_PCF8583 is not set
# CONFIG_RTC_DRV_M41T80 is not set
# CONFIG_RTC_DRV_BQ32K is not set
# CONFIG_RTC_DRV_S35390A is not set
# CONFIG_RTC_DRV_FM3130 is not set
# CONFIG_RTC_DRV_RX8581 is not set
# CONFIG_RTC_DRV_RX8025 is not set
# CONFIG_RTC_DRV_EM3027 is not set
# CONFIG_RTC_DRV_RV3029C2 is not set

#
# SPI RTC drivers
#
# CONFIG_RTC_DRV_M41T93 is not set
# CONFIG_RTC_DRV_M41T94 is not set
# CONFIG_RTC_DRV_DS1305 is not set
# CONFIG_RTC_DRV_DS1343 is not set
# CONFIG_RTC_DRV_DS1347 is not set
# CONFIG_RTC_DRV_DS1390 is not set
# CONFIG_RTC_DRV_MAX6902 is not set
# CONFIG_RTC_DRV_R9701 is not set
# CONFIG_RTC_DRV_RS5C348 is not set
# CONFIG_RTC_DRV_DS3234 is not set
# CONFIG_RTC_DRV_PCF2123 is not set
# CONFIG_RTC_DRV_RX4581 is not set
# CONFIG_RTC_DRV_MCP795 is not set

#
# Platform RTC drivers
#
CONFIG_RTC_DRV_CMOS=y
# CONFIG_RTC_DRV_DS1286 is not set
# CONFIG_RTC_DRV_DS1511 is not set
# CONFIG_RTC_DRV_DS1553 is not set
# CONFIG_RTC_DRV_DS1685_FAMILY is not set
# CONFIG_RTC_DRV_DS1742 is not set
# CONFIG_RTC_DRV_DS2404 is not set
# CONFIG_RTC_DRV_STK17TA8 is not set
# CONFIG_RTC_DRV_M48T86 is not set
# CONFIG_RTC_DRV_M48T35 is not set
# CONFIG_RTC_DRV_M48T59 is not set
# CONFIG_RTC_DRV_MSM6242 is not set
# CONFIG_RTC_DRV_BQ4802 is not set
# CONFIG_RTC_DRV_RP5C01 is not set
# CONFIG_RTC_DRV_V3020 is not set

#
# on-CPU RTC drivers
#
# CONFIG_RTC_DRV_XGENE is not set

#
# HID Sensor RTC drivers
#
# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set
CONFIG_DMADEVICES=y
# CONFIG_DMADEVICES_DEBUG is not set

#
# DMA Devices
#
# CONFIG_INTEL_MIC_X100_DMA is not set
CONFIG_INTEL_IOATDMA=m
CONFIG_DW_DMAC_CORE=m
CONFIG_DW_DMAC=m
# CONFIG_DW_DMAC_PCI is not set
# CONFIG_HSU_DMA_PCI is not set
CONFIG_DMA_ENGINE=y
CONFIG_DMA_ACPI=y

#
# DMA Clients
#
CONFIG_ASYNC_TX_DMA=y
# CONFIG_DMATEST is not set
CONFIG_DMA_ENGINE_RAID=y
CONFIG_DCA=m
# CONFIG_AUXDISPLAY is not set
CONFIG_UIO=m
CONFIG_UIO_CIF=m
# CONFIG_UIO_PDRV_GENIRQ is not set
# CONFIG_UIO_DMEM_GENIRQ is not set
CONFIG_UIO_AEC=m
CONFIG_UIO_SERCOS3=m
CONFIG_UIO_PCI_GENERIC=m
CONFIG_UIO_NETX=m
CONFIG_UIO_MF624=m
CONFIG_VFIO_IOMMU_TYPE1=m
CONFIG_VFIO_VIRQFD=m
CONFIG_VFIO=m
CONFIG_VFIO_PCI=m
CONFIG_VFIO_PCI_VGA=y
CONFIG_VFIO_PCI_MMAP=y
CONFIG_VFIO_PCI_INTX=y
CONFIG_VIRT_DRIVERS=y
CONFIG_VIRTIO=m

#
# Virtio drivers
#
CONFIG_VIRTIO_PCI=m
CONFIG_VIRTIO_PCI_LEGACY=y
CONFIG_VIRTIO_BALLOON=m
CONFIG_VIRTIO_INPUT=m
# CONFIG_VIRTIO_MMIO is not set

#
# Microsoft Hyper-V guest support
#
CONFIG_HYPERV=m
CONFIG_HYPERV_UTILS=m
CONFIG_HYPERV_BALLOON=m

#
# Xen driver support
#
CONFIG_XEN_BALLOON=y
# CONFIG_XEN_BALLOON_MEMORY_HOTPLUG is not set
CONFIG_XEN_SCRUB_PAGES=y
CONFIG_XEN_DEV_EVTCHN=m
CONFIG_XEN_BACKEND=y
CONFIG_XENFS=m
CONFIG_XEN_COMPAT_XENFS=y
CONFIG_XEN_SYS_HYPERVISOR=y
CONFIG_XEN_XENBUS_FRONTEND=y
CONFIG_XEN_GNTDEV=m
CONFIG_XEN_GRANT_DEV_ALLOC=m
CONFIG_SWIOTLB_XEN=y
CONFIG_XEN_TMEM=m
CONFIG_XEN_PCIDEV_BACKEND=m
CONFIG_XEN_SCSI_BACKEND=m
CONFIG_XEN_PRIVCMD=m
CONFIG_XEN_ACPI_PROCESSOR=m
CONFIG_XEN_MCE_LOG=y
CONFIG_XEN_HAVE_PVMMU=y
CONFIG_XEN_EFI=y
CONFIG_XEN_AUTO_XLATE=y
CONFIG_XEN_ACPI=y
CONFIG_STAGING=y
# CONFIG_SLICOSS is not set
CONFIG_PRISM2_USB=m
CONFIG_COMEDI=m
# CONFIG_COMEDI_DEBUG is not set
CONFIG_COMEDI_DEFAULT_BUF_SIZE_KB=2048
CONFIG_COMEDI_DEFAULT_BUF_MAXSIZE_KB=20480
CONFIG_COMEDI_MISC_DRIVERS=y
CONFIG_COMEDI_BOND=m
CONFIG_COMEDI_TEST=m
CONFIG_COMEDI_PARPORT=m
CONFIG_COMEDI_SERIAL2002=m
# CONFIG_COMEDI_ISA_DRIVERS is not set
CONFIG_COMEDI_PCI_DRIVERS=m
CONFIG_COMEDI_8255_PCI=m
CONFIG_COMEDI_ADDI_WATCHDOG=m
CONFIG_COMEDI_ADDI_APCI_1032=m
CONFIG_COMEDI_ADDI_APCI_1500=m
CONFIG_COMEDI_ADDI_APCI_1516=m
CONFIG_COMEDI_ADDI_APCI_1564=m
CONFIG_COMEDI_ADDI_APCI_16XX=m
CONFIG_COMEDI_ADDI_APCI_2032=m
CONFIG_COMEDI_ADDI_APCI_2200=m
CONFIG_COMEDI_ADDI_APCI_3120=m
CONFIG_COMEDI_ADDI_APCI_3501=m
CONFIG_COMEDI_ADDI_APCI_3XXX=m
CONFIG_COMEDI_ADL_PCI6208=m
CONFIG_COMEDI_ADL_PCI7X3X=m
CONFIG_COMEDI_ADL_PCI8164=m
CONFIG_COMEDI_ADL_PCI9111=m
CONFIG_COMEDI_ADL_PCI9118=m
CONFIG_COMEDI_ADV_PCI1710=m
CONFIG_COMEDI_ADV_PCI1723=m
CONFIG_COMEDI_ADV_PCI1724=m
CONFIG_COMEDI_ADV_PCI_DIO=m
CONFIG_COMEDI_AMPLC_DIO200_PCI=m
CONFIG_COMEDI_AMPLC_PC236_PCI=m
CONFIG_COMEDI_AMPLC_PC263_PCI=m
CONFIG_COMEDI_AMPLC_PCI224=m
CONFIG_COMEDI_AMPLC_PCI230=m
CONFIG_COMEDI_CONTEC_PCI_DIO=m
CONFIG_COMEDI_DAS08_PCI=m
CONFIG_COMEDI_DT3000=m
CONFIG_COMEDI_DYNA_PCI10XX=m
CONFIG_COMEDI_GSC_HPDI=m
CONFIG_COMEDI_MF6X4=m
CONFIG_COMEDI_ICP_MULTI=m
CONFIG_COMEDI_DAQBOARD2000=m
CONFIG_COMEDI_JR3_PCI=m
CONFIG_COMEDI_KE_COUNTER=m
CONFIG_COMEDI_CB_PCIDAS64=m
CONFIG_COMEDI_CB_PCIDAS=m
CONFIG_COMEDI_CB_PCIDDA=m
CONFIG_COMEDI_CB_PCIMDAS=m
CONFIG_COMEDI_CB_PCIMDDA=m
CONFIG_COMEDI_ME4000=m
CONFIG_COMEDI_ME_DAQ=m
CONFIG_COMEDI_NI_6527=m
CONFIG_COMEDI_NI_65XX=m
CONFIG_COMEDI_NI_660X=m
CONFIG_COMEDI_NI_670X=m
CONFIG_COMEDI_NI_LABPC_PCI=m
CONFIG_COMEDI_NI_PCIDIO=m
CONFIG_COMEDI_NI_PCIMIO=m
CONFIG_COMEDI_RTD520=m
CONFIG_COMEDI_S626=m
CONFIG_COMEDI_MITE=m
CONFIG_COMEDI_NI_TIOCMD=m
CONFIG_COMEDI_PCMCIA_DRIVERS=m
CONFIG_COMEDI_CB_DAS16_CS=m
CONFIG_COMEDI_DAS08_CS=m
CONFIG_COMEDI_NI_DAQ_700_CS=m
CONFIG_COMEDI_NI_DAQ_DIO24_CS=m
CONFIG_COMEDI_NI_LABPC_CS=m
CONFIG_COMEDI_NI_MIO_CS=m
CONFIG_COMEDI_QUATECH_DAQP_CS=m
CONFIG_COMEDI_USB_DRIVERS=m
CONFIG_COMEDI_DT9812=m
CONFIG_COMEDI_NI_USB6501=m
CONFIG_COMEDI_USBDUX=m
CONFIG_COMEDI_USBDUXFAST=m
CONFIG_COMEDI_USBDUXSIGMA=m
CONFIG_COMEDI_VMK80XX=m
CONFIG_COMEDI_8254=m
CONFIG_COMEDI_8255=m
CONFIG_COMEDI_KCOMEDILIB=m
CONFIG_COMEDI_AMPLC_DIO200=m
CONFIG_COMEDI_AMPLC_PC236=m
CONFIG_COMEDI_DAS08=m
CONFIG_COMEDI_NI_LABPC=m
CONFIG_COMEDI_NI_TIO=m
# CONFIG_PANEL is not set
CONFIG_RTL8192U=m
CONFIG_RTLLIB=m
CONFIG_RTLLIB_CRYPTO_CCMP=m
CONFIG_RTLLIB_CRYPTO_TKIP=m
CONFIG_RTLLIB_CRYPTO_WEP=m
CONFIG_RTL8192E=m
CONFIG_R8712U=m
CONFIG_R8188EU=m
CONFIG_88EU_AP_MODE=y
CONFIG_R8723AU=m
CONFIG_8723AU_AP_MODE=y
CONFIG_8723AU_BT_COEXIST=y
CONFIG_RTS5208=m
# CONFIG_VT6655 is not set
CONFIG_VT6656=m

#
# IIO staging drivers
#

#
# Accelerometers
#
# CONFIG_ADIS16201 is not set
# CONFIG_ADIS16203 is not set
# CONFIG_ADIS16204 is not set
# CONFIG_ADIS16209 is not set
# CONFIG_ADIS16220 is not set
# CONFIG_ADIS16240 is not set
# CONFIG_LIS3L02DQ is not set
# CONFIG_SCA3000 is not set

#
# Analog to digital converters
#
# CONFIG_AD7606 is not set
# CONFIG_AD7780 is not set
# CONFIG_AD7816 is not set
# CONFIG_AD7192 is not set
# CONFIG_AD7280 is not set

#
# Analog digital bi-direction converters
#
# CONFIG_ADT7316 is not set

#
# Capacitance to digital converters
#
# CONFIG_AD7150 is not set
# CONFIG_AD7152 is not set
# CONFIG_AD7746 is not set

#
# Direct Digital Synthesis
#
# CONFIG_AD9832 is not set
# CONFIG_AD9834 is not set

#
# Digital gyroscope sensors
#
# CONFIG_ADIS16060 is not set

#
# Network Analyzer, Impedance Converters
#
# CONFIG_AD5933 is not set

#
# Light sensors
#
CONFIG_SENSORS_ISL29018=m
# CONFIG_SENSORS_ISL29028 is not set
CONFIG_TSL2583=m
# CONFIG_TSL2x7x is not set

#
# Magnetometer sensors
#
# CONFIG_SENSORS_HMC5843_I2C is not set
# CONFIG_SENSORS_HMC5843_SPI is not set

#
# Active energy metering IC
#
# CONFIG_ADE7753 is not set
# CONFIG_ADE7754 is not set
# CONFIG_ADE7758 is not set
# CONFIG_ADE7759 is not set
# CONFIG_ADE7854 is not set

#
# Resolver to digital converters
#
# CONFIG_AD2S90 is not set
# CONFIG_AD2S1200 is not set
# CONFIG_AD2S1210 is not set

#
# Triggers - standalone
#
# CONFIG_IIO_PERIODIC_RTC_TRIGGER is not set
# CONFIG_IIO_SIMPLE_DUMMY is not set
# CONFIG_FB_SM7XX is not set
# CONFIG_FB_SM750 is not set
# CONFIG_FB_XGI is not set
# CONFIG_FT1000 is not set

#
# Speakup console speech
#
CONFIG_SPEAKUP=m
CONFIG_SPEAKUP_SYNTH_ACNTSA=m
CONFIG_SPEAKUP_SYNTH_APOLLO=m
CONFIG_SPEAKUP_SYNTH_AUDPTR=m
CONFIG_SPEAKUP_SYNTH_BNS=m
CONFIG_SPEAKUP_SYNTH_DECTLK=m
CONFIG_SPEAKUP_SYNTH_DECEXT=m
CONFIG_SPEAKUP_SYNTH_LTLK=m
CONFIG_SPEAKUP_SYNTH_SOFT=m
CONFIG_SPEAKUP_SYNTH_SPKOUT=m
CONFIG_SPEAKUP_SYNTH_TXPRT=m
CONFIG_SPEAKUP_SYNTH_DUMMY=m
# CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4 is not set
CONFIG_STAGING_MEDIA=y
# CONFIG_I2C_BCM2048 is not set
# CONFIG_DVB_CXD2099 is not set
# CONFIG_VIDEO_DT3155 is not set
# CONFIG_DVB_MN88472 is not set
# CONFIG_DVB_MN88473 is not set
CONFIG_LIRC_STAGING=y
CONFIG_LIRC_BT829=m
CONFIG_LIRC_IMON=m
# CONFIG_LIRC_PARALLEL is not set
CONFIG_LIRC_SASEM=m
CONFIG_LIRC_SERIAL=m
CONFIG_LIRC_SERIAL_TRANSMITTER=y
CONFIG_LIRC_SIR=m
CONFIG_LIRC_ZILOG=m

#
# Android
#
# CONFIG_USB_WPAN_HCD is not set
CONFIG_WIMAX_GDM72XX=m
# CONFIG_WIMAX_GDM72XX_QOS is not set
# CONFIG_WIMAX_GDM72XX_K_MODE is not set
# CONFIG_WIMAX_GDM72XX_WIMAX2 is not set
CONFIG_WIMAX_GDM72XX_USB=y
# CONFIG_WIMAX_GDM72XX_SDIO is not set
CONFIG_WIMAX_GDM72XX_USB_PM=y
# CONFIG_LTE_GDM724X is not set
# CONFIG_FIREWIRE_SERIAL is not set
# CONFIG_MTD_SPINAND_MT29F is not set
CONFIG_LUSTRE_FS=m
CONFIG_LUSTRE_OBD_MAX_IOCTL_BUFFER=8192
# CONFIG_LUSTRE_DEBUG_EXPENSIVE_CHECK is not set
CONFIG_LUSTRE_LLITE_LLOOP=m
CONFIG_LNET=m
CONFIG_LNET_MAX_PAYLOAD=1048576
# CONFIG_LNET_SELFTEST is not set
CONFIG_LNET_XPRT_IB=m
# CONFIG_DGNC is not set
# CONFIG_DGAP is not set
# CONFIG_GS_FPGABOOT is not set
# CONFIG_CRYPTO_SKEIN is not set
# CONFIG_UNISYSSPAR is not set
# CONFIG_FB_TFT is not set
# CONFIG_I2O is not set
CONFIG_X86_PLATFORM_DEVICES=y
CONFIG_ACER_WMI=m
CONFIG_ACERHDF=m
CONFIG_ALIENWARE_WMI=m
CONFIG_ASUS_LAPTOP=m
CONFIG_DELL_LAPTOP=m
CONFIG_DELL_WMI=m
CONFIG_DELL_WMI_AIO=m
CONFIG_DELL_SMO8800=m
CONFIG_FUJITSU_LAPTOP=m
# CONFIG_FUJITSU_LAPTOP_DEBUG is not set
CONFIG_FUJITSU_TABLET=m
CONFIG_AMILO_RFKILL=m
CONFIG_HP_ACCEL=m
CONFIG_HP_WIRELESS=m
CONFIG_HP_WMI=m
CONFIG_MSI_LAPTOP=m
CONFIG_PANASONIC_LAPTOP=m
CONFIG_COMPAL_LAPTOP=m
CONFIG_SONY_LAPTOP=m
CONFIG_SONYPI_COMPAT=y
CONFIG_IDEAPAD_LAPTOP=m
CONFIG_THINKPAD_ACPI=m
CONFIG_THINKPAD_ACPI_ALSA_SUPPORT=y
# CONFIG_THINKPAD_ACPI_DEBUGFACILITIES is not set
# CONFIG_THINKPAD_ACPI_DEBUG is not set
# CONFIG_THINKPAD_ACPI_UNSAFE_LEDS is not set
CONFIG_THINKPAD_ACPI_VIDEO=y
CONFIG_THINKPAD_ACPI_HOTKEY_POLL=y
CONFIG_SENSORS_HDAPS=m
# CONFIG_INTEL_MENLOW is not set
CONFIG_EEEPC_LAPTOP=m
CONFIG_ASUS_WMI=m
CONFIG_ASUS_NB_WMI=m
CONFIG_EEEPC_WMI=m
CONFIG_ACPI_WMI=m
CONFIG_MSI_WMI=m
CONFIG_TOPSTAR_LAPTOP=m
CONFIG_ACPI_TOSHIBA=m
CONFIG_TOSHIBA_BT_RFKILL=m
CONFIG_TOSHIBA_HAPS=m
CONFIG_ACPI_CMPC=m
CONFIG_INTEL_IPS=m
CONFIG_IBM_RTL=m
CONFIG_SAMSUNG_LAPTOP=m
CONFIG_MXM_WMI=m
CONFIG_INTEL_OAKTRAIL=m
CONFIG_SAMSUNG_Q10=m
CONFIG_APPLE_GMUX=m
CONFIG_INTEL_RST=m
CONFIG_INTEL_SMARTCONNECT=m
CONFIG_PVPANIC=m
CONFIG_CHROME_PLATFORMS=y
CONFIG_CHROMEOS_LAPTOP=m
CONFIG_CHROMEOS_PSTORE=m
CONFIG_CLKDEV_LOOKUP=y
CONFIG_HAVE_CLK_PREPARE=y
CONFIG_COMMON_CLK=y

#
# Common Clock Framework
#
# CONFIG_COMMON_CLK_SI5351 is not set
# CONFIG_COMMON_CLK_PXA is not set
# CONFIG_COMMON_CLK_CDCE706 is not set

#
# Hardware Spinlock drivers
#

#
# Clock Source drivers
#
CONFIG_CLKEVT_I8253=y
CONFIG_I8253_LOCK=y
CONFIG_CLKBLD_I8253=y
# CONFIG_ATMEL_PIT is not set
# CONFIG_SH_TIMER_CMT is not set
# CONFIG_SH_TIMER_MTU2 is not set
# CONFIG_SH_TIMER_TMU is not set
# CONFIG_EM_TIMER_STI is not set
# CONFIG_MAILBOX is not set
CONFIG_IOMMU_API=y
CONFIG_IOMMU_SUPPORT=y

#
# Generic IOMMU Pagetable Support
#
CONFIG_IOMMU_IOVA=y
CONFIG_AMD_IOMMU=y
# CONFIG_AMD_IOMMU_STATS is not set
CONFIG_AMD_IOMMU_V2=y
CONFIG_DMAR_TABLE=y
CONFIG_INTEL_IOMMU=y
# CONFIG_INTEL_IOMMU_DEFAULT_ON is not set
CONFIG_INTEL_IOMMU_FLOPPY_WA=y
CONFIG_IRQ_REMAP=y

#
# Remoteproc drivers
#
# CONFIG_STE_MODEM_RPROC is not set

#
# Rpmsg drivers
#

#
# SOC (System On Chip) specific Drivers
#
# CONFIG_SOC_TI is not set
CONFIG_PM_DEVFREQ=y

#
# DEVFREQ Governors
#
CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=m
# CONFIG_DEVFREQ_GOV_PERFORMANCE is not set
# CONFIG_DEVFREQ_GOV_POWERSAVE is not set
# CONFIG_DEVFREQ_GOV_USERSPACE is not set

#
# DEVFREQ Drivers
#
# CONFIG_PM_DEVFREQ_EVENT is not set
# CONFIG_EXTCON is not set
CONFIG_MEMORY=y
CONFIG_IIO=m
CONFIG_IIO_BUFFER=y
# CONFIG_IIO_BUFFER_CB is not set
CONFIG_IIO_KFIFO_BUF=m
CONFIG_IIO_TRIGGERED_BUFFER=m
CONFIG_IIO_TRIGGER=y
CONFIG_IIO_CONSUMERS_PER_TRIGGER=2

#
# Accelerometers
#
# CONFIG_BMA180 is not set
CONFIG_BMC150_ACCEL=m
CONFIG_HID_SENSOR_ACCEL_3D=m
# CONFIG_IIO_ST_ACCEL_3AXIS is not set
# CONFIG_KXSD9 is not set
# CONFIG_MMA8452 is not set
CONFIG_KXCJK1013=m
CONFIG_MMA9551_CORE=m
CONFIG_MMA9551=m
CONFIG_MMA9553=m

#
# Analog to digital converters
#
# CONFIG_AD7266 is not set
# CONFIG_AD7291 is not set
# CONFIG_AD7298 is not set
# CONFIG_AD7476 is not set
# CONFIG_AD7791 is not set
# CONFIG_AD7793 is not set
# CONFIG_AD7887 is not set
# CONFIG_AD7923 is not set
# CONFIG_AD799X is not set
# CONFIG_MAX1027 is not set
# CONFIG_MAX1363 is not set
# CONFIG_MCP320X is not set
# CONFIG_MCP3422 is not set
# CONFIG_NAU7802 is not set
# CONFIG_TI_ADC081C is not set
# CONFIG_TI_ADC128S052 is not set
CONFIG_VIPERBOARD_ADC=m

#
# Amplifiers
#
# CONFIG_AD8366 is not set

#
# Hid Sensor IIO Common
#
CONFIG_HID_SENSOR_IIO_COMMON=m
CONFIG_HID_SENSOR_IIO_TRIGGER=m

#
# SSP Sensor Common
#
# CONFIG_IIO_SSP_SENSORHUB is not set

#
# Digital to analog converters
#
# CONFIG_AD5064 is not set
# CONFIG_AD5360 is not set
# CONFIG_AD5380 is not set
# CONFIG_AD5421 is not set
# CONFIG_AD5446 is not set
# CONFIG_AD5449 is not set
# CONFIG_AD5504 is not set
# CONFIG_AD5624R_SPI is not set
# CONFIG_AD5686 is not set
# CONFIG_AD5755 is not set
# CONFIG_AD5764 is not set
# CONFIG_AD5791 is not set
# CONFIG_AD7303 is not set
# CONFIG_MAX517 is not set
# CONFIG_MCP4725 is not set
# CONFIG_MCP4922 is not set

#
# Frequency Synthesizers DDS/PLL
#

#
# Clock Generator/Distribution
#
# CONFIG_AD9523 is not set

#
# Phase-Locked Loop (PLL) frequency synthesizers
#
# CONFIG_ADF4350 is not set

#
# Digital gyroscope sensors
#
# CONFIG_ADIS16080 is not set
# CONFIG_ADIS16130 is not set
# CONFIG_ADIS16136 is not set
# CONFIG_ADIS16260 is not set
# CONFIG_ADXRS450 is not set
CONFIG_BMG160=m
CONFIG_HID_SENSOR_GYRO_3D=m
# CONFIG_IIO_ST_GYRO_3AXIS is not set
# CONFIG_ITG3200 is not set

#
# Humidity sensors
#
# CONFIG_DHT11 is not set
# CONFIG_SI7005 is not set
# CONFIG_SI7020 is not set

#
# Inertial measurement units
#
# CONFIG_ADIS16400 is not set
# CONFIG_ADIS16480 is not set
CONFIG_KMX61=m
CONFIG_INV_MPU6050_IIO=m

#
# Light sensors
#
# CONFIG_ADJD_S311 is not set
# CONFIG_AL3320A is not set
# CONFIG_APDS9300 is not set
# CONFIG_CM32181 is not set
# CONFIG_CM3232 is not set
# CONFIG_CM3323 is not set
# CONFIG_CM36651 is not set
# CONFIG_GP2AP020A00F is not set
# CONFIG_ISL29125 is not set
CONFIG_HID_SENSOR_ALS=m
CONFIG_HID_SENSOR_PROX=m
CONFIG_JSA1212=m
# CONFIG_LTR501 is not set
# CONFIG_TCS3414 is not set
# CONFIG_TCS3472 is not set
CONFIG_SENSORS_TSL2563=m
# CONFIG_TSL4531 is not set
# CONFIG_VCNL4000 is not set

#
# Magnetometer sensors
#
CONFIG_AK8975=m
# CONFIG_AK09911 is not set
# CONFIG_MAG3110 is not set
CONFIG_HID_SENSOR_MAGNETOMETER_3D=m
# CONFIG_IIO_ST_MAGN_3AXIS is not set

#
# Inclinometer sensors
#
CONFIG_HID_SENSOR_INCLINOMETER_3D=m
CONFIG_HID_SENSOR_DEVICE_ROTATION=m

#
# Triggers - standalone
#
# CONFIG_IIO_INTERRUPT_TRIGGER is not set
# CONFIG_IIO_SYSFS_TRIGGER is not set

#
# Pressure sensors
#
CONFIG_BMP280=m
CONFIG_HID_SENSOR_PRESS=m
# CONFIG_MPL115 is not set
# CONFIG_MPL3115 is not set
# CONFIG_MS5611 is not set
# CONFIG_IIO_ST_PRESS is not set
# CONFIG_T5403 is not set

#
# Lightning sensors
#
# CONFIG_AS3935 is not set

#
# Proximity sensors
#
CONFIG_SX9500=m

#
# Temperature sensors
#
# CONFIG_MLX90614 is not set
# CONFIG_TMP006 is not set
# CONFIG_NTB is not set
# CONFIG_VME_BUS is not set
# CONFIG_PWM is not set
# CONFIG_IPACK_BUS is not set
# CONFIG_RESET_CONTROLLER is not set
# CONFIG_FMC is not set

#
# PHY Subsystem
#
CONFIG_GENERIC_PHY=y
# CONFIG_BCM_KONA_USB2_PHY is not set
CONFIG_POWERCAP=y
CONFIG_INTEL_RAPL=m
# CONFIG_MCB is not set
CONFIG_RAS=y
CONFIG_THUNDERBOLT=m

#
# Android
#
# CONFIG_ANDROID is not set

#
# Firmware Drivers
#
CONFIG_EDD=m
# CONFIG_EDD_OFF is not set
CONFIG_FIRMWARE_MEMMAP=y
CONFIG_DELL_RBU=m
CONFIG_DCDBAS=m
CONFIG_DMIID=y
CONFIG_DMI_SYSFS=y
CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y
CONFIG_ISCSI_IBFT_FIND=y
CONFIG_ISCSI_IBFT=m
# CONFIG_GOOGLE_FIRMWARE is not set

#
# EFI (Extensible Firmware Interface) Support
#
CONFIG_EFI_VARS=m
CONFIG_EFI_VARS_PSTORE=m
# CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE is not set
CONFIG_EFI_RUNTIME_MAP=y
CONFIG_EFI_RUNTIME_WRAPPERS=y
CONFIG_UEFI_CPER=y

#
# File systems
#
CONFIG_DCACHE_WORD_ACCESS=y
# CONFIG_EXT2_FS is not set
# CONFIG_EXT3_FS is not set
CONFIG_EXT4_FS=m
CONFIG_EXT4_USE_FOR_EXT23=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EXT4_FS_SECURITY=y
# CONFIG_EXT4_ENCRYPTION is not set
# CONFIG_EXT4_DEBUG is not set
CONFIG_JBD2=m
# CONFIG_JBD2_DEBUG is not set
CONFIG_FS_MBCACHE=m
CONFIG_REISERFS_FS=m
# CONFIG_REISERFS_CHECK is not set
# CONFIG_REISERFS_PROC_INFO is not set
CONFIG_REISERFS_FS_XATTR=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_REISERFS_FS_SECURITY=y
CONFIG_JFS_FS=m
CONFIG_JFS_POSIX_ACL=y
CONFIG_JFS_SECURITY=y
# CONFIG_JFS_DEBUG is not set
# CONFIG_JFS_STATISTICS is not set
CONFIG_XFS_FS=m
CONFIG_XFS_QUOTA=y
CONFIG_XFS_POSIX_ACL=y
CONFIG_XFS_RT=y
# CONFIG_XFS_WARN is not set
# CONFIG_XFS_DEBUG is not set
CONFIG_GFS2_FS=m
CONFIG_GFS2_FS_LOCKING_DLM=y
CONFIG_OCFS2_FS=m
CONFIG_OCFS2_FS_O2CB=m
CONFIG_OCFS2_FS_USERSPACE_CLUSTER=m
CONFIG_OCFS2_FS_STATS=y
CONFIG_OCFS2_DEBUG_MASKLOG=y
# CONFIG_OCFS2_DEBUG_FS is not set
CONFIG_BTRFS_FS=m
CONFIG_BTRFS_FS_POSIX_ACL=y
# CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set
# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set
# CONFIG_BTRFS_DEBUG is not set
# CONFIG_BTRFS_ASSERT is not set
CONFIG_NILFS2_FS=m
CONFIG_F2FS_FS=m
CONFIG_F2FS_STAT_FS=y
CONFIG_F2FS_FS_XATTR=y
CONFIG_F2FS_FS_POSIX_ACL=y
CONFIG_F2FS_FS_SECURITY=y
# CONFIG_F2FS_CHECK_FS is not set
# CONFIG_F2FS_IO_TRACE is not set
# CONFIG_FS_DAX is not set
CONFIG_FS_POSIX_ACL=y
CONFIG_EXPORTFS=y
CONFIG_FILE_LOCKING=y
CONFIG_FSNOTIFY=y
CONFIG_DNOTIFY=y
CONFIG_INOTIFY_USER=y
CONFIG_FANOTIFY=y
# CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set
CONFIG_QUOTA=y
CONFIG_QUOTA_NETLINK_INTERFACE=y
CONFIG_PRINT_QUOTA_WARNING=y
# CONFIG_QUOTA_DEBUG is not set
CONFIG_QUOTA_TREE=m
CONFIG_QFMT_V1=m
CONFIG_QFMT_V2=m
CONFIG_QUOTACTL=y
CONFIG_QUOTACTL_COMPAT=y
CONFIG_AUTOFS4_FS=m
CONFIG_FUSE_FS=m
CONFIG_CUSE=m
CONFIG_OVERLAY_FS=m

#
# Caches
#
CONFIG_FSCACHE=m
CONFIG_FSCACHE_STATS=y
# CONFIG_FSCACHE_HISTOGRAM is not set
# CONFIG_FSCACHE_DEBUG is not set
# CONFIG_FSCACHE_OBJECT_LIST is not set
CONFIG_CACHEFILES=m
# CONFIG_CACHEFILES_DEBUG is not set
# CONFIG_CACHEFILES_HISTOGRAM is not set

#
# CD-ROM/DVD Filesystems
#
CONFIG_ISO9660_FS=m
CONFIG_JOLIET=y
CONFIG_ZISOFS=y
CONFIG_UDF_FS=m
CONFIG_UDF_NLS=y

#
# DOS/FAT/NT Filesystems
#
CONFIG_FAT_FS=m
CONFIG_MSDOS_FS=m
CONFIG_VFAT_FS=m
CONFIG_FAT_DEFAULT_CODEPAGE=437
CONFIG_FAT_DEFAULT_IOCHARSET="utf8"
CONFIG_NTFS_FS=m
# CONFIG_NTFS_DEBUG is not set
CONFIG_NTFS_RW=y

#
# Pseudo filesystems
#
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_PROC_VMCORE=y
CONFIG_PROC_SYSCTL=y
CONFIG_PROC_PAGE_MONITOR=y
CONFIG_KERNFS=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_TMPFS_XATTR=y
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_CONFIGFS_FS=m
CONFIG_EFIVAR_FS=m
CONFIG_MISC_FILESYSTEMS=y
CONFIG_ADFS_FS=m
# CONFIG_ADFS_FS_RW is not set
CONFIG_AFFS_FS=m
CONFIG_ECRYPT_FS=m
CONFIG_ECRYPT_FS_MESSAGING=y
CONFIG_HFS_FS=m
CONFIG_HFSPLUS_FS=m
# CONFIG_HFSPLUS_FS_POSIX_ACL is not set
CONFIG_BEFS_FS=m
# CONFIG_BEFS_DEBUG is not set
CONFIG_BFS_FS=m
CONFIG_EFS_FS=m
CONFIG_JFFS2_FS=m
CONFIG_JFFS2_FS_DEBUG=0
CONFIG_JFFS2_FS_WRITEBUFFER=y
# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
CONFIG_JFFS2_SUMMARY=y
CONFIG_JFFS2_FS_XATTR=y
CONFIG_JFFS2_FS_POSIX_ACL=y
CONFIG_JFFS2_FS_SECURITY=y
CONFIG_JFFS2_COMPRESSION_OPTIONS=y
CONFIG_JFFS2_ZLIB=y
CONFIG_JFFS2_LZO=y
CONFIG_JFFS2_RTIME=y
# CONFIG_JFFS2_RUBIN is not set
# CONFIG_JFFS2_CMODE_NONE is not set
CONFIG_JFFS2_CMODE_PRIORITY=y
# CONFIG_JFFS2_CMODE_SIZE is not set
# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
CONFIG_UBIFS_FS=m
CONFIG_UBIFS_FS_ADVANCED_COMPR=y
CONFIG_UBIFS_FS_LZO=y
CONFIG_UBIFS_FS_ZLIB=y
CONFIG_LOGFS=m
CONFIG_CRAMFS=m
CONFIG_SQUASHFS=m
CONFIG_SQUASHFS_FILE_CACHE=y
# CONFIG_SQUASHFS_FILE_DIRECT is not set
CONFIG_SQUASHFS_DECOMP_SINGLE=y
# CONFIG_SQUASHFS_DECOMP_MULTI is not set
# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set
CONFIG_SQUASHFS_XATTR=y
CONFIG_SQUASHFS_ZLIB=y
# CONFIG_SQUASHFS_LZ4 is not set
CONFIG_SQUASHFS_LZO=y
CONFIG_SQUASHFS_XZ=y
# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
# CONFIG_SQUASHFS_EMBEDDED is not set
CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
CONFIG_VXFS_FS=m
CONFIG_MINIX_FS=m
CONFIG_OMFS_FS=m
# CONFIG_HPFS_FS is not set
CONFIG_QNX4FS_FS=m
CONFIG_QNX6FS_FS=m
# CONFIG_QNX6FS_DEBUG is not set
CONFIG_ROMFS_FS=m
# CONFIG_ROMFS_BACKED_BY_BLOCK is not set
# CONFIG_ROMFS_BACKED_BY_MTD is not set
CONFIG_ROMFS_BACKED_BY_BOTH=y
CONFIG_ROMFS_ON_BLOCK=y
CONFIG_ROMFS_ON_MTD=y
CONFIG_PSTORE=y
# CONFIG_PSTORE_CONSOLE is not set
# CONFIG_PSTORE_PMSG is not set
# CONFIG_PSTORE_FTRACE is not set
CONFIG_PSTORE_RAM=m
CONFIG_SYSV_FS=m
CONFIG_UFS_FS=m
# CONFIG_UFS_FS_WRITE is not set
# CONFIG_UFS_DEBUG is not set
CONFIG_EXOFS_FS=m
# CONFIG_EXOFS_DEBUG is not set
CONFIG_ORE=m
CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_NFS_FS=m
CONFIG_NFS_V2=m
CONFIG_NFS_V3=m
CONFIG_NFS_V3_ACL=y
CONFIG_NFS_V4=m
CONFIG_NFS_SWAP=y
CONFIG_NFS_V4_1=y
CONFIG_NFS_V4_2=y
CONFIG_PNFS_FILE_LAYOUT=m
CONFIG_PNFS_BLOCK=m
CONFIG_PNFS_OBJLAYOUT=m
CONFIG_PNFS_FLEXFILE_LAYOUT=m
CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org"
# CONFIG_NFS_V4_1_MIGRATION is not set
CONFIG_NFS_V4_SECURITY_LABEL=y
CONFIG_NFS_FSCACHE=y
# CONFIG_NFS_USE_LEGACY_DNS is not set
CONFIG_NFS_USE_KERNEL_DNS=y
CONFIG_NFS_DEBUG=y
CONFIG_NFSD=m
CONFIG_NFSD_V2_ACL=y
CONFIG_NFSD_V3=y
CONFIG_NFSD_V3_ACL=y
CONFIG_NFSD_V4=y
# CONFIG_NFSD_PNFS is not set
CONFIG_NFSD_V4_SECURITY_LABEL=y
# CONFIG_NFSD_FAULT_INJECTION is not set
CONFIG_GRACE_PERIOD=m
CONFIG_LOCKD=m
CONFIG_LOCKD_V4=y
CONFIG_NFS_ACL_SUPPORT=m
CONFIG_NFS_COMMON=y
CONFIG_SUNRPC=m
CONFIG_SUNRPC_GSS=m
CONFIG_SUNRPC_BACKCHANNEL=y
CONFIG_SUNRPC_SWAP=y
CONFIG_RPCSEC_GSS_KRB5=m
CONFIG_SUNRPC_DEBUG=y
CONFIG_SUNRPC_XPRT_RDMA_CLIENT=m
CONFIG_SUNRPC_XPRT_RDMA_SERVER=m
CONFIG_CEPH_FS=m
CONFIG_CEPH_FSCACHE=y
CONFIG_CEPH_FS_POSIX_ACL=y
CONFIG_CIFS=m
# CONFIG_CIFS_STATS is not set
CONFIG_CIFS_WEAK_PW_HASH=y
CONFIG_CIFS_UPCALL=y
CONFIG_CIFS_XATTR=y
CONFIG_CIFS_POSIX=y
CONFIG_CIFS_ACL=y
CONFIG_CIFS_DEBUG=y
# CONFIG_CIFS_DEBUG2 is not set
CONFIG_CIFS_DFS_UPCALL=y
CONFIG_CIFS_SMB2=y
CONFIG_CIFS_FSCACHE=y
CONFIG_NCP_FS=m
CONFIG_NCPFS_PACKET_SIGNING=y
CONFIG_NCPFS_IOCTL_LOCKING=y
CONFIG_NCPFS_STRONG=y
CONFIG_NCPFS_NFS_NS=y
CONFIG_NCPFS_OS2_NS=y
# CONFIG_NCPFS_SMALLDOS is not set
CONFIG_NCPFS_NLS=y
CONFIG_NCPFS_EXTRAS=y
CONFIG_CODA_FS=m
CONFIG_AFS_FS=m
# CONFIG_AFS_DEBUG is not set
CONFIG_AFS_FSCACHE=y
CONFIG_9P_FS=m
CONFIG_9P_FSCACHE=y
CONFIG_9P_FS_POSIX_ACL=y
CONFIG_9P_FS_SECURITY=y
CONFIG_NLS=y
CONFIG_NLS_DEFAULT="utf8"
CONFIG_NLS_CODEPAGE_437=m
CONFIG_NLS_CODEPAGE_737=m
CONFIG_NLS_CODEPAGE_775=m
CONFIG_NLS_CODEPAGE_850=m
CONFIG_NLS_CODEPAGE_852=m
CONFIG_NLS_CODEPAGE_855=m
CONFIG_NLS_CODEPAGE_857=m
CONFIG_NLS_CODEPAGE_860=m
CONFIG_NLS_CODEPAGE_861=m
CONFIG_NLS_CODEPAGE_862=m
CONFIG_NLS_CODEPAGE_863=m
CONFIG_NLS_CODEPAGE_864=m
CONFIG_NLS_CODEPAGE_865=m
CONFIG_NLS_CODEPAGE_866=m
CONFIG_NLS_CODEPAGE_869=m
CONFIG_NLS_CODEPAGE_936=m
CONFIG_NLS_CODEPAGE_950=m
CONFIG_NLS_CODEPAGE_932=m
CONFIG_NLS_CODEPAGE_949=m
CONFIG_NLS_CODEPAGE_874=m
CONFIG_NLS_ISO8859_8=m
CONFIG_NLS_CODEPAGE_1250=m
CONFIG_NLS_CODEPAGE_1251=m
CONFIG_NLS_ASCII=m
CONFIG_NLS_ISO8859_1=m
CONFIG_NLS_ISO8859_2=m
CONFIG_NLS_ISO8859_3=m
CONFIG_NLS_ISO8859_4=m
CONFIG_NLS_ISO8859_5=m
CONFIG_NLS_ISO8859_6=m
CONFIG_NLS_ISO8859_7=m
CONFIG_NLS_ISO8859_9=m
CONFIG_NLS_ISO8859_13=m
CONFIG_NLS_ISO8859_14=m
CONFIG_NLS_ISO8859_15=m
CONFIG_NLS_KOI8_R=m
CONFIG_NLS_KOI8_U=m
CONFIG_NLS_MAC_ROMAN=m
CONFIG_NLS_MAC_CELTIC=m
CONFIG_NLS_MAC_CENTEURO=m
CONFIG_NLS_MAC_CROATIAN=m
CONFIG_NLS_MAC_CYRILLIC=m
CONFIG_NLS_MAC_GAELIC=m
CONFIG_NLS_MAC_GREEK=m
CONFIG_NLS_MAC_ICELAND=m
CONFIG_NLS_MAC_INUIT=m
CONFIG_NLS_MAC_ROMANIAN=m
CONFIG_NLS_MAC_TURKISH=m
CONFIG_NLS_UTF8=m
CONFIG_DLM=m
CONFIG_DLM_DEBUG=y

#
# Kernel hacking
#
CONFIG_TRACE_IRQFLAGS_SUPPORT=y

#
# printk and dmesg options
#
CONFIG_PRINTK_TIME=y
CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
CONFIG_BOOT_PRINTK_DELAY=y
CONFIG_DYNAMIC_DEBUG=y

#
# Compile-time checks and compiler options
#
CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_INFO_REDUCED is not set
# CONFIG_DEBUG_INFO_SPLIT is not set
# CONFIG_DEBUG_INFO_DWARF4 is not set
# CONFIG_GDB_SCRIPTS is not set
CONFIG_ENABLE_WARN_DEPRECATED=y
CONFIG_ENABLE_MUST_CHECK=y
CONFIG_FRAME_WARN=2048
CONFIG_STRIP_ASM_SYMS=y
# CONFIG_READABLE_ASM is not set
CONFIG_UNUSED_SYMBOLS=y
# CONFIG_PAGE_OWNER is not set
CONFIG_DEBUG_FS=y
# CONFIG_HEADERS_CHECK is not set
# CONFIG_DEBUG_SECTION_MISMATCH is not set
CONFIG_ARCH_WANT_FRAME_POINTERS=y
# CONFIG_FRAME_POINTER is not set
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
CONFIG_MAGIC_SYSRQ=y
CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x01b6
CONFIG_DEBUG_KERNEL=y

#
# Memory Debugging
#
# CONFIG_PAGE_EXTENSION is not set
# CONFIG_DEBUG_PAGEALLOC is not set
# CONFIG_DEBUG_OBJECTS is not set
# CONFIG_DEBUG_SLAB is not set
CONFIG_HAVE_DEBUG_KMEMLEAK=y
# CONFIG_DEBUG_KMEMLEAK is not set
# CONFIG_DEBUG_STACK_USAGE is not set
# CONFIG_DEBUG_VM is not set
# CONFIG_DEBUG_VIRTUAL is not set
CONFIG_DEBUG_MEMORY_INIT=y
# CONFIG_DEBUG_PER_CPU_MAPS is not set
CONFIG_HAVE_DEBUG_STACKOVERFLOW=y
# CONFIG_DEBUG_STACKOVERFLOW is not set
CONFIG_HAVE_ARCH_KMEMCHECK=y
CONFIG_HAVE_ARCH_KASAN=y
CONFIG_KASAN_SHADOW_OFFSET=0xdffffc0000000000
# CONFIG_DEBUG_SHIRQ is not set

#
# Debug Lockups and Hangs
#
CONFIG_LOCKUP_DETECTOR=y
CONFIG_HARDLOCKUP_DETECTOR=y
# CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set
CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0
# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
CONFIG_DETECT_HUNG_TASK=y
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
# CONFIG_PANIC_ON_OOPS is not set
CONFIG_PANIC_ON_OOPS_VALUE=0
CONFIG_PANIC_TIMEOUT=0
CONFIG_SCHED_DEBUG=y
# CONFIG_SCHEDSTATS is not set
# CONFIG_SCHED_STACK_END_CHECK is not set
# CONFIG_DEBUG_TIMEKEEPING is not set
CONFIG_TIMER_STATS=y

#
# Lock Debugging (spinlocks, mutexes, etc...)
#
# CONFIG_DEBUG_RT_MUTEXES is not set
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_MUTEXES is not set
# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set
# CONFIG_DEBUG_LOCK_ALLOC is not set
# CONFIG_PROVE_LOCKING is not set
# CONFIG_LOCK_STAT is not set
# CONFIG_DEBUG_ATOMIC_SLEEP is not set
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
# CONFIG_LOCK_TORTURE_TEST is not set
CONFIG_STACKTRACE=y
# CONFIG_DEBUG_KOBJECT is not set
CONFIG_DEBUG_BUGVERBOSE=y
CONFIG_DEBUG_LIST=y
# CONFIG_DEBUG_PI_LIST is not set
# CONFIG_DEBUG_SG is not set
# CONFIG_DEBUG_NOTIFIERS is not set
# CONFIG_DEBUG_CREDENTIALS is not set

#
# RCU Debugging
#
# CONFIG_PROVE_RCU is not set
# CONFIG_SPARSE_RCU_POINTER is not set
# CONFIG_TORTURE_TEST is not set
# CONFIG_RCU_TORTURE_TEST is not set
CONFIG_RCU_CPU_STALL_TIMEOUT=21
# CONFIG_RCU_CPU_STALL_INFO is not set
# CONFIG_RCU_TRACE is not set
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
# CONFIG_NOTIFIER_ERROR_INJECTION is not set
# CONFIG_FAULT_INJECTION is not set
# CONFIG_LATENCYTOP is not set
CONFIG_ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS=y
# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
CONFIG_USER_STACKTRACE_SUPPORT=y
CONFIG_NOP_TRACER=y
CONFIG_HAVE_FUNCTION_TRACER=y
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y
CONFIG_HAVE_DYNAMIC_FTRACE=y
CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
CONFIG_HAVE_FENTRY=y
CONFIG_HAVE_C_RECORDMCOUNT=y
CONFIG_TRACER_MAX_TRACE=y
CONFIG_TRACE_CLOCK=y
CONFIG_RING_BUFFER=y
CONFIG_EVENT_TRACING=y
CONFIG_CONTEXT_SWITCH_TRACER=y
CONFIG_RING_BUFFER_ALLOW_SWAP=y
CONFIG_TRACING=y
CONFIG_GENERIC_TRACER=y
CONFIG_TRACING_SUPPORT=y
CONFIG_FTRACE=y
CONFIG_FUNCTION_TRACER=y
CONFIG_FUNCTION_GRAPH_TRACER=y
# CONFIG_IRQSOFF_TRACER is not set
# CONFIG_SCHED_TRACER is not set
CONFIG_FTRACE_SYSCALLS=y
CONFIG_TRACER_SNAPSHOT=y
# CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set
CONFIG_BRANCH_PROFILE_NONE=y
# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
# CONFIG_PROFILE_ALL_BRANCHES is not set
CONFIG_STACK_TRACER=y
CONFIG_BLK_DEV_IO_TRACE=y
CONFIG_KPROBE_EVENT=y
CONFIG_UPROBE_EVENT=y
CONFIG_PROBE_EVENTS=y
CONFIG_DYNAMIC_FTRACE=y
CONFIG_DYNAMIC_FTRACE_WITH_REGS=y
# CONFIG_FUNCTION_PROFILER is not set
CONFIG_FTRACE_MCOUNT_RECORD=y
# CONFIG_FTRACE_STARTUP_TEST is not set
CONFIG_MMIOTRACE=y
# CONFIG_MMIOTRACE_TEST is not set
# CONFIG_TRACEPOINT_BENCHMARK is not set
# CONFIG_RING_BUFFER_BENCHMARK is not set
# CONFIG_RING_BUFFER_STARTUP_TEST is not set
# CONFIG_TRACE_ENUM_MAP_FILE is not set

#
# Runtime Testing
#
# CONFIG_LKDTM is not set
# CONFIG_TEST_LIST_SORT is not set
# CONFIG_KPROBES_SANITY_TEST is not set
# CONFIG_BACKTRACE_SELF_TEST is not set
# CONFIG_RBTREE_TEST is not set
# CONFIG_INTERVAL_TREE_TEST is not set
# CONFIG_PERCPU_TEST is not set
# CONFIG_ATOMIC64_SELFTEST is not set
# CONFIG_ASYNC_RAID6_TEST is not set
# CONFIG_TEST_HEXDUMP is not set
# CONFIG_TEST_STRING_HELPERS is not set
# CONFIG_TEST_KSTRTOX is not set
# CONFIG_TEST_RHASHTABLE is not set
# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
# CONFIG_DMA_API_DEBUG is not set
# CONFIG_TEST_LKM is not set
# CONFIG_TEST_USER_COPY is not set
# CONFIG_TEST_BPF is not set
# CONFIG_TEST_FIRMWARE is not set
# CONFIG_TEST_UDELAY is not set
CONFIG_MEMTEST=y
# CONFIG_SAMPLES is not set
CONFIG_HAVE_ARCH_KGDB=y
# CONFIG_KGDB is not set
CONFIG_STRICT_DEVMEM=y
# CONFIG_X86_VERBOSE_BOOTUP is not set
CONFIG_EARLY_PRINTK=y
# CONFIG_EARLY_PRINTK_DBGP is not set
CONFIG_EARLY_PRINTK_EFI=y
# CONFIG_X86_PTDUMP is not set
CONFIG_DEBUG_RODATA=y
# CONFIG_DEBUG_RODATA_TEST is not set
CONFIG_DEBUG_SET_MODULE_RONX=y
# CONFIG_DEBUG_NX_TEST is not set
CONFIG_DOUBLEFAULT=y
# CONFIG_DEBUG_TLBFLUSH is not set
# CONFIG_IOMMU_DEBUG is not set
# CONFIG_IOMMU_STRESS is not set
CONFIG_HAVE_MMIOTRACE_SUPPORT=y
# CONFIG_X86_DECODER_SELFTEST is not set
CONFIG_IO_DELAY_TYPE_0X80=0
CONFIG_IO_DELAY_TYPE_0XED=1
CONFIG_IO_DELAY_TYPE_UDELAY=2
CONFIG_IO_DELAY_TYPE_NONE=3
CONFIG_IO_DELAY_0X80=y
# CONFIG_IO_DELAY_0XED is not set
# CONFIG_IO_DELAY_UDELAY is not set
# CONFIG_IO_DELAY_NONE is not set
CONFIG_DEFAULT_IO_DELAY_TYPE=0
# CONFIG_DEBUG_BOOT_PARAMS is not set
# CONFIG_CPA_DEBUG is not set
CONFIG_OPTIMIZE_INLINING=y
# CONFIG_DEBUG_NMI_SELFTEST is not set
# CONFIG_X86_DEBUG_STATIC_CPU_HAS is not set

#
# Security options
#
CONFIG_KEYS=y
# CONFIG_PERSISTENT_KEYRINGS is not set
# CONFIG_BIG_KEYS is not set
# CONFIG_TRUSTED_KEYS is not set
# CONFIG_ENCRYPTED_KEYS is not set
# CONFIG_SECURITY_DMESG_RESTRICT is not set
CONFIG_SECURITY=y
CONFIG_SECURITYFS=y
CONFIG_SECURITY_NETWORK=y
CONFIG_SECURITY_NETWORK_XFRM=y
CONFIG_SECURITY_PATH=y
# CONFIG_INTEL_TXT is not set
CONFIG_LSM_MMAP_MIN_ADDR=65536
CONFIG_SECURITY_SELINUX=y
# CONFIG_SECURITY_SELINUX_BOOTPARAM is not set
# CONFIG_SECURITY_SELINUX_DISABLE is not set
CONFIG_SECURITY_SELINUX_DEVELOP=y
CONFIG_SECURITY_SELINUX_AVC_STATS=y
CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set
# CONFIG_SECURITY_SMACK is not set
CONFIG_SECURITY_TOMOYO=y
CONFIG_SECURITY_TOMOYO_MAX_ACCEPT_ENTRY=2048
CONFIG_SECURITY_TOMOYO_MAX_AUDIT_LOG=1024
# CONFIG_SECURITY_TOMOYO_OMIT_USERSPACE_LOADER is not set
CONFIG_SECURITY_TOMOYO_POLICY_LOADER="/sbin/tomoyo-init"
CONFIG_SECURITY_TOMOYO_ACTIVATION_TRIGGER="/sbin/init"
CONFIG_SECURITY_APPARMOR=y
CONFIG_SECURITY_APPARMOR_BOOTPARAM_VALUE=1
CONFIG_SECURITY_APPARMOR_HASH=y
CONFIG_SECURITY_YAMA=y
CONFIG_SECURITY_YAMA_STACKED=y
CONFIG_INTEGRITY=y
# CONFIG_INTEGRITY_SIGNATURE is not set
CONFIG_INTEGRITY_AUDIT=y
# CONFIG_IMA is not set
# CONFIG_EVM is not set
# CONFIG_DEFAULT_SECURITY_SELINUX is not set
# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
# CONFIG_DEFAULT_SECURITY_APPARMOR is not set
# CONFIG_DEFAULT_SECURITY_YAMA is not set
CONFIG_DEFAULT_SECURITY_DAC=y
CONFIG_DEFAULT_SECURITY=""
CONFIG_XOR_BLOCKS=m
CONFIG_ASYNC_CORE=m
CONFIG_ASYNC_MEMCPY=m
CONFIG_ASYNC_XOR=m
CONFIG_ASYNC_PQ=m
CONFIG_ASYNC_RAID6_RECOV=m
CONFIG_CRYPTO=y

#
# Crypto core or helper
#
CONFIG_CRYPTO_ALGAPI=y
CONFIG_CRYPTO_ALGAPI2=y
CONFIG_CRYPTO_AEAD=m
CONFIG_CRYPTO_AEAD2=y
CONFIG_CRYPTO_BLKCIPHER=m
CONFIG_CRYPTO_BLKCIPHER2=y
CONFIG_CRYPTO_HASH=y
CONFIG_CRYPTO_HASH2=y
CONFIG_CRYPTO_RNG=m
CONFIG_CRYPTO_RNG2=y
CONFIG_CRYPTO_PCOMP=m
CONFIG_CRYPTO_PCOMP2=y
CONFIG_CRYPTO_MANAGER=y
CONFIG_CRYPTO_MANAGER2=y
# CONFIG_CRYPTO_USER is not set
# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set
CONFIG_CRYPTO_GF128MUL=m
CONFIG_CRYPTO_NULL=m
CONFIG_CRYPTO_PCRYPT=m
CONFIG_CRYPTO_WORKQUEUE=y
CONFIG_CRYPTO_CRYPTD=m
# CONFIG_CRYPTO_MCRYPTD is not set
CONFIG_CRYPTO_AUTHENC=m
CONFIG_CRYPTO_TEST=m
CONFIG_CRYPTO_ABLK_HELPER=m
CONFIG_CRYPTO_GLUE_HELPER_X86=m

#
# Authenticated Encryption with Associated Data
#
CONFIG_CRYPTO_CCM=m
CONFIG_CRYPTO_GCM=m
CONFIG_CRYPTO_SEQIV=m

#
# Block modes
#
CONFIG_CRYPTO_CBC=m
CONFIG_CRYPTO_CTR=m
CONFIG_CRYPTO_CTS=m
CONFIG_CRYPTO_ECB=m
CONFIG_CRYPTO_LRW=m
CONFIG_CRYPTO_PCBC=m
CONFIG_CRYPTO_XTS=m

#
# Hash modes
#
CONFIG_CRYPTO_CMAC=m
CONFIG_CRYPTO_HMAC=m
CONFIG_CRYPTO_XCBC=m
CONFIG_CRYPTO_VMAC=m

#
# Digest
#
CONFIG_CRYPTO_CRC32C=m
CONFIG_CRYPTO_CRC32C_INTEL=m
CONFIG_CRYPTO_CRC32=m
CONFIG_CRYPTO_CRC32_PCLMUL=m
CONFIG_CRYPTO_CRCT10DIF=y
CONFIG_CRYPTO_CRCT10DIF_PCLMUL=m
CONFIG_CRYPTO_GHASH=m
CONFIG_CRYPTO_MD4=m
CONFIG_CRYPTO_MD5=y
CONFIG_CRYPTO_MICHAEL_MIC=m
CONFIG_CRYPTO_RMD128=m
CONFIG_CRYPTO_RMD160=m
CONFIG_CRYPTO_RMD256=m
CONFIG_CRYPTO_RMD320=m
CONFIG_CRYPTO_SHA1=y
CONFIG_CRYPTO_SHA1_SSSE3=m
CONFIG_CRYPTO_SHA256_SSSE3=m
CONFIG_CRYPTO_SHA512_SSSE3=m
# CONFIG_CRYPTO_SHA1_MB is not set
CONFIG_CRYPTO_SHA256=m
CONFIG_CRYPTO_SHA512=m
CONFIG_CRYPTO_TGR192=m
CONFIG_CRYPTO_WP512=m
CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=m

#
# Ciphers
#
CONFIG_CRYPTO_AES=y
CONFIG_CRYPTO_AES_X86_64=m
CONFIG_CRYPTO_AES_NI_INTEL=m
CONFIG_CRYPTO_ANUBIS=m
CONFIG_CRYPTO_ARC4=m
CONFIG_CRYPTO_BLOWFISH=m
CONFIG_CRYPTO_BLOWFISH_COMMON=m
CONFIG_CRYPTO_BLOWFISH_X86_64=m
CONFIG_CRYPTO_CAMELLIA=m
CONFIG_CRYPTO_CAMELLIA_X86_64=m
CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64=m
CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64=m
CONFIG_CRYPTO_CAST_COMMON=m
CONFIG_CRYPTO_CAST5=m
CONFIG_CRYPTO_CAST5_AVX_X86_64=m
CONFIG_CRYPTO_CAST6=m
CONFIG_CRYPTO_CAST6_AVX_X86_64=m
CONFIG_CRYPTO_DES=m
# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set
CONFIG_CRYPTO_FCRYPT=m
CONFIG_CRYPTO_KHAZAD=m
CONFIG_CRYPTO_SALSA20=m
CONFIG_CRYPTO_SALSA20_X86_64=m
CONFIG_CRYPTO_SEED=m
CONFIG_CRYPTO_SERPENT=m
CONFIG_CRYPTO_SERPENT_SSE2_X86_64=m
CONFIG_CRYPTO_SERPENT_AVX_X86_64=m
CONFIG_CRYPTO_SERPENT_AVX2_X86_64=m
CONFIG_CRYPTO_TEA=m
CONFIG_CRYPTO_TWOFISH=m
CONFIG_CRYPTO_TWOFISH_COMMON=m
CONFIG_CRYPTO_TWOFISH_X86_64=m
CONFIG_CRYPTO_TWOFISH_X86_64_3WAY=m
CONFIG_CRYPTO_TWOFISH_AVX_X86_64=m

#
# Compression
#
CONFIG_CRYPTO_DEFLATE=m
CONFIG_CRYPTO_ZLIB=m
CONFIG_CRYPTO_LZO=y
CONFIG_CRYPTO_LZ4=m
CONFIG_CRYPTO_LZ4HC=m

#
# Random Number Generation
#
CONFIG_CRYPTO_ANSI_CPRNG=m
# CONFIG_CRYPTO_DRBG_MENU is not set
CONFIG_CRYPTO_USER_API=m
CONFIG_CRYPTO_USER_API_HASH=m
CONFIG_CRYPTO_USER_API_SKCIPHER=m
# CONFIG_CRYPTO_USER_API_RNG is not set
CONFIG_CRYPTO_HW=y
CONFIG_CRYPTO_DEV_PADLOCK=m
CONFIG_CRYPTO_DEV_PADLOCK_AES=m
CONFIG_CRYPTO_DEV_PADLOCK_SHA=m
CONFIG_CRYPTO_DEV_CCP=y
CONFIG_CRYPTO_DEV_CCP_DD=m
CONFIG_CRYPTO_DEV_CCP_CRYPTO=m
CONFIG_CRYPTO_DEV_QAT=m
CONFIG_CRYPTO_DEV_QAT_DH895xCC=m
# CONFIG_ASYMMETRIC_KEY_TYPE is not set
CONFIG_HAVE_KVM=y
CONFIG_HAVE_KVM_IRQCHIP=y
CONFIG_HAVE_KVM_IRQFD=y
CONFIG_HAVE_KVM_IRQ_ROUTING=y
CONFIG_HAVE_KVM_EVENTFD=y
CONFIG_KVM_APIC_ARCHITECTURE=y
CONFIG_KVM_MMIO=y
CONFIG_KVM_ASYNC_PF=y
CONFIG_HAVE_KVM_MSI=y
CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y
CONFIG_KVM_VFIO=y
CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y
CONFIG_KVM_COMPAT=y
CONFIG_VIRTUALIZATION=y
CONFIG_KVM=m
CONFIG_KVM_INTEL=m
CONFIG_KVM_AMD=m
# CONFIG_KVM_MMU_AUDIT is not set
CONFIG_KVM_DEVICE_ASSIGNMENT=y
CONFIG_BINARY_PRINTF=y

#
# Library routines
#
CONFIG_RAID6_PQ=m
CONFIG_BITREVERSE=y
# CONFIG_HAVE_ARCH_BITREVERSE is not set
CONFIG_RATIONAL=y
CONFIG_GENERIC_STRNCPY_FROM_USER=y
CONFIG_GENERIC_STRNLEN_USER=y
CONFIG_GENERIC_NET_UTILS=y
CONFIG_GENERIC_FIND_FIRST_BIT=y
CONFIG_GENERIC_PCI_IOMAP=y
CONFIG_GENERIC_IOMAP=y
CONFIG_GENERIC_IO=y
CONFIG_PERCPU_RWSEM=y
CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
CONFIG_ARCH_HAS_FAST_MULTIPLIER=y
CONFIG_CRC_CCITT=m
CONFIG_CRC16=m
CONFIG_CRC_T10DIF=y
CONFIG_CRC_ITU_T=m
CONFIG_CRC32=y
# CONFIG_CRC32_SELFTEST is not set
CONFIG_CRC32_SLICEBY8=y
# CONFIG_CRC32_SLICEBY4 is not set
# CONFIG_CRC32_SARWATE is not set
# CONFIG_CRC32_BIT is not set
CONFIG_CRC7=m
CONFIG_LIBCRC32C=m
# CONFIG_CRC8 is not set
# CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set
# CONFIG_RANDOM32_SELFTEST is not set
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=y
CONFIG_LZO_COMPRESS=y
CONFIG_LZO_DECOMPRESS=y
CONFIG_LZ4_COMPRESS=m
CONFIG_LZ4HC_COMPRESS=m
CONFIG_LZ4_DECOMPRESS=y
CONFIG_XZ_DEC=y
CONFIG_XZ_DEC_X86=y
# CONFIG_XZ_DEC_POWERPC is not set
# CONFIG_XZ_DEC_IA64 is not set
# CONFIG_XZ_DEC_ARM is not set
# CONFIG_XZ_DEC_ARMTHUMB is not set
# CONFIG_XZ_DEC_SPARC is not set
CONFIG_XZ_DEC_BCJ=y
# CONFIG_XZ_DEC_TEST is not set
CONFIG_DECOMPRESS_GZIP=y
CONFIG_DECOMPRESS_BZIP2=y
CONFIG_DECOMPRESS_LZMA=y
CONFIG_DECOMPRESS_XZ=y
CONFIG_DECOMPRESS_LZO=y
CONFIG_DECOMPRESS_LZ4=y
CONFIG_GENERIC_ALLOCATOR=y
CONFIG_REED_SOLOMON=m
CONFIG_REED_SOLOMON_ENC8=y
CONFIG_REED_SOLOMON_DEC8=y
CONFIG_REED_SOLOMON_DEC16=y
CONFIG_BCH=m
CONFIG_TEXTSEARCH=y
CONFIG_TEXTSEARCH_KMP=m
CONFIG_TEXTSEARCH_BM=m
CONFIG_TEXTSEARCH_FSM=m
CONFIG_BTREE=y
CONFIG_INTERVAL_TREE=y
CONFIG_ASSOCIATIVE_ARRAY=y
CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT_MAP=y
CONFIG_HAS_DMA=y
CONFIG_CHECK_SIGNATURE=y
CONFIG_CPU_RMAP=y
CONFIG_DQL=y
CONFIG_GLOB=y
# CONFIG_GLOB_SELFTEST is not set
CONFIG_NLATTR=y
CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
CONFIG_LRU_CACHE=m
CONFIG_AVERAGE=y
CONFIG_CORDIC=m
# CONFIG_DDR is not set
CONFIG_OID_REGISTRY=m
CONFIG_UCS2_STRING=y
CONFIG_FONT_SUPPORT=y
# CONFIG_FONTS is not set
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
CONFIG_ARCH_HAS_SG_CHAIN=y

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

main_channel_link: add main channel client
main_channel_handle_parsed: net test: latency 4.841000 ms, bitrate 1655618431 bps (1578.920775 Mbps)
inputs_connect: inputs channel client create
red_dispatcher_set_cursor_peer: 
8983@1445590130.672485:xen_platform_log xen platform: XEN|DllInitialize: 8.2.0 (81) (22.10.2015)
8983@1445590130.672721:xen_platform_log xen platform: XEN|AcpiFindRsdp: 0x00000000000F65D0
8983@1445590130.672836:xen_platform_log xen platform: XEN|SystemGetStartOptions:  TESTSIGNING  FLIGHTSIGNING  NOEXECUTE=OPTIN
8983@1445590130.672930:xen_platform_log xen platform: XEN|SystemGetVersionInformation: KERNEL: 10.0 (BUILD 10565) PLATFORM WIN32_NT (x64)
8983@1445590130.672990:xen_platform_log xen platform: XEN|SystemGetVersionInformation: SUITES:
8983@1445590130.673050:xen_platform_log xen platform: XEN|SystemGetVersionInformation: - TERMINAL
8983@1445590130.673111:xen_platform_log xen platform: XEN|SystemGetVersionInformation: - SINGLEUSERTS
8983@1445590130.673174:xen_platform_log xen platform: XEN|SystemGetVersionInformation: TYPE: WORKSTATION
8983@1445590130.673262:xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[0] 00000000.00001000 - 00000000.0009efff
8983@1445590130.673356:xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[1] 00000000.00100000 - 00000000.00101fff
8983@1445590130.673441:xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[2] 00000000.00103000 - 00000000.efffefff
8983@1445590130.673521:xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[3] 00000001.00000000 - 00000001.07ffffff
8983@1445590130.673576:xen_platform_log xen platform: XEN|AcpiGetXsdt: 0x00000000FC00A000
8983@1445590130.673990:xen_platform_log xen platform: XEN|SystemProcessorInformation: ====> (0:0)
8983@1445590130.674095:xen_platform_log xen platform: XEN|SystemProcessorInformation: Manufacturer: GenuineIntel
8983@1445590130.674181:xen_platform_log xen platform: XEN|SystemProcessorInformation: APIC ID: 00
8983@1445590130.674269:xen_platform_log xen platform: XEN|SystemProcessorInformation: PROCESSOR ID: 00
8983@1445590130.674356:xen_platform_log xen platform: XEN|SystemProcessorInformation: <==== (0:0)
8983@1445590130.674708:xen_platform_log xen platform: XEN|SystemProcessorInformation: ====> (0:1)
8983@1445590130.674786:xen_platform_log xen platform: XEN|SystemProcessorInformation: Manufacturer: GenuineIntel
8983@1445590130.674847:xen_platform_log xen platform: XEN|SystemProcessorInformation: APIC ID: 02
8983@1445590130.674909:xen_platform_log xen platform: XEN|SystemProcessorInformation: PROCESSOR ID: 01
8983@1445590130.674978:xen_platform_log xen platform: XEN|SystemProcessorInformation: <==== (0:1)
8983@1445590130.675323:xen_platform_log xen platform: XEN: HYPERCALL PAGE 0 @ 00000001.048a5000
8983@1445590130.675507:xen_platform_log xen platform: XEN|UnplugSetRequest: DISKS
8983@1445590130.675601:xen_platform_log xen platform: XEN|UnplugSetRequest: NICS
8983@1445590130.677883:xen_platform_log xen platform: XENFILT|DriverEntry: 8.2.0 (81) (22.10.2015)
8983@1445590130.677998:xen_platform_log xen platform: XEN: 4.6.0 (__XEN_INTERFACE_VERSION__ = 00040600)
8983@1445590130.706941:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE001EA7F7920 (ACPI\PNP0A03\0)
8983@1445590131.088716:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EAC91C60 (PCI\VEN_8086&DEV_1237&SUBSYS_11001AF4&REV_02\00)
8983@1445590131.088907:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EAC91880 (PCI\VEN_8086&DEV_7000&SUBSYS_11001AF4&REV_00\08)
8983@1445590131.089069:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EA7FBC60 (PCI\VEN_8086&DEV_7010&SUBSYS_11001AF4&REV_00\09)
8983@1445590131.089222:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EA7FB880 (PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10)
8983@1445590131.089381:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EACA7C60 (PCI\VEN_8086&DEV_2668&SUBSYS_11001AF4&REV_01\18)
8983@1445590131.089541:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EACA8C60 (PCI\VEN_1AF4&DEV_1003&SUBSYS_00031AF4&REV_00\20)
8983@1445590131.089731:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EACA8880 (PCI\VEN_1B36&DEV_0100&SUBSYS_11001AF4&REV_04\28)
8983@1445590131.089885:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EACA99F0 (PCI\VEN_10EC&DEV_8139&SUBSYS_11001AF4&REV_20\30)
8983@1445590131.090049:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EACAAB30 (PCI\VEN_8086&DEV_2934&SUBSYS_11001AF4&REV_03\E8)
8983@1445590131.090206:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EACABC60 (PCI\VEN_8086&DEV_2935&SUBSYS_11001AF4&REV_03\E9)
8983@1445590131.090353:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EACACC60 (PCI\VEN_8086&DEV_2936&SUBSYS_11001AF4&REV_03\EA)
8983@1445590131.090522:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EACADC60 (PCI\VEN_8086&DEV_293A&SUBSYS_11001AF4&REV_03\EF)
8983@1445590131.090675:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EACAD880 (ACPI\PNP0103\0)
8983@1445590131.090769:xen_platform_log xen platform: XENFILT|DriverSetFilterState: ACTIVE DEVICE PRESENT
8983@1445590131.090947:xen_platform_log xen platform: UNPLUG: PRE-AMBLE (DRIVERS NOT BLACKLISTED)
8983@1445590131.110854:xen_platform_log xen platform: UNPLUG: DISKS
8983@1445590131.124682:xen_platform_log xen platform: UNPLUG: NICS
8983@1445590131.125028:xen_platform_log xen platform: XENFILT|DriverSetFilterState: PENDING
8983@1445590131.154003:xen_platform_log xen platform: XENFILT|PdoDestroy: FFFFE001EACA99F0 (PCI\VEN_10EC&DEV_8139&SUBSYS_11001AF4&REV_20\30) (device disappeared)
8983@1445590131.154170:xen_platform_log xen platform: XENFILT|DriverSetFilterState: DISABLED
8983@1445590131.201056:xen_platform_log xen platform: XENBUS|DriverEntry: 8.2.0 (81) (22.10.2015)
8983@1445590131.202005:xen_platform_log xen platform: XENFILT|PdoQueryInterface: PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10: PVDEVICE_INTERFACE (VERSION 1)
8983@1445590131.202230:xen_platform_log xen platform: XENBUS|FdoSetFriendlyName: Xen PV Bus (0001)
8983@1445590131.202311:xen_platform_log xen platform: XENBUS|FdoCreate: FFFFE001EA7DDB40 (XP0001 XENBUS) [ACTIVE]
8983@1445590131.225758:xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFE001EA7BBA40: Shared LevelSensitive CPU 0:0 VECTOR b1
8983@1445590131.226132:xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFE001EAC81D70: DeviceExclusive Latched CPU 0:0 VECTOR 50
8983@1445590131.226298:xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFE001EAC818D0: DeviceExclusive Latched CPU 0:1 VECTOR 50
8983@1445590131.226652:xen_platform_log xen platform: XENBUS|FdoScan: ====>
8983@1445590131.233602:xen_platform_log xen platform: XENBUS|FdoCreateIoSpace: 00000000.f8000000 - 00000000.f8ffffff
8983@1445590131.233918:xen_platform_log xen platform: XENBUS|FdoSuspend: ====>
8983@1445590131.234026:xen_platform_log xen platform: XEN|HvmSetParam: fail1 (c0000022)
8983@1445590131.234101:xen_platform_log xen platform: XENBUS|FdoBalloon: ====>
8983@1445590131.234191:xen_platform_log xen platform: SHARED_INFO: MAP XENMAPSPACE_shared_info @ 00000000.f8000000
8983@1445590131.234288:xen_platform_log xen platform: EVTCHN_FIFO: CONTROLBLOCK[0] @ 00000000.007ba000
8983@1445590131.234365:xen_platform_log xen platform: EVTCHN_FIFO: CONTROLBLOCK[1] @ 00000000.007bb000
8983@1445590131.234419:xen_platform_log xen platform: XENBUS|EvtchnAbiAcquire: FIFO
8983@1445590131.234503:xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CPU 0:0 (Vector = 80)
8983@1445590131.234578:xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CPU 0:1 (Vector = 80)
8983@1445590131.234658:xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CALLBACK VIA (Vector = 24)
8983@1445590131.234724:xen_platform_log xen platform: STORE: PAGE @ 00000000.feffc000
8983@1445590131.234776:xen_platform_log xen platform: STORE: EVTCHN 1
8983@1445590131.234863:xen_platform_log xen platform: EVTCHN_FIFO: EVENTARRAY[0] @ 00000000.00ebc000
8983@1445590131.234935:xen_platform_log xen platform: XENBUS|EvtchnFifoExpand: added ports [00000000 - 000003ff]
8983@1445590131.235617:xen_platform_log xen platform: XENBUS|PdoCreate: FFFFE001EACBCD40 (VBD)
8983@1445590131.235783:xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 08000009 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
8983@1445590131.235933:xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000A -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
8983@1445590131.236084:xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000B -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v2 RANGE_SET v1 CACHE v1 GNTTAB v2 UNPLUG v1 EMULATED v1
8983@1445590131.236249:xen_platform_log xen platform: XENBUS|PdoCreate: FFFFE001EACBCA20 (VIF)
8983@1445590131.236401:xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 08000009 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
8983@1445590131.236550:xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000A -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
8983@1445590131.236699:xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000B -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v2 RANGE_SET v1 CACHE v1 GNTTAB v2 UNPLUG v1 EMULATED v1
8983@1445590131.236851:xen_platform_log xen platform: XENBUS|PdoCreate: FFFFE001EACBBD40 (IFACE)
8983@1445590131.237003:xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 08000009 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
8983@1445590131.237153:xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000A -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 UNPLUG v1 EMULATED v1
8983@1445590131.237302:xen_platform_log xen platform: XENBUS|PdoDumpRevisions: 0800000B -> SUSPEND v1 SHARED_INFO v2 EVTCHN v5 DEBUG v1 STORE v2 RANGE_SET v1 CACHE v1 GNTTAB v2 UNPLUG v1 EMULATED v1
8983@1445590131.271602:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE001EAC9E980 (PCIIDE\IDEChannel\0)
8983@1445590131.271953:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE001EAC9BC60 (PCIIDE\IDEChannel\1)
8983@1445590131.279124:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE001EAC9B880 (IDE\CdRomQEMU_QEMU_DVD-ROM_______________________2.4.____\0.1.0)
8983@1445590131.814611:xen_platform_log xen platform: XENVBD|DriverEntry:8.1.0.32 (11/8/2015)
8983@1445590131.817739:xen_platform_log xen platform: XENVBD|__DriverParseParameterKey:DriverParameters: 
8983@1445590131.818127:xen_platform_log xen platform: XENDISK|DriverEntry:XENDISK 8.1.0 (32) (11.08.2015)
8983@1445590182.666305:xen_platform_log xen platform: XEN|DEBUG: ====> (xenbus.sys + 00000000000154F0)
8983@1445590182.666396:xen_platform_log xen platform: XENBUS|SUSPEND: Count = 0
8983@1445590182.666502:xen_platform_log xen platform: XENBUS|SUSPEND: EARLY: xenbus.sys + 0000000000008474 (FFFFE001EA7DCC10)
8983@1445590182.666608:xen_platform_log xen platform: XENBUS|SUSPEND: EARLY: xenbus.sys + 0000000000011FA8 (FFFFE001EA7DCDF0)
8983@1445590182.666712:xen_platform_log xen platform: XENBUS|SUSPEND: EARLY: xenbus.sys + 0000000000014D10 (FFFFE001E9A7F000)
8983@1445590182.666816:xen_platform_log xen platform: XENBUS|SUSPEND: LATE: xenbus.sys + 00000000000084C4 (FFFFE001EA7DCC10)
8983@1445590182.666920:xen_platform_log xen platform: XENBUS|SUSPEND: LATE: xenbus.sys + 0000000000014D50 (FFFFE001E9A7F000)
8983@1445590182.667024:xen_platform_log xen platform: XENBUS|SUSPEND: LATE: xenbus.sys + 000000000000E080 (FFFFE001EA7DD610)
8983@1445590182.667086:xen_platform_log xen platform: XEN|DEBUG: <==== (xenbus.sys + 00000000000154F0)
8983@1445590182.667147:xen_platform_log xen platform: XEN|DEBUG: ====> (xenbus.sys + 000000000001655C)
8983@1445590182.667218:xen_platform_log xen platform: XENBUS|RANGE_SET: RANGE SETS:
8983@1445590182.667296:xen_platform_log xen platform: XENBUS|RANGE_SET:  - io_space:
8983@1445590182.667384:xen_platform_log xen platform: XENBUS|RANGE_SET:    {f8001000 - f8ffffff}*
8983@1445590182.667473:xen_platform_log xen platform: XENBUS|RANGE_SET:  - balloon:
8983@1445590182.667543:xen_platform_log xen platform: XENBUS|RANGE_SET:    EMPTY
8983@1445590182.667604:xen_platform_log xen platform: XEN|DEBUG: <==== (xenbus.sys + 000000000001655C)
8983@1445590182.667663:xen_platform_log xen platform: XEN|DEBUG: ====> (xenbus.sys + 0000000000007800)
8983@1445590182.667735:xen_platform_log xen platform: XENBUS|EVTCHN: EVENT CHANNELS:
8983@1445590182.667832:xen_platform_log xen platform: XENBUS|EVTCHN: - (0001) BY xenbus.sys + 000000000001417D ACTIVE
8983@1445590182.667900:xen_platform_log xen platform: XENBUS|EVTCHN: FIXED
8983@1445590182.667970:xen_platform_log xen platform: XENBUS|EVTCHN: Events = 18
8983@1445590182.668067:xen_platform_log xen platform: XENBUS|EVTCHN: - (0006) BY xenbus.sys + 000000000000AC7C ACTIVE
8983@1445590182.668141:xen_platform_log xen platform: XENBUS|EVTCHN: VIRQ: Index = 1
8983@1445590182.668210:xen_platform_log xen platform: XENBUS|EVTCHN: Events = 0
8983@1445590182.668270:xen_platform_log xen platform: XEN|DEBUG: <==== (xenbus.sys + 0000000000007800)
8983@1445590182.668330:xen_platform_log xen platform: XEN|DEBUG: ====> (xenbus.sys + 0000000000011C08)
8983@1445590182.668417:xen_platform_log xen platform: XENBUS|SHARED_INFO: Address = 00000000.f8000000
8983@1445590182.668479:xen_platform_log xen platform: XEN|DEBUG: <==== (xenbus.sys + 0000000000011C08)
8983@1445590182.668539:xen_platform_log xen platform: XEN|DEBUG: ====> (xenbus.sys + 0000000000013E64)
8983@1445590182.668622:xen_platform_log xen platform: XENBUS|STORE: Address = 00000000.feffc000
8983@1445590182.668710:xen_platform_log xen platform: XENBUS|STORE: Events = 18 Dpcs = 1 Polls = 21
8983@1445590182.668779:xen_platform_log xen platform: XENBUS|STORE: WATCHES:
8983@1445590182.668883:xen_platform_log xen platform: XENBUS|STORE: - (FB2C) ON device BY xenbus.sys + 000000000000ACCD [ACTIVE]
8983@1445590182.668995:xen_platform_log xen platform: XENBUS|STORE: - (FB2D) ON control/shutdown BY xenbus.sys + 000000000000AD09 [ACTIVE]
8983@1445590182.669104:xen_platform_log xen platform: XENBUS|STORE: - (FB2E) ON memory/target BY xenbus.sys + 000000000000AD7C [ACTIVE]
8983@1445590182.669166:xen_platform_log xen platform: XEN|DEBUG: <==== (xenbus.sys + 0000000000013E64)
8983@1445590182.669243:xen_platform_log xen platform: XEN|BUGCHECK: ====>
8983@1445590182.669395:xen_platform_log xen platform: XEN|BUGCHECK: INACCESSIBLE_BOOT_DEVICE: FFFFD001761AE940 FFFFFFFFC0000034 0000000000000000 0000000000000000
8983@1445590182.669501:xen_platform_log xen platform: XEN|BUGCHECK: \ArcName\multi(0)disk(0)rdisk(0)partition(2)
8983@1445590182.669589:xen_platform_log xen platform: XEN|BUGCHECK: CONTEXT (FFFFD001761ADC40):
8983@1445590182.669661:xen_platform_log xen platform: XEN|BUGCHECK: - GS = 002B
8983@1445590182.669733:xen_platform_log xen platform: XEN|BUGCHECK: - FS = 0053
8983@1445590182.669805:xen_platform_log xen platform: XEN|BUGCHECK: - ES = 002B
8983@1445590182.669877:xen_platform_log xen platform: XEN|BUGCHECK: - DS = 002B
8983@1445590182.669949:xen_platform_log xen platform: XEN|BUGCHECK: - SS = 0018
8983@1445590182.670021:xen_platform_log xen platform: XEN|BUGCHECK: - CS = 0010
8983@1445590182.670100:xen_platform_log xen platform: XEN|BUGCHECK: - EFLAGS = 00000086
8983@1445590182.670185:xen_platform_log xen platform: XEN|BUGCHECK: - RDI = 00000000761AE940
8983@1445590182.670269:xen_platform_log xen platform: XEN|BUGCHECK: - RSI = 00000000C0000034
8983@1445590182.670354:xen_platform_log xen platform: XEN|BUGCHECK: - RBX = 00000000C74C0A30
8983@1445590182.670438:xen_platform_log xen platform: XEN|BUGCHECK: - RDX = 0000000000000000
8983@1445590182.670522:xen_platform_log xen platform: XEN|BUGCHECK: - RCX = 00000000761ADC40
8983@1445590182.670606:xen_platform_log xen platform: XEN|BUGCHECK: - RAX = 000000000000000F
8983@1445590182.670689:xen_platform_log xen platform: XEN|BUGCHECK: - RBP = 0000000000000000
8983@1445590182.670774:xen_platform_log xen platform: XEN|BUGCHECK: - RIP = 00000000C74B5C42
8983@1445590182.670864:xen_platform_log xen platform: XEN|BUGCHECK: - RSP = 00000000761ADC20
8983@1445590182.670947:xen_platform_log xen platform: XEN|BUGCHECK: - R8 = 0000000000000000
8983@1445590182.671030:xen_platform_log xen platform: XEN|BUGCHECK: - R9 = 0000000000000000
8983@1445590182.671114:xen_platform_log xen platform: XEN|BUGCHECK: - R10 = 0000000000000100
8983@1445590182.671198:xen_platform_log xen platform: XEN|BUGCHECK: - R11 = 0000000000000000
8983@1445590182.671282:xen_platform_log xen platform: XEN|BUGCHECK: - R12 = 000000000000007B
8983@1445590182.671367:xen_platform_log xen platform: XEN|BUGCHECK: - R13 = 00000000761AE901
8983@1445590182.671451:xen_platform_log xen platform: XEN|BUGCHECK: - R14 = 0000000000000000
8983@1445590182.671535:xen_platform_log xen platform: XEN|BUGCHECK: - R15 = 00000000EA7DCF98
8983@1445590182.671602:xen_platform_log xen platform: XEN|BUGCHECK: STACK:
8983@1445590182.671774:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AE130: (0000000000000003 00000000C74B9790 00000000C74B8F20 00000000C74BE3A0) xen.sys + 0000000000005FDD
8983@1445590182.671954:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AE180: (00000000C74C1460 00000000761AE2C0 0000000000000040 000000000E6D9AA0) ntoskrnl.exe + 00000000001ADF7D
8983@1445590182.672130:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AE1C0: (00000000C74C1460 000000000E6D9AA0 0000000000000000 0000000000000001) ntoskrnl.exe + 00000000001AD27D
8983@1445590182.672307:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AE8D0: (00000000761AE940 000000000E7A68B1 0000000000000000 00000000C0000034) ntoskrnl.exe + 000000000013E554
8983@1445590182.672483:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AE910: (000000000000007B 00000000761AE940 00000000C0000034 0000000000000000) ntoskrnl.exe + 0000000000189F9B
8983@1445590182.672659:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AE990: (00000000E681D460 00000000800001B0 00000000E681D460 00000000FFE17B80) ntoskrnl.exe + 00000000007450AD
8983@1445590182.672835:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AEBD0: (00000000E9BF8040 000000000E6EBF00 0000000000000006 000000000CF41D30) ntoskrnl.exe + 00000000007343FD
8983@1445590182.673013:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AECF0: (0000000010137070 000000000CF41D30 000000000E8F3098 0000000000000CF9) ntoskrnl.exe + 0000000000729F69
8983@1445590182.673190:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AED20: (000000000001D804 000000000CF41D30 000000000E8F3098 000000000CF41D30) ntoskrnl.exe + 00000000004EE0C2
8983@1445590182.673366:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AED50: (00000000E9A285C0 00000000000633C4 000000000001E310 000000000001E310) ntoskrnl.exe + 00000000000E1A95
8983@1445590182.673553:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AEDA0: (000000000E711180 00000000E9A285C0 000000000E4E6A54 0000000000071C4C) ntoskrnl.exe + 00000000001435F6
8983@1445590182.673716:xen_platform_log xen platform: XEN|BUGCHECK: 00000000761AEDD0: (00000000761AF000 00000000761A9000 0000000000000000 0000000000000000) 0000000000000000
8983@1445590182.673783:xen_platform_log xen platform: XEN|BUGCHECK: <====
Issued domain 8 reboot
qemu: terminating on signal 1 from pid 8811
red_channel_client_disconnect_dummy: rcc=0x55efd47b1ee0 (channel=0x55efd52a3080 type=5 id=0)
snd_channel_put: SndChannel=0x55efd52a5a20 freed
red_channel_client_disconnect_dummy: rcc=0x55efd5215270 (channel=0x55efd52a51b0 type=6 id=0)
snd_channel_put: SndChannel=0x55efd509d420 freed

--------------040909010706090107090300
Content-Type: text/plain; charset=UTF-8;
 name="W10.cfg"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="W10.cfg"

name='W10'
builder="hvm"
#device_model_override="/usr/lib/xen/bin/qemu-gdb"
memory=4096
vcpus=2
acpi_s3=0
acpi_s4=0
vif=['bridge=xenbr0,mac=00:16:3e:fe:7a:b9']
#disk=['/mnt/vm/disks/W10.disk1.xm,raw,hda,rw',',raw,hdb,ro,cdrom']
disk=['/mnt/vm/disks/W10.disk1.cow-sn1,qcow2,hda,rw',',raw,hdb,ro,cdrom']
boot='cd'
device_model_version="qemu-xen"
viridian=1
xen_platform_pci=1
vnc=0
keymap="it"
on_crash="destroy"
vga="qxl"
spice=1
spicehost='0.0.0.0'
spiceport=6000
spicedisable_ticketing=1
spicevdagent=1
spice_clipboard_sharing=0
spiceusbredirection=4
soundhw="hda"
localtime=1
ms_vm_genid="generate"

device_model_args=["-trace","events=/etc/xen/qemu-trace-options"]


--------------040909010706090107090300
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
--------------040909010706090107090300--


From win-pv-devel-bounces@lists.xenproject.org Fri Oct 23 09:33:44 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 09:33: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 1ZpYjH-0001BW-Eh; Fri, 23 Oct 2015 09:33:43 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7314647ef=Paul.Durrant@citrix.com>)
	id 1ZpYjG-0001BI-SM
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 09:33:43 +0000
Received: from [85.158.137.68] by server-6.bemta-3.messagelabs.com id
	8C/1A-29649-6FEF9265; Fri, 23 Oct 2015 09:33:42 +0000
X-Env-Sender: prvs=7314647ef=Paul.Durrant@citrix.com
X-Msg-Ref: server-4.tower-31.messagelabs.com!1445592821!54768519!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=1.7 required=7.0 tests=BIZ_TLD,received_headers: 
	No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10593 invoked from network); 23 Oct 2015 09:33:41 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-4.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 09:33:41 -0000
X-IronPort-AV: E=Sophos;i="5.20,186,1444694400"; 
   d="scan'208";a="5979133"
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: winpv drivers update still don't works correctly and domUs
	unable to boot on next reboot
Thread-Index: AQHRDXNjXLsQhDl5akuQ2SO58eBnM554zt+g
Date: Fri, 23 Oct 2015 09:33:12 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F622531@AMSPEX01CL01.citrite.net>
References: <5629FAAE.8090700@m2r.biz>
In-Reply-To: <5629FAAE.8090700@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] winpv drivers update still don't works correctly
 and domUs unable to boot on next reboot
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: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
> Sent: 23 October 2015 10:15
> To: win-pv-devel@lists.xenproject.org
> Cc: Paul Durrant
> Subject: winpv drivers update still don't works correctly and domUs unable to
> boot on next reboot
> 
> In many months I have tried numerous times with numerous winpv builds on
> windows update 7/8/10 but most of the time still using earlier builds
> for one or more components, and often the next reboot fails to boot.

You have a driver incompatibility problem. You have a XENBUS 8.2.0 from 22nd October, but a XENVBD 8.1.0 from 11th August. So, I think what's happing is that the old XENVBD is unable to bind to the PDO created by the newer XENBUS, hence no FDO is being created, hence no disk PDOs are being created, hence you have no system disk and you get a 0x7B BSOD.

  Paul

> 
> In my latest test:
> Dom0:
> Wheezy (debian 7) 64 bit with xen 4.6.0 plus some small additional patches:
> https://github.com/Fantu/Xen/commits/rebase/m2r-testing-4.6
> kernel is custom build of 4.1.8 with .config in attachment
> Qemu 2.4 with some small additional patches:
> https://github.com/Fantu/qemu/commits/rebase/upstream
> Seabios 1.8.2
> 
> DomU:
> windows 10 pro 64 bit
> xl cfg in attachment
> 
> I updated all winpv components to latest build without saw errors but on
> reboot windows fails to boot, in qemu log I saw a trace about and also
> the still use older build of at least one component.
> Full qemu log with trace in attachment.
> I had similar problem many time with different versions of xen, qemu,
> seabios, winpv, windows ecc...
> I also already did at least one other report about time ago if I
> remember good.
> 
> 
> If you need more informations/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 Fri Oct 23 09:33:44 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 09:33: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 1ZpYjH-0001BW-Eh; Fri, 23 Oct 2015 09:33:43 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7314647ef=Paul.Durrant@citrix.com>)
	id 1ZpYjG-0001BI-SM
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 09:33:43 +0000
Received: from [85.158.137.68] by server-6.bemta-3.messagelabs.com id
	8C/1A-29649-6FEF9265; Fri, 23 Oct 2015 09:33:42 +0000
X-Env-Sender: prvs=7314647ef=Paul.Durrant@citrix.com
X-Msg-Ref: server-4.tower-31.messagelabs.com!1445592821!54768519!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=1.7 required=7.0 tests=BIZ_TLD,received_headers: 
	No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10593 invoked from network); 23 Oct 2015 09:33:41 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-4.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 09:33:41 -0000
X-IronPort-AV: E=Sophos;i="5.20,186,1444694400"; 
   d="scan'208";a="5979133"
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: winpv drivers update still don't works correctly and domUs
	unable to boot on next reboot
Thread-Index: AQHRDXNjXLsQhDl5akuQ2SO58eBnM554zt+g
Date: Fri, 23 Oct 2015 09:33:12 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F622531@AMSPEX01CL01.citrite.net>
References: <5629FAAE.8090700@m2r.biz>
In-Reply-To: <5629FAAE.8090700@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] winpv drivers update still don't works correctly
 and domUs unable to boot on next reboot
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: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
> Sent: 23 October 2015 10:15
> To: win-pv-devel@lists.xenproject.org
> Cc: Paul Durrant
> Subject: winpv drivers update still don't works correctly and domUs unable to
> boot on next reboot
> 
> In many months I have tried numerous times with numerous winpv builds on
> windows update 7/8/10 but most of the time still using earlier builds
> for one or more components, and often the next reboot fails to boot.

You have a driver incompatibility problem. You have a XENBUS 8.2.0 from 22nd October, but a XENVBD 8.1.0 from 11th August. So, I think what's happing is that the old XENVBD is unable to bind to the PDO created by the newer XENBUS, hence no FDO is being created, hence no disk PDOs are being created, hence you have no system disk and you get a 0x7B BSOD.

  Paul

> 
> In my latest test:
> Dom0:
> Wheezy (debian 7) 64 bit with xen 4.6.0 plus some small additional patches:
> https://github.com/Fantu/Xen/commits/rebase/m2r-testing-4.6
> kernel is custom build of 4.1.8 with .config in attachment
> Qemu 2.4 with some small additional patches:
> https://github.com/Fantu/qemu/commits/rebase/upstream
> Seabios 1.8.2
> 
> DomU:
> windows 10 pro 64 bit
> xl cfg in attachment
> 
> I updated all winpv components to latest build without saw errors but on
> reboot windows fails to boot, in qemu log I saw a trace about and also
> the still use older build of at least one component.
> Full qemu log with trace in attachment.
> I had similar problem many time with different versions of xen, qemu,
> seabios, winpv, windows ecc...
> I also already did at least one other report about time ago if I
> remember good.
> 
> 
> If you need more informations/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 Fri Oct 23 10:14:08 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 10:14: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 1ZpZMN-0006nO-Ag; Fri, 23 Oct 2015 10:14: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 1ZpZML-0006n2-Jl
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 10:14:05 +0000
Received: from [193.109.254.147] by server-8.bemta-14.messagelabs.com id
	A4/EF-19110-C680A265; Fri, 23 Oct 2015 10:14:04 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-3.tower-27.messagelabs.com!1445595243!60820213!1
X-Originating-IP: [209.85.212.175]
X-SpamReason: No, hits=1.7 required=7.0 tests=BIZ_TLD
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24994 invoked from network); 23 Oct 2015 10:14:03 -0000
Received: from mail-wi0-f175.google.com (HELO mail-wi0-f175.google.com)
	(209.85.212.175)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 10:14:03 -0000
Received: by wikq8 with SMTP id q8so69735856wik.1
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 23 Oct 2015 03:14:03 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=m2r_biz.20150623.gappssmtp.com; s=20150623;
	h=subject:to:references:from:message-id:date:user-agent:mime-version
	:in-reply-to:content-type:content-transfer-encoding;
	bh=V6E4gOBt9lVNIYuRht7Tb5WGemtmrLFYSrFTFQLGo+I=;
	b=OQz7EYRlJqCHjDvlDeSakfri6xY9uWep45JmQAXo9QgdSUE+9l0u0oV5bwbajZTAma
	pFWY0qxizsmTlfYoPkveCHJOdwvmDtU/DHwgaIM73o1E/a0NYMO361fpfnFx+Td617yw
	F0YR6y4Ab/TQNza+YS5Y33Nv5qDy2/IS4j3c7Yp3daCgi6ji46ZN8kehIM13n5prHhlW
	3l82eERDmmOuNcS8hV05BTbUES26l+TI/3cO+9dLHxeWu4CK1b1Xna/BFx82nwh4pnYv
	1nmuVmd102aZVjqx8pKPzVf29/XxP/s7dOhTcAkMkRAJsXtdyPEHw9lB+ZkT8ie9757v
	ogUw==
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=V6E4gOBt9lVNIYuRht7Tb5WGemtmrLFYSrFTFQLGo+I=;
	b=BRsPCQOZSBaql+DpOdq53YzPbWIc+h/Z35cTrMRiCmVRDroWsGcmeX9ToQ+pDB0rxz
	M3wqaQpes3WQRemcAJfRTrCk/cKFN+Bqd/1K5ZHcAZQA+9XRDk6jjl+AMCP5sCLH5ucY
	EkqarfWeDh3xZWFqZ3L9UtLwCp1hkpCHSAHXe/BMw0b6n+/8+YgRA4iM45acx8tQuErm
	oKpKzURDNauvscTw+jAKhYlK9equh6GOJM26ryu9elsMbt6fT2FyStPxwmlNeVdUws/9
	YLyCUtZKcEUjV9gFe3LuymZJMnHi40q7yde/iv8Yt7zOmd8Ioq0tQBvlcZKb/nVsAOsY
	0Q6w==
X-Gm-Message-State: ALoCoQlbgeISe5CqTzNPIzQKnur3fhLcRN6Tue7NXYkqihbg7+e1DGAgU2hO0zF0FR73F3BJETyN
X-Received: by 10.194.62.112 with SMTP id x16mr26765989wjr.132.1445595243219; 
	Fri, 23 Oct 2015 03:14:03 -0700 (PDT)
Received: from [192.168.1.37] (ip-73-126.sn2.eutelia.it. [83.211.73.126])
	by smtp.googlemail.com with ESMTPSA id
	fp4sm2401414wib.24.2015.10.23.03.14.01
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 23 Oct 2015 03:14:02 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <5629FAAE.8090700@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622531@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <562A0875.20008@m2r.biz>
Date: Fri, 23 Oct 2015 12:14:13 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F622531@AMSPEX01CL01.citrite.net>
Subject: Re: [win-pv-devel] winpv drivers update still don't works correctly
 and domUs unable to boot on next reboot
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 23/10/2015 11:33, Paul Durrant ha scritto:
>> -----Original Message-----
>> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
>> Sent: 23 October 2015 10:15
>> To: win-pv-devel@lists.xenproject.org
>> Cc: Paul Durrant
>> Subject: winpv drivers update still don't works correctly and domUs unable to
>> boot on next reboot
>>
>> In many months I have tried numerous times with numerous winpv builds on
>> windows update 7/8/10 but most of the time still using earlier builds
>> for one or more components, and often the next reboot fails to boot.
> You have a driver incompatibility problem. You have a XENBUS 8.2.0 from 22nd October, but a XENVBD 8.1.0 from 11th August. So, I think what's happing is that the old XENVBD is unable to bind to the PDO created by the newer XENBUS, hence no FDO is being created, hence no disk PDOs are being created, hence you have no system disk and you get a 0x7B BSOD.
>
>    Paul

Even if I updated ALL the component (so all the same build), also in 
case of same "major version" ( for example 8.1.0 (1) -> 8.1.0 (2) ), the 
domU uses one or more component at the older version.
For what I remember happen mainly for disks and network components.
In some case domU was still working even if it using old build of one or 
more components, in many other cases network or disks was not working 
(for disks the domU was unable to boot like this latest).
I already tried many tests for many hours in latest months trying to 
remove the drivers, also manually remove service, files, registry keys 
ecc... (after uninstall from windows control panel) but without found a 
secure update procedure because also in many remove cases windows was 
unable to boot.
If I understand good I suppose the mainly problems are that uninstaller 
(in windows control panel) doesn't remove all effective related things, 
and removing them manually if very difficult. It seems that winpv 
components coinstaller have something wrong or missed which make unable 
to use correctly the latest  builds and/or uninstall/update the drivers.

Thanks for any reply and sorry for my bad english.

>
>> In my latest test:
>> Dom0:
>> Wheezy (debian 7) 64 bit with xen 4.6.0 plus some small additional patches:
>> https://github.com/Fantu/Xen/commits/rebase/m2r-testing-4.6
>> kernel is custom build of 4.1.8 with .config in attachment
>> Qemu 2.4 with some small additional patches:
>> https://github.com/Fantu/qemu/commits/rebase/upstream
>> Seabios 1.8.2
>>
>> DomU:
>> windows 10 pro 64 bit
>> xl cfg in attachment
>>
>> I updated all winpv components to latest build without saw errors but on
>> reboot windows fails to boot, in qemu log I saw a trace about and also
>> the still use older build of at least one component.
>> Full qemu log with trace in attachment.
>> I had similar problem many time with different versions of xen, qemu,
>> seabios, winpv, windows ecc...
>> I also already did at least one other report about time ago if I
>> remember good.
>>
>>
>> If you need more informations/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 Fri Oct 23 10:14:08 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 10:14: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 1ZpZMN-0006nO-Ag; Fri, 23 Oct 2015 10:14: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 1ZpZML-0006n2-Jl
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 10:14:05 +0000
Received: from [193.109.254.147] by server-8.bemta-14.messagelabs.com id
	A4/EF-19110-C680A265; Fri, 23 Oct 2015 10:14:04 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-3.tower-27.messagelabs.com!1445595243!60820213!1
X-Originating-IP: [209.85.212.175]
X-SpamReason: No, hits=1.7 required=7.0 tests=BIZ_TLD
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24994 invoked from network); 23 Oct 2015 10:14:03 -0000
Received: from mail-wi0-f175.google.com (HELO mail-wi0-f175.google.com)
	(209.85.212.175)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 10:14:03 -0000
Received: by wikq8 with SMTP id q8so69735856wik.1
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 23 Oct 2015 03:14:03 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=m2r_biz.20150623.gappssmtp.com; s=20150623;
	h=subject:to:references:from:message-id:date:user-agent:mime-version
	:in-reply-to:content-type:content-transfer-encoding;
	bh=V6E4gOBt9lVNIYuRht7Tb5WGemtmrLFYSrFTFQLGo+I=;
	b=OQz7EYRlJqCHjDvlDeSakfri6xY9uWep45JmQAXo9QgdSUE+9l0u0oV5bwbajZTAma
	pFWY0qxizsmTlfYoPkveCHJOdwvmDtU/DHwgaIM73o1E/a0NYMO361fpfnFx+Td617yw
	F0YR6y4Ab/TQNza+YS5Y33Nv5qDy2/IS4j3c7Yp3daCgi6ji46ZN8kehIM13n5prHhlW
	3l82eERDmmOuNcS8hV05BTbUES26l+TI/3cO+9dLHxeWu4CK1b1Xna/BFx82nwh4pnYv
	1nmuVmd102aZVjqx8pKPzVf29/XxP/s7dOhTcAkMkRAJsXtdyPEHw9lB+ZkT8ie9757v
	ogUw==
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=V6E4gOBt9lVNIYuRht7Tb5WGemtmrLFYSrFTFQLGo+I=;
	b=BRsPCQOZSBaql+DpOdq53YzPbWIc+h/Z35cTrMRiCmVRDroWsGcmeX9ToQ+pDB0rxz
	M3wqaQpes3WQRemcAJfRTrCk/cKFN+Bqd/1K5ZHcAZQA+9XRDk6jjl+AMCP5sCLH5ucY
	EkqarfWeDh3xZWFqZ3L9UtLwCp1hkpCHSAHXe/BMw0b6n+/8+YgRA4iM45acx8tQuErm
	oKpKzURDNauvscTw+jAKhYlK9equh6GOJM26ryu9elsMbt6fT2FyStPxwmlNeVdUws/9
	YLyCUtZKcEUjV9gFe3LuymZJMnHi40q7yde/iv8Yt7zOmd8Ioq0tQBvlcZKb/nVsAOsY
	0Q6w==
X-Gm-Message-State: ALoCoQlbgeISe5CqTzNPIzQKnur3fhLcRN6Tue7NXYkqihbg7+e1DGAgU2hO0zF0FR73F3BJETyN
X-Received: by 10.194.62.112 with SMTP id x16mr26765989wjr.132.1445595243219; 
	Fri, 23 Oct 2015 03:14:03 -0700 (PDT)
Received: from [192.168.1.37] (ip-73-126.sn2.eutelia.it. [83.211.73.126])
	by smtp.googlemail.com with ESMTPSA id
	fp4sm2401414wib.24.2015.10.23.03.14.01
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 23 Oct 2015 03:14:02 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <5629FAAE.8090700@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622531@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <562A0875.20008@m2r.biz>
Date: Fri, 23 Oct 2015 12:14:13 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F622531@AMSPEX01CL01.citrite.net>
Subject: Re: [win-pv-devel] winpv drivers update still don't works correctly
 and domUs unable to boot on next reboot
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 23/10/2015 11:33, Paul Durrant ha scritto:
>> -----Original Message-----
>> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
>> Sent: 23 October 2015 10:15
>> To: win-pv-devel@lists.xenproject.org
>> Cc: Paul Durrant
>> Subject: winpv drivers update still don't works correctly and domUs unable to
>> boot on next reboot
>>
>> In many months I have tried numerous times with numerous winpv builds on
>> windows update 7/8/10 but most of the time still using earlier builds
>> for one or more components, and often the next reboot fails to boot.
> You have a driver incompatibility problem. You have a XENBUS 8.2.0 from 22nd October, but a XENVBD 8.1.0 from 11th August. So, I think what's happing is that the old XENVBD is unable to bind to the PDO created by the newer XENBUS, hence no FDO is being created, hence no disk PDOs are being created, hence you have no system disk and you get a 0x7B BSOD.
>
>    Paul

Even if I updated ALL the component (so all the same build), also in 
case of same "major version" ( for example 8.1.0 (1) -> 8.1.0 (2) ), the 
domU uses one or more component at the older version.
For what I remember happen mainly for disks and network components.
In some case domU was still working even if it using old build of one or 
more components, in many other cases network or disks was not working 
(for disks the domU was unable to boot like this latest).
I already tried many tests for many hours in latest months trying to 
remove the drivers, also manually remove service, files, registry keys 
ecc... (after uninstall from windows control panel) but without found a 
secure update procedure because also in many remove cases windows was 
unable to boot.
If I understand good I suppose the mainly problems are that uninstaller 
(in windows control panel) doesn't remove all effective related things, 
and removing them manually if very difficult. It seems that winpv 
components coinstaller have something wrong or missed which make unable 
to use correctly the latest  builds and/or uninstall/update the drivers.

Thanks for any reply and sorry for my bad english.

>
>> In my latest test:
>> Dom0:
>> Wheezy (debian 7) 64 bit with xen 4.6.0 plus some small additional patches:
>> https://github.com/Fantu/Xen/commits/rebase/m2r-testing-4.6
>> kernel is custom build of 4.1.8 with .config in attachment
>> Qemu 2.4 with some small additional patches:
>> https://github.com/Fantu/qemu/commits/rebase/upstream
>> Seabios 1.8.2
>>
>> DomU:
>> windows 10 pro 64 bit
>> xl cfg in attachment
>>
>> I updated all winpv components to latest build without saw errors but on
>> reboot windows fails to boot, in qemu log I saw a trace about and also
>> the still use older build of at least one component.
>> Full qemu log with trace in attachment.
>> I had similar problem many time with different versions of xen, qemu,
>> seabios, winpv, windows ecc...
>> I also already did at least one other report about time ago if I
>> remember good.
>>
>>
>> If you need more informations/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 Fri Oct 23 10:26:06 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 10:26:06 +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 1ZpZXy-0007zY-80; Fri, 23 Oct 2015 10:26:06 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7314647ef=Paul.Durrant@citrix.com>)
	id 1ZpZXx-0007zK-7s
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 10:26:05 +0000
Received: from [85.158.139.211] by server-3.bemta-5.messagelabs.com id
	54/37-06179-C3B0A265; Fri, 23 Oct 2015 10:26:04 +0000
X-Env-Sender: prvs=7314647ef=Paul.Durrant@citrix.com
X-Msg-Ref: server-6.tower-206.messagelabs.com!1445595963!44555033!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=1.7 required=7.0 tests=BIZ_TLD,received_headers: 
	No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26681 invoked from network); 23 Oct 2015 10:26:03 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-6.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 10:26:03 -0000
X-IronPort-AV: E=Sophos;i="5.20,186,1444694400"; 
   d="scan'208";a="5982483"
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] winpv drivers update still don't works
	correctly and domUs unable to boot on next reboot
Thread-Index: AQHRDXNjXLsQhDl5akuQ2SO58eBnM554zt+g///r1ICAACRMYA==
Date: Fri, 23 Oct 2015 10:25:59 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F622850@AMSPEX01CL01.citrite.net>
References: <5629FAAE.8090700@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622531@AMSPEX01CL01.citrite.net>
	<562A0875.20008@m2r.biz>
In-Reply-To: <562A0875.20008@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] winpv drivers update still don't works correctly
 and domUs unable to boot on next reboot
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: 23 October 2015 11:14
> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> Subject: Re: [win-pv-devel] winpv drivers update still don't works correctly
> and domUs unable to boot on next reboot
> 
> Il 23/10/2015 11:33, Paul Durrant ha scritto:
> >> -----Original Message-----
> >> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
> >> Sent: 23 October 2015 10:15
> >> To: win-pv-devel@lists.xenproject.org
> >> Cc: Paul Durrant
> >> Subject: winpv drivers update still don't works correctly and domUs
> unable to
> >> boot on next reboot
> >>
> >> In many months I have tried numerous times with numerous winpv builds
> on
> >> windows update 7/8/10 but most of the time still using earlier builds
> >> for one or more components, and often the next reboot fails to boot.
> > You have a driver incompatibility problem. You have a XENBUS 8.2.0 from
> 22nd October, but a XENVBD 8.1.0 from 11th August. So, I think what's
> happing is that the old XENVBD is unable to bind to the PDO created by the
> newer XENBUS, hence no FDO is being created, hence no disk PDOs are
> being created, hence you have no system disk and you get a 0x7B BSOD.
> >
> >    Paul
> 
> Even if I updated ALL the component (so all the same build), also in
> case of same "major version" ( for example 8.1.0 (1) -> 8.1.0 (2) ), the
> domU uses one or more component at the older version.
> For what I remember happen mainly for disks and network components.
> In some case domU was still working even if it using old build of one or
> more components, in many other cases network or disks was not working
> (for disks the domU was unable to boot like this latest).
> I already tried many tests for many hours in latest months trying to
> remove the drivers, also manually remove service, files, registry keys
> ecc... (after uninstall from windows control panel) but without found a
> secure update procedure because also in many remove cases windows was
> unable to boot.
> If I understand good I suppose the mainly problems are that uninstaller
> (in windows control panel) doesn't remove all effective related things,
> and removing them manually if very difficult. It seems that winpv
> components coinstaller have something wrong or missed which make unable
> to use correctly the latest  builds and/or uninstall/update the drivers.
> 
> Thanks for any reply and sorry for my bad english.

I tend to install using dpinst so when I remove I generally do it via the 'uninstall programs' pane in control panel. I then reboot to get back to emulated devices and only then do install newer PV drivers.

  Paul

> 
> >
> >> In my latest test:
> >> Dom0:
> >> Wheezy (debian 7) 64 bit with xen 4.6.0 plus some small additional
> patches:
> >> https://github.com/Fantu/Xen/commits/rebase/m2r-testing-4.6
> >> kernel is custom build of 4.1.8 with .config in attachment
> >> Qemu 2.4 with some small additional patches:
> >> https://github.com/Fantu/qemu/commits/rebase/upstream
> >> Seabios 1.8.2
> >>
> >> DomU:
> >> windows 10 pro 64 bit
> >> xl cfg in attachment
> >>
> >> I updated all winpv components to latest build without saw errors but on
> >> reboot windows fails to boot, in qemu log I saw a trace about and also
> >> the still use older build of at least one component.
> >> Full qemu log with trace in attachment.
> >> I had similar problem many time with different versions of xen, qemu,
> >> seabios, winpv, windows ecc...
> >> I also already did at least one other report about time ago if I
> >> remember good.
> >>
> >>
> >> If you need more informations/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

_______________________________________________
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 Oct 23 10:26:06 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 10:26:06 +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 1ZpZXy-0007zY-80; Fri, 23 Oct 2015 10:26:06 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7314647ef=Paul.Durrant@citrix.com>)
	id 1ZpZXx-0007zK-7s
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 10:26:05 +0000
Received: from [85.158.139.211] by server-3.bemta-5.messagelabs.com id
	54/37-06179-C3B0A265; Fri, 23 Oct 2015 10:26:04 +0000
X-Env-Sender: prvs=7314647ef=Paul.Durrant@citrix.com
X-Msg-Ref: server-6.tower-206.messagelabs.com!1445595963!44555033!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=1.7 required=7.0 tests=BIZ_TLD,received_headers: 
	No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26681 invoked from network); 23 Oct 2015 10:26:03 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-6.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 10:26:03 -0000
X-IronPort-AV: E=Sophos;i="5.20,186,1444694400"; 
   d="scan'208";a="5982483"
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] winpv drivers update still don't works
	correctly and domUs unable to boot on next reboot
Thread-Index: AQHRDXNjXLsQhDl5akuQ2SO58eBnM554zt+g///r1ICAACRMYA==
Date: Fri, 23 Oct 2015 10:25:59 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F622850@AMSPEX01CL01.citrite.net>
References: <5629FAAE.8090700@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622531@AMSPEX01CL01.citrite.net>
	<562A0875.20008@m2r.biz>
In-Reply-To: <562A0875.20008@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] winpv drivers update still don't works correctly
 and domUs unable to boot on next reboot
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: 23 October 2015 11:14
> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> Subject: Re: [win-pv-devel] winpv drivers update still don't works correctly
> and domUs unable to boot on next reboot
> 
> Il 23/10/2015 11:33, Paul Durrant ha scritto:
> >> -----Original Message-----
> >> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
> >> Sent: 23 October 2015 10:15
> >> To: win-pv-devel@lists.xenproject.org
> >> Cc: Paul Durrant
> >> Subject: winpv drivers update still don't works correctly and domUs
> unable to
> >> boot on next reboot
> >>
> >> In many months I have tried numerous times with numerous winpv builds
> on
> >> windows update 7/8/10 but most of the time still using earlier builds
> >> for one or more components, and often the next reboot fails to boot.
> > You have a driver incompatibility problem. You have a XENBUS 8.2.0 from
> 22nd October, but a XENVBD 8.1.0 from 11th August. So, I think what's
> happing is that the old XENVBD is unable to bind to the PDO created by the
> newer XENBUS, hence no FDO is being created, hence no disk PDOs are
> being created, hence you have no system disk and you get a 0x7B BSOD.
> >
> >    Paul
> 
> Even if I updated ALL the component (so all the same build), also in
> case of same "major version" ( for example 8.1.0 (1) -> 8.1.0 (2) ), the
> domU uses one or more component at the older version.
> For what I remember happen mainly for disks and network components.
> In some case domU was still working even if it using old build of one or
> more components, in many other cases network or disks was not working
> (for disks the domU was unable to boot like this latest).
> I already tried many tests for many hours in latest months trying to
> remove the drivers, also manually remove service, files, registry keys
> ecc... (after uninstall from windows control panel) but without found a
> secure update procedure because also in many remove cases windows was
> unable to boot.
> If I understand good I suppose the mainly problems are that uninstaller
> (in windows control panel) doesn't remove all effective related things,
> and removing them manually if very difficult. It seems that winpv
> components coinstaller have something wrong or missed which make unable
> to use correctly the latest  builds and/or uninstall/update the drivers.
> 
> Thanks for any reply and sorry for my bad english.

I tend to install using dpinst so when I remove I generally do it via the 'uninstall programs' pane in control panel. I then reboot to get back to emulated devices and only then do install newer PV drivers.

  Paul

> 
> >
> >> In my latest test:
> >> Dom0:
> >> Wheezy (debian 7) 64 bit with xen 4.6.0 plus some small additional
> patches:
> >> https://github.com/Fantu/Xen/commits/rebase/m2r-testing-4.6
> >> kernel is custom build of 4.1.8 with .config in attachment
> >> Qemu 2.4 with some small additional patches:
> >> https://github.com/Fantu/qemu/commits/rebase/upstream
> >> Seabios 1.8.2
> >>
> >> DomU:
> >> windows 10 pro 64 bit
> >> xl cfg in attachment
> >>
> >> I updated all winpv components to latest build without saw errors but on
> >> reboot windows fails to boot, in qemu log I saw a trace about and also
> >> the still use older build of at least one component.
> >> Full qemu log with trace in attachment.
> >> I had similar problem many time with different versions of xen, qemu,
> >> seabios, winpv, windows ecc...
> >> I also already did at least one other report about time ago if I
> >> remember good.
> >>
> >>
> >> If you need more informations/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

_______________________________________________
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 Oct 23 10:41:29 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 10:41:29 +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 1ZpZmq-0001u4-NN; Fri, 23 Oct 2015 10:41:28 +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 1ZpZmp-0001tj-UD
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 10:41:28 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	7A/71-22142-7DE0A265; Fri, 23 Oct 2015 10:41:27 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-13.tower-206.messagelabs.com!1445596886!14668688!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 29214 invoked from network); 23 Oct 2015 10:41:26 -0000
Received: from mail-wi0-f170.google.com (HELO mail-wi0-f170.google.com)
	(209.85.212.170)
	by server-13.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 10:41:26 -0000
Received: by wicll6 with SMTP id ll6so25546996wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 23 Oct 2015 03:41:26 -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=ujz7WWnAcnUiSy61bsIfSHYIZeFU1fKb5MtrSURkt+s=;
	b=uLPpuOnO4takzoQiEkLEU5SCY7iEyCZso6txhUgdSCn2OxGnQsLoiT7RSQmf1sU2TB
	dvXiJ0gVleVgG708b1RCYyvlTZpVbBs4mH7a7Db4OouQtG+c5qAHt2kfYWVkdL+Ofr+J
	wDEsGnNM0lJtWL8sTr9duHDxcLS9FR/EW3ImcgCJT+ml5+aBGLOWPypw7ccPq3KwwqH6
	6doE4iDJBDs1ghJ1hn6VnZGyx8YS/sj1M6CgBUFUrZGzwPNQIUDv1B69nggQI4UOASMf
	7zqzND0sdjmuKPA5cSKaCIDvfF42s+vKX13fqtxZ/cy2iIUeqhvItukamISa7eapQ/X9
	TzgA==
X-Received: by 10.180.187.237 with SMTP id fv13mr3976099wic.81.1445596886054; 
	Fri, 23 Oct 2015 03:41:26 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	vr10sm21981371wjc.38.2015.10.23.03.41.25
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 23 Oct 2015 03:41:25 -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, 23 Oct 2015 11:41:34 +0100
Message-Id: <1445596894-9792-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] Dump information about viridian
	enlightenments
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

Sometimes, for diagnosis, it's useful to have a log of what viridian
enlightenments are visiable to a VM. This patch adds new code into the
XEN system module to dump relevant information at boot time.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xen/hypercall.c |   4 +
 src/xen/system.c    | 231 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 235 insertions(+)

diff --git a/src/xen/hypercall.c b/src/xen/hypercall.c
index 5f14caa..7003687 100644
--- a/src/xen/hypercall.c
+++ b/src/xen/hypercall.c
@@ -107,6 +107,10 @@ HypercallInitialize(
             goto fail1;
     }
 
+    LogPrintf(LOG_LEVEL_INFO,
+              "XEN: BASE CPUID LEAF @ %08x\n",
+              XenBaseLeaf);
+
     if ((ULONG_PTR)__Section & (PAGE_SIZE - 1))
         Hypercall = (PVOID)(((ULONG_PTR)__Section + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1));
     else
diff --git a/src/xen/system.c b/src/xen/system.c
index 1a788ce..1934011 100644
--- a/src/xen/system.c
+++ b/src/xen/system.c
@@ -329,6 +329,222 @@ SystemApicIDToProcessorID(
 
 #pragma warning(pop)
 
+static VOID
+SystemViridianInformation(
+    IN  ULONG   Count
+    )
+{
+    ULONG       EAX;
+    ULONG       EBX;
+    CHAR        Signature[5];
+    ULONG       Bit;
+
+    Info("====>\n");
+
+    if (Count < 1)
+        goto done;
+
+    RtlZeroMemory(Signature, sizeof (Signature));
+
+    __CpuId(0x40000001, &EAX, NULL, NULL, NULL);
+
+    *((PULONG)(Signature + 0)) = EAX;
+
+    Info("Interface Identifier: %s\n", Signature);
+
+    if (strcmp(Signature, "Hv#1") != 0)
+        goto done;
+
+    if (Count < 3)
+        goto done;
+
+    __CpuId(0x40000003, &EAX, NULL, NULL, NULL);
+
+    Info("Hypervisor Features:\n");
+
+    for (Bit = 0; Bit < sizeof (ULONG) * 8; Bit++) {
+        if (EAX == 0)
+            break;
+
+        if (EAX & 1) {
+            switch (Bit) {
+            case 0:
+                Info(" - VP Runtime\n");
+                break;
+
+            case 1:
+                Info(" - Partition Reference Counter\n");
+                break;
+
+            case 2:
+                Info(" - Basic SynIC MSRs\n");
+                break;
+
+            case 3:
+                Info(" - Synthetic Timer MSRs\n");
+                break;
+
+            case 4:
+                Info(" - APIC Access MSRs\n");
+                break;
+
+            case 5:
+                Info(" - Hypercall MSRs\n");
+                break;
+
+            case 6:
+                Info(" - Virtual Processor Index MSR\n");
+                break;
+
+            case 7:
+                Info(" - Virtual System Reset MSR\n");
+                break;
+
+            case 8:
+                Info(" - Statistics Pages MSRs\n");
+                break;
+
+            case 9:
+                Info(" - Partition Reference TSC MSR\n");
+                break;
+
+            case 10:
+                Info(" - Guest Idle State MSR\n");
+                break;
+
+            case 11:
+                Info(" - Timer Frequency MSR\n");
+                break;
+
+            case 12:
+                Info(" - Debug MSRs\n");
+                break;
+
+            default:
+                break;
+            }
+        }
+
+        EAX >>= 1;
+    }
+
+    if (Count < 4)
+        goto done;
+
+    __CpuId(0x40000004, &EAX, &EBX, NULL, NULL);
+
+    Info("Recommendations:\n");
+
+    for (Bit = 0; Bit < sizeof (ULONG) * 8; Bit++) {
+        if (EAX == 0)
+            break;
+
+        if (EAX & 1) {
+            switch (Bit) {
+            case 0:
+                Info(" - Address space switch via hypercall\n");
+                break;
+
+            case 1:
+                Info(" - Local TLB flush via hypercall\n");
+                break;
+
+            case 2:
+                Info(" - Remote TLB flush via hypercall\n");
+                break;
+
+            case 3:
+                Info(" - EOI, ICR and TPR access via MSR\n");
+                break;
+
+            case 4:
+                Info(" - Reset via MSR\n");
+                break;
+
+            case 5:
+                Info(" - Use relaxed timing\n");
+                break;
+
+            case 6:
+                Info(" - Use DMA remapping\n");
+                break;
+
+            case 7:
+                Info(" - Use interrupt remapping\n");
+                break;
+
+            case 8:
+                Info(" - Use x2APIC MSRs\n");
+                break;
+
+            case 9:
+                Info(" - Deprecate AutoEOI\n");
+                break;
+
+            default:
+                break;
+            }
+        }
+
+        EAX >>= 1;
+    }
+
+    if (EBX != 0xFFFFFFFF)
+        Info(" - Retry spinlocks %u times\n", EBX);
+
+    if (Count < 6)
+        goto done;
+
+    __CpuId(0x40000006, &EAX, NULL, NULL, NULL);
+
+    Info("Hardware Features:\n");
+
+    for (Bit = 0; Bit < sizeof (ULONG) * 8; Bit++) {
+        if (EAX == 0)
+            break;
+
+        if (EAX & 1) {
+            switch (Bit) {
+            case 0:
+                Info(" - APIC overlay assist\n");
+                break;
+
+            case 1:
+                Info(" - MSR bitmaps\n");
+                break;
+
+            case 2:
+                Info(" - Architectural performance counters\n");
+                break;
+
+            case 3:
+                Info(" - Second Level Address Translation (SLAT)\n");
+                break;
+
+            case 4:
+                Info(" - DMA remapping\n");
+                break;
+
+            case 5:
+                Info(" - Interrupt remapping\n");
+                break;
+
+            case 6:
+                Info(" - Memory Patrol Scrubber\n");
+                break;
+
+            default:
+                break;
+            }
+        }
+
+        EAX >>= 1;
+    }
+
+done:
+    Info("<====\n");
+}
+
 static
 _Function_class_(KDEFERRED_ROUTINE)
 _IRQL_requires_max_(DISPATCH_LEVEL)
@@ -348,6 +564,7 @@ SystemProcessorInformation(
     ULONG               Index;
     PROCESSOR_NUMBER    ProcNumber;
     PSYSTEM_PROCESSOR   Processor;
+    ULONG               EAX;
     ULONG               EBX;
     ULONG               ECX;
     ULONG               EDX;
@@ -361,6 +578,20 @@ SystemProcessorInformation(
 
     Processor = &Context->Processor[Index];
 
+    if (Index == 0) {
+        CHAR    Signature[13];
+
+        RtlZeroMemory(Signature, sizeof (Signature));
+
+        __CpuId(0x40000000, &EAX, &EBX, &ECX, &EDX);
+        *((PULONG)(Signature + 0)) = EBX;
+        *((PULONG)(Signature + 4)) = ECX;
+        *((PULONG)(Signature + 8)) = EDX;
+
+        if (strcmp(Signature, "Microsoft Hv") == 0)
+            SystemViridianInformation(EAX - 0x40000000);
+    }
+
     Info("====> (%u:%u)\n", ProcNumber.Group, ProcNumber.Number);
 
     __CpuId(0, NULL, &EBX, &ECX, &EDX);
-- 
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 Oct 23 10:41:29 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 10:41:29 +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 1ZpZmq-0001u4-NN; Fri, 23 Oct 2015 10:41:28 +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 1ZpZmp-0001tj-UD
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 10:41:28 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	7A/71-22142-7DE0A265; Fri, 23 Oct 2015 10:41:27 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-13.tower-206.messagelabs.com!1445596886!14668688!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 29214 invoked from network); 23 Oct 2015 10:41:26 -0000
Received: from mail-wi0-f170.google.com (HELO mail-wi0-f170.google.com)
	(209.85.212.170)
	by server-13.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 10:41:26 -0000
Received: by wicll6 with SMTP id ll6so25546996wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 23 Oct 2015 03:41:26 -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=ujz7WWnAcnUiSy61bsIfSHYIZeFU1fKb5MtrSURkt+s=;
	b=uLPpuOnO4takzoQiEkLEU5SCY7iEyCZso6txhUgdSCn2OxGnQsLoiT7RSQmf1sU2TB
	dvXiJ0gVleVgG708b1RCYyvlTZpVbBs4mH7a7Db4OouQtG+c5qAHt2kfYWVkdL+Ofr+J
	wDEsGnNM0lJtWL8sTr9duHDxcLS9FR/EW3ImcgCJT+ml5+aBGLOWPypw7ccPq3KwwqH6
	6doE4iDJBDs1ghJ1hn6VnZGyx8YS/sj1M6CgBUFUrZGzwPNQIUDv1B69nggQI4UOASMf
	7zqzND0sdjmuKPA5cSKaCIDvfF42s+vKX13fqtxZ/cy2iIUeqhvItukamISa7eapQ/X9
	TzgA==
X-Received: by 10.180.187.237 with SMTP id fv13mr3976099wic.81.1445596886054; 
	Fri, 23 Oct 2015 03:41:26 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	vr10sm21981371wjc.38.2015.10.23.03.41.25
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 23 Oct 2015 03:41:25 -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, 23 Oct 2015 11:41:34 +0100
Message-Id: <1445596894-9792-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] Dump information about viridian
	enlightenments
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

Sometimes, for diagnosis, it's useful to have a log of what viridian
enlightenments are visiable to a VM. This patch adds new code into the
XEN system module to dump relevant information at boot time.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xen/hypercall.c |   4 +
 src/xen/system.c    | 231 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 235 insertions(+)

diff --git a/src/xen/hypercall.c b/src/xen/hypercall.c
index 5f14caa..7003687 100644
--- a/src/xen/hypercall.c
+++ b/src/xen/hypercall.c
@@ -107,6 +107,10 @@ HypercallInitialize(
             goto fail1;
     }
 
+    LogPrintf(LOG_LEVEL_INFO,
+              "XEN: BASE CPUID LEAF @ %08x\n",
+              XenBaseLeaf);
+
     if ((ULONG_PTR)__Section & (PAGE_SIZE - 1))
         Hypercall = (PVOID)(((ULONG_PTR)__Section + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1));
     else
diff --git a/src/xen/system.c b/src/xen/system.c
index 1a788ce..1934011 100644
--- a/src/xen/system.c
+++ b/src/xen/system.c
@@ -329,6 +329,222 @@ SystemApicIDToProcessorID(
 
 #pragma warning(pop)
 
+static VOID
+SystemViridianInformation(
+    IN  ULONG   Count
+    )
+{
+    ULONG       EAX;
+    ULONG       EBX;
+    CHAR        Signature[5];
+    ULONG       Bit;
+
+    Info("====>\n");
+
+    if (Count < 1)
+        goto done;
+
+    RtlZeroMemory(Signature, sizeof (Signature));
+
+    __CpuId(0x40000001, &EAX, NULL, NULL, NULL);
+
+    *((PULONG)(Signature + 0)) = EAX;
+
+    Info("Interface Identifier: %s\n", Signature);
+
+    if (strcmp(Signature, "Hv#1") != 0)
+        goto done;
+
+    if (Count < 3)
+        goto done;
+
+    __CpuId(0x40000003, &EAX, NULL, NULL, NULL);
+
+    Info("Hypervisor Features:\n");
+
+    for (Bit = 0; Bit < sizeof (ULONG) * 8; Bit++) {
+        if (EAX == 0)
+            break;
+
+        if (EAX & 1) {
+            switch (Bit) {
+            case 0:
+                Info(" - VP Runtime\n");
+                break;
+
+            case 1:
+                Info(" - Partition Reference Counter\n");
+                break;
+
+            case 2:
+                Info(" - Basic SynIC MSRs\n");
+                break;
+
+            case 3:
+                Info(" - Synthetic Timer MSRs\n");
+                break;
+
+            case 4:
+                Info(" - APIC Access MSRs\n");
+                break;
+
+            case 5:
+                Info(" - Hypercall MSRs\n");
+                break;
+
+            case 6:
+                Info(" - Virtual Processor Index MSR\n");
+                break;
+
+            case 7:
+                Info(" - Virtual System Reset MSR\n");
+                break;
+
+            case 8:
+                Info(" - Statistics Pages MSRs\n");
+                break;
+
+            case 9:
+                Info(" - Partition Reference TSC MSR\n");
+                break;
+
+            case 10:
+                Info(" - Guest Idle State MSR\n");
+                break;
+
+            case 11:
+                Info(" - Timer Frequency MSR\n");
+                break;
+
+            case 12:
+                Info(" - Debug MSRs\n");
+                break;
+
+            default:
+                break;
+            }
+        }
+
+        EAX >>= 1;
+    }
+
+    if (Count < 4)
+        goto done;
+
+    __CpuId(0x40000004, &EAX, &EBX, NULL, NULL);
+
+    Info("Recommendations:\n");
+
+    for (Bit = 0; Bit < sizeof (ULONG) * 8; Bit++) {
+        if (EAX == 0)
+            break;
+
+        if (EAX & 1) {
+            switch (Bit) {
+            case 0:
+                Info(" - Address space switch via hypercall\n");
+                break;
+
+            case 1:
+                Info(" - Local TLB flush via hypercall\n");
+                break;
+
+            case 2:
+                Info(" - Remote TLB flush via hypercall\n");
+                break;
+
+            case 3:
+                Info(" - EOI, ICR and TPR access via MSR\n");
+                break;
+
+            case 4:
+                Info(" - Reset via MSR\n");
+                break;
+
+            case 5:
+                Info(" - Use relaxed timing\n");
+                break;
+
+            case 6:
+                Info(" - Use DMA remapping\n");
+                break;
+
+            case 7:
+                Info(" - Use interrupt remapping\n");
+                break;
+
+            case 8:
+                Info(" - Use x2APIC MSRs\n");
+                break;
+
+            case 9:
+                Info(" - Deprecate AutoEOI\n");
+                break;
+
+            default:
+                break;
+            }
+        }
+
+        EAX >>= 1;
+    }
+
+    if (EBX != 0xFFFFFFFF)
+        Info(" - Retry spinlocks %u times\n", EBX);
+
+    if (Count < 6)
+        goto done;
+
+    __CpuId(0x40000006, &EAX, NULL, NULL, NULL);
+
+    Info("Hardware Features:\n");
+
+    for (Bit = 0; Bit < sizeof (ULONG) * 8; Bit++) {
+        if (EAX == 0)
+            break;
+
+        if (EAX & 1) {
+            switch (Bit) {
+            case 0:
+                Info(" - APIC overlay assist\n");
+                break;
+
+            case 1:
+                Info(" - MSR bitmaps\n");
+                break;
+
+            case 2:
+                Info(" - Architectural performance counters\n");
+                break;
+
+            case 3:
+                Info(" - Second Level Address Translation (SLAT)\n");
+                break;
+
+            case 4:
+                Info(" - DMA remapping\n");
+                break;
+
+            case 5:
+                Info(" - Interrupt remapping\n");
+                break;
+
+            case 6:
+                Info(" - Memory Patrol Scrubber\n");
+                break;
+
+            default:
+                break;
+            }
+        }
+
+        EAX >>= 1;
+    }
+
+done:
+    Info("<====\n");
+}
+
 static
 _Function_class_(KDEFERRED_ROUTINE)
 _IRQL_requires_max_(DISPATCH_LEVEL)
@@ -348,6 +564,7 @@ SystemProcessorInformation(
     ULONG               Index;
     PROCESSOR_NUMBER    ProcNumber;
     PSYSTEM_PROCESSOR   Processor;
+    ULONG               EAX;
     ULONG               EBX;
     ULONG               ECX;
     ULONG               EDX;
@@ -361,6 +578,20 @@ SystemProcessorInformation(
 
     Processor = &Context->Processor[Index];
 
+    if (Index == 0) {
+        CHAR    Signature[13];
+
+        RtlZeroMemory(Signature, sizeof (Signature));
+
+        __CpuId(0x40000000, &EAX, &EBX, &ECX, &EDX);
+        *((PULONG)(Signature + 0)) = EBX;
+        *((PULONG)(Signature + 4)) = ECX;
+        *((PULONG)(Signature + 8)) = EDX;
+
+        if (strcmp(Signature, "Microsoft Hv") == 0)
+            SystemViridianInformation(EAX - 0x40000000);
+    }
+
     Info("====> (%u:%u)\n", ProcNumber.Group, ProcNumber.Number);
 
     __CpuId(0, NULL, &EBX, &ECX, &EDX);
-- 
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 Oct 23 10:43:13 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 10:43: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 1ZpZoW-00024n-VT; Fri, 23 Oct 2015 10:43:12 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabio.fantoni@m2r.biz>) id 1ZpZoV-00024a-Nj
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 10:43:11 +0000
Received: from [85.158.139.211] by server-15.bemta-5.messagelabs.com id
	F9/B0-16870-F3F0A265; Fri, 23 Oct 2015 10:43:11 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-2.tower-206.messagelabs.com!1445596986!21084900!1
X-Originating-IP: [209.85.212.176]
X-SpamReason: No, hits=2.2 required=7.0 tests=BIZ_TLD,BODY_RANDOM_LONG
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24912 invoked from network); 23 Oct 2015 10:43:06 -0000
Received: from mail-wi0-f176.google.com (HELO mail-wi0-f176.google.com)
	(209.85.212.176)
	by server-2.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 10:43:06 -0000
Received: by wicll6 with SMTP id ll6so25602855wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 23 Oct 2015 03:43:06 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=m2r_biz.20150623.gappssmtp.com; s=20150623;
	h=subject:to:references:from:message-id:date:user-agent:mime-version
	:in-reply-to:content-type:content-transfer-encoding;
	bh=CkJb76CENwjPqs7lc2B0N1ZNOuSyWW9B+P/LgO1u9o0=;
	b=ZU9ltVaa4zJYTMLCM55lyk30wLNaRrjLbYUdi26l4DrvOyYbrQuEYgpaZzGbXEziuf
	a5J63NpAKRNBGPogZoc3LUfis5NNWefXn8A+1nN+WDP/MwWrvgarOusqHDEcAmvgpWhB
	mn/2LpmikM1fL+1cIiF3Afe7LsjI6+7kWuc6138Y9ah58LZqMYO4sciFAULvPGlR9PuZ
	DI2zIUGpMddU6s9rlMp1Ur5/4fzGo/IjePwvWLf+9vJPci55PhCNllCt2+anPw1zid+m
	K6EeJ0AViDTgyVY+4ZIb58N4l/UQNxynpIsN9xNyZ5QmrbKkuTKAvqLgQNQIT4E9BMiu
	grZw==
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=CkJb76CENwjPqs7lc2B0N1ZNOuSyWW9B+P/LgO1u9o0=;
	b=ZNQas5nfZP3exAMnS9aOeytrlA+6x261i+oDlpOOuqGand2LGtevrsHatsPWR53pGc
	xTUHeUECyNVRWd/X73IezLjyGHKTKaRobQTwJ0As1kAFNLYSCfzeijDJ9hDWxtlTjkcx
	XONzTsstmoKb1lc7cA8nlyM30jnIMiqiz/GS1JCtN6JV3qHZrCnrQoVRvegPYmfQNndq
	aP1UuH3aUj1rDH1XS5TpurygVN/eKM33D901py0JH5l9tCPhEyR92FclPDd0EBlTHakh
	aAp0rAzHsg5+3zm7KN+LSKRiPaLun4Hj8AWBiuBbdgIZjTdVSdER6WqKIL5+WlWtUWQY
	92FQ==
X-Gm-Message-State: ALoCoQlVHnjRjC7Grko40ek1iqPAtNEckwn4MTyTb7Odtxea15hchDnNJ8MqvPpD+0M/mwHUN2Qz
X-Received: by 10.180.10.104 with SMTP id h8mr3404125wib.21.1445596986173;
	Fri, 23 Oct 2015 03:43:06 -0700 (PDT)
Received: from [192.168.1.37] (ip-73-126.sn2.eutelia.it. [83.211.73.126])
	by smtp.googlemail.com with ESMTPSA id
	om1sm18765878wjc.2.2015.10.23.03.43.04
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 23 Oct 2015 03:43:05 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <5629FAAE.8090700@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622531@AMSPEX01CL01.citrite.net>
	<562A0875.20008@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622850@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <562A0F44.6090403@m2r.biz>
Date: Fri, 23 Oct 2015 12:43:16 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F622850@AMSPEX01CL01.citrite.net>
Subject: Re: [win-pv-devel] winpv drivers update still don't works correctly
 and domUs unable to boot on next reboot
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 23/10/2015 12:25, 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: 23 October 2015 11:14
>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
>> Subject: Re: [win-pv-devel] winpv drivers update still don't works correctly
>> and domUs unable to boot on next reboot
>>
>> Il 23/10/2015 11:33, Paul Durrant ha scritto:
>>>> -----Original Message-----
>>>> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
>>>> Sent: 23 October 2015 10:15
>>>> To: win-pv-devel@lists.xenproject.org
>>>> Cc: Paul Durrant
>>>> Subject: winpv drivers update still don't works correctly and domUs
>> unable to
>>>> boot on next reboot
>>>>
>>>> In many months I have tried numerous times with numerous winpv builds
>> on
>>>> windows update 7/8/10 but most of the time still using earlier builds
>>>> for one or more components, and often the next reboot fails to boot.
>>> You have a driver incompatibility problem. You have a XENBUS 8.2.0 from
>> 22nd October, but a XENVBD 8.1.0 from 11th August. So, I think what's
>> happing is that the old XENVBD is unable to bind to the PDO created by the
>> newer XENBUS, hence no FDO is being created, hence no disk PDOs are
>> being created, hence you have no system disk and you get a 0x7B BSOD.
>>>     Paul
>> Even if I updated ALL the component (so all the same build), also in
>> case of same "major version" ( for example 8.1.0 (1) -> 8.1.0 (2) ), the
>> domU uses one or more component at the older version.
>> For what I remember happen mainly for disks and network components.
>> In some case domU was still working even if it using old build of one or
>> more components, in many other cases network or disks was not working
>> (for disks the domU was unable to boot like this latest).
>> I already tried many tests for many hours in latest months trying to
>> remove the drivers, also manually remove service, files, registry keys
>> ecc... (after uninstall from windows control panel) but without found a
>> secure update procedure because also in many remove cases windows was
>> unable to boot.
>> If I understand good I suppose the mainly problems are that uninstaller
>> (in windows control panel) doesn't remove all effective related things,
>> and removing them manually if very difficult. It seems that winpv
>> components coinstaller have something wrong or missed which make unable
>> to use correctly the latest  builds and/or uninstall/update the drivers.
>>
>> Thanks for any reply and sorry for my bad english.
> I tend to install using dpinst so when I remove I generally do it via the 'uninstall programs' pane in control panel. I then reboot to get back to emulated devices and only then do install newer PV drivers.
>
>    Paul

I already tried the same (as I wrote) for a hundred times or more in the 
last year but too many times the domU was unable to boot because of 
winpv things still remains after uninstall (or for other window problem 
that I not understand exactly).
I spent tens of hours to found a solution to remove remaining service, 
registry keys and files AFTER uninstall from windows control panel but I 
was always unable to found a clean and safe procedure to full removal 
that left windows still able to boot in any case.

>
>>>> In my latest test:
>>>> Dom0:
>>>> Wheezy (debian 7) 64 bit with xen 4.6.0 plus some small additional
>> patches:
>>>> https://github.com/Fantu/Xen/commits/rebase/m2r-testing-4.6
>>>> kernel is custom build of 4.1.8 with .config in attachment
>>>> Qemu 2.4 with some small additional patches:
>>>> https://github.com/Fantu/qemu/commits/rebase/upstream
>>>> Seabios 1.8.2
>>>>
>>>> DomU:
>>>> windows 10 pro 64 bit
>>>> xl cfg in attachment
>>>>
>>>> I updated all winpv components to latest build without saw errors but on
>>>> reboot windows fails to boot, in qemu log I saw a trace about and also
>>>> the still use older build of at least one component.
>>>> Full qemu log with trace in attachment.
>>>> I had similar problem many time with different versions of xen, qemu,
>>>> seabios, winpv, windows ecc...
>>>> I also already did at least one other report about time ago if I
>>>> remember good.
>>>>
>>>>
>>>> If you need more informations/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


_______________________________________________
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 Oct 23 10:43:13 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 10:43: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 1ZpZoW-00024n-VT; Fri, 23 Oct 2015 10:43:12 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabio.fantoni@m2r.biz>) id 1ZpZoV-00024a-Nj
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 10:43:11 +0000
Received: from [85.158.139.211] by server-15.bemta-5.messagelabs.com id
	F9/B0-16870-F3F0A265; Fri, 23 Oct 2015 10:43:11 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-2.tower-206.messagelabs.com!1445596986!21084900!1
X-Originating-IP: [209.85.212.176]
X-SpamReason: No, hits=2.2 required=7.0 tests=BIZ_TLD,BODY_RANDOM_LONG
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24912 invoked from network); 23 Oct 2015 10:43:06 -0000
Received: from mail-wi0-f176.google.com (HELO mail-wi0-f176.google.com)
	(209.85.212.176)
	by server-2.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 10:43:06 -0000
Received: by wicll6 with SMTP id ll6so25602855wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 23 Oct 2015 03:43:06 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=m2r_biz.20150623.gappssmtp.com; s=20150623;
	h=subject:to:references:from:message-id:date:user-agent:mime-version
	:in-reply-to:content-type:content-transfer-encoding;
	bh=CkJb76CENwjPqs7lc2B0N1ZNOuSyWW9B+P/LgO1u9o0=;
	b=ZU9ltVaa4zJYTMLCM55lyk30wLNaRrjLbYUdi26l4DrvOyYbrQuEYgpaZzGbXEziuf
	a5J63NpAKRNBGPogZoc3LUfis5NNWefXn8A+1nN+WDP/MwWrvgarOusqHDEcAmvgpWhB
	mn/2LpmikM1fL+1cIiF3Afe7LsjI6+7kWuc6138Y9ah58LZqMYO4sciFAULvPGlR9PuZ
	DI2zIUGpMddU6s9rlMp1Ur5/4fzGo/IjePwvWLf+9vJPci55PhCNllCt2+anPw1zid+m
	K6EeJ0AViDTgyVY+4ZIb58N4l/UQNxynpIsN9xNyZ5QmrbKkuTKAvqLgQNQIT4E9BMiu
	grZw==
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=CkJb76CENwjPqs7lc2B0N1ZNOuSyWW9B+P/LgO1u9o0=;
	b=ZNQas5nfZP3exAMnS9aOeytrlA+6x261i+oDlpOOuqGand2LGtevrsHatsPWR53pGc
	xTUHeUECyNVRWd/X73IezLjyGHKTKaRobQTwJ0As1kAFNLYSCfzeijDJ9hDWxtlTjkcx
	XONzTsstmoKb1lc7cA8nlyM30jnIMiqiz/GS1JCtN6JV3qHZrCnrQoVRvegPYmfQNndq
	aP1UuH3aUj1rDH1XS5TpurygVN/eKM33D901py0JH5l9tCPhEyR92FclPDd0EBlTHakh
	aAp0rAzHsg5+3zm7KN+LSKRiPaLun4Hj8AWBiuBbdgIZjTdVSdER6WqKIL5+WlWtUWQY
	92FQ==
X-Gm-Message-State: ALoCoQlVHnjRjC7Grko40ek1iqPAtNEckwn4MTyTb7Odtxea15hchDnNJ8MqvPpD+0M/mwHUN2Qz
X-Received: by 10.180.10.104 with SMTP id h8mr3404125wib.21.1445596986173;
	Fri, 23 Oct 2015 03:43:06 -0700 (PDT)
Received: from [192.168.1.37] (ip-73-126.sn2.eutelia.it. [83.211.73.126])
	by smtp.googlemail.com with ESMTPSA id
	om1sm18765878wjc.2.2015.10.23.03.43.04
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 23 Oct 2015 03:43:05 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <5629FAAE.8090700@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622531@AMSPEX01CL01.citrite.net>
	<562A0875.20008@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622850@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <562A0F44.6090403@m2r.biz>
Date: Fri, 23 Oct 2015 12:43:16 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F622850@AMSPEX01CL01.citrite.net>
Subject: Re: [win-pv-devel] winpv drivers update still don't works correctly
 and domUs unable to boot on next reboot
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 23/10/2015 12:25, 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: 23 October 2015 11:14
>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
>> Subject: Re: [win-pv-devel] winpv drivers update still don't works correctly
>> and domUs unable to boot on next reboot
>>
>> Il 23/10/2015 11:33, Paul Durrant ha scritto:
>>>> -----Original Message-----
>>>> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
>>>> Sent: 23 October 2015 10:15
>>>> To: win-pv-devel@lists.xenproject.org
>>>> Cc: Paul Durrant
>>>> Subject: winpv drivers update still don't works correctly and domUs
>> unable to
>>>> boot on next reboot
>>>>
>>>> In many months I have tried numerous times with numerous winpv builds
>> on
>>>> windows update 7/8/10 but most of the time still using earlier builds
>>>> for one or more components, and often the next reboot fails to boot.
>>> You have a driver incompatibility problem. You have a XENBUS 8.2.0 from
>> 22nd October, but a XENVBD 8.1.0 from 11th August. So, I think what's
>> happing is that the old XENVBD is unable to bind to the PDO created by the
>> newer XENBUS, hence no FDO is being created, hence no disk PDOs are
>> being created, hence you have no system disk and you get a 0x7B BSOD.
>>>     Paul
>> Even if I updated ALL the component (so all the same build), also in
>> case of same "major version" ( for example 8.1.0 (1) -> 8.1.0 (2) ), the
>> domU uses one or more component at the older version.
>> For what I remember happen mainly for disks and network components.
>> In some case domU was still working even if it using old build of one or
>> more components, in many other cases network or disks was not working
>> (for disks the domU was unable to boot like this latest).
>> I already tried many tests for many hours in latest months trying to
>> remove the drivers, also manually remove service, files, registry keys
>> ecc... (after uninstall from windows control panel) but without found a
>> secure update procedure because also in many remove cases windows was
>> unable to boot.
>> If I understand good I suppose the mainly problems are that uninstaller
>> (in windows control panel) doesn't remove all effective related things,
>> and removing them manually if very difficult. It seems that winpv
>> components coinstaller have something wrong or missed which make unable
>> to use correctly the latest  builds and/or uninstall/update the drivers.
>>
>> Thanks for any reply and sorry for my bad english.
> I tend to install using dpinst so when I remove I generally do it via the 'uninstall programs' pane in control panel. I then reboot to get back to emulated devices and only then do install newer PV drivers.
>
>    Paul

I already tried the same (as I wrote) for a hundred times or more in the 
last year but too many times the domU was unable to boot because of 
winpv things still remains after uninstall (or for other window problem 
that I not understand exactly).
I spent tens of hours to found a solution to remove remaining service, 
registry keys and files AFTER uninstall from windows control panel but I 
was always unable to found a clean and safe procedure to full removal 
that left windows still able to boot in any case.

>
>>>> In my latest test:
>>>> Dom0:
>>>> Wheezy (debian 7) 64 bit with xen 4.6.0 plus some small additional
>> patches:
>>>> https://github.com/Fantu/Xen/commits/rebase/m2r-testing-4.6
>>>> kernel is custom build of 4.1.8 with .config in attachment
>>>> Qemu 2.4 with some small additional patches:
>>>> https://github.com/Fantu/qemu/commits/rebase/upstream
>>>> Seabios 1.8.2
>>>>
>>>> DomU:
>>>> windows 10 pro 64 bit
>>>> xl cfg in attachment
>>>>
>>>> I updated all winpv components to latest build without saw errors but on
>>>> reboot windows fails to boot, in qemu log I saw a trace about and also
>>>> the still use older build of at least one component.
>>>> Full qemu log with trace in attachment.
>>>> I had similar problem many time with different versions of xen, qemu,
>>>> seabios, winpv, windows ecc...
>>>> I also already did at least one other report about time ago if I
>>>> remember good.
>>>>
>>>>
>>>> If you need more informations/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


_______________________________________________
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 Oct 23 13:39:52 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 13:39:52 +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 1ZpcZT-0004dF-8h; Fri, 23 Oct 2015 13:39:51 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7314647ef=Paul.Durrant@citrix.com>)
	id 1ZpcZS-0004d7-If
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 13:39:50 +0000
Received: from [85.158.139.211] by server-5.bemta-5.messagelabs.com id
	1C/11-03819-5A83A265; Fri, 23 Oct 2015 13:39:49 +0000
X-Env-Sender: prvs=7314647ef=Paul.Durrant@citrix.com
X-Msg-Ref: server-15.tower-206.messagelabs.com!1445607587!28896753!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8202 invoked from network); 23 Oct 2015 13:39: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;
	23 Oct 2015 13:39:47 -0000
X-IronPort-AV: E=Sophos;i="5.20,186,1444694400"; 
   d="scan'208";a="5998699"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 1/6] Update XENBUS interface headers
Thread-Index: AQHRC8D5IVFay/h8HkiJit2FPgQBSZ55GOCw
Date: Fri, 23 Oct 2015 13:39:17 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F622FA9@AMSPEX01CL01.citrite.net>
References: <562721CF.6020708@invisiblethingslab.com>
In-Reply-To: <562721CF.6020708@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] [PATCH 1/6] Update XENBUS interface headers
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 Rafal Wojdyla
> Sent: 21 October 2015 06:26
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 1/6] Update XENBUS interface headers
> 
> Also add headers needed for next patches in the series.
> 
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  include/cache_interface.h  | 233 ++++++++++++++++++++++++++++++++
>  include/evtchn_interface.h | 325
> +++++++++++++++++++++++++++++++++++++++++++++
>  include/gnttab_interface.h | 249
> ++++++++++++++++++++++++++++++++++
>  include/store_interface.h  |  96 ++++++++++---
>  4 files changed, 885 insertions(+), 18 deletions(-)
>  create mode 100644 include/cache_interface.h
>  create mode 100644 include/evtchn_interface.h
>  create mode 100644 include/gnttab_interface.h
> 
> diff --git a/include/cache_interface.h b/include/cache_interface.h
> new file mode 100644
> index 0000000..dae3ac6
> --- /dev/null
> +++ b/include/cache_interface.h
> @@ -0,0 +1,233 @@
> +/* 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 cache_interface.h
> +    \brief XENBUS CACHE Interface
> +
> +    This interface provides access to XENBUS's object cache
> +    implementation.
> +*/
> +
> +#ifndef _XENBUS_CACHE_INTERFACE_H
> +#define _XENBUS_CACHE_INTERFACE_H
> +
> +#ifndef _WINDLL
> +
> +/*! \typedef XENBUS_CACHE
> +    \brief Cache handle
> +*/
> +typedef struct _XENBUS_CACHE    XENBUS_CACHE, *PXENBUS_CACHE;
> +
> +/*! \typedef XENBUS_CACHE_ACQUIRE
> +    \brief Acquire a reference to the CACHE interface
> +
> +    \param Interface The interface header
> +*/
> +typedef NTSTATUS
> +(*XENBUS_CACHE_ACQUIRE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_CACHE_RELEASE
> +    \brief Release a reference to the CACHE interface
> +
> +    \param Interface The interface header
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_RELEASE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_CACHE_CTOR
> +    \brief Object creator callback
> +
> +    \param Argument Context \a Argument supplied to \a
> XENBUS_CACHE_CREATE
> +    \param Object Newly allocated object
> +
> +    This callback is invoked just after a new object is allocated and may
> +    be used to initialize any object data prior to its insertion into the
> +    cache.
> +*/
> +typedef NTSTATUS
> +(*XENBUS_CACHE_CTOR)(
> +    IN  PVOID   Argument,
> +    IN  PVOID   Object
> +    );
> +
> +/*! \typedef XENBUS_CACHE_DTOR
> +    \brief Object destructor callback
> +
> +    \param Argument Context \a Argument supplied to \a
> XENBUS_CACHE_CREATE
> +    \param Object Object about to be freed
> +
> +    This callback is invoked just after an object is removed from the
> +    cache and before it is freed and may be used to tear down any object
> data.
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_DTOR)(
> +    IN  PVOID   Argument,
> +    IN  PVOID   Object
> +    );
> +
> +/*! \typedef XENBUS_CACHE_ACQUIRE_LOCK
> +    \brief Cache lock callback
> +
> +    \param Argument Context \a Argument supplied to \a
> XENBUS_CACHE_CREATE
> +
> +    This callback is invoked if the cache implementation requires mutual
> +    exclusion.
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_ACQUIRE_LOCK)(
> +    IN  PVOID   Argument
> +    );
> +
> +/*! \typedef XENBUS_CACHE_RELEASE_LOCK
> +    \brief Cache unlock callback
> +
> +    \param Argument Context \a Argument supplied to \a
> XENBUS_CACHE_CREATE
> +
> +    This callback is invoked to release the mutual exclusion lock acquired
> +    by a previous invocation of \a XENBUS_CACHE_ACQUIRE_LOCK.
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_RELEASE_LOCK)(
> +    IN  PVOID   Argument
> +    );
> +
> +/*! \typedef XENBUS_CACHE_CREATE
> +    \brief Create a cache of objects of the given \a Size
> +
> +    \param Interface The interface header
> +    \param Name A name for the cache which will be used in debug output
> +    \param Size The size of each object in bytes
> +    \param Reservation The target minimum population of the cache
> +    \param Ctor A callback which is invoked when a new object created
> +    \param Dtor A callback which is invoked when an object is destroyed
> +    \param AcquireLock A callback invoked to acquire a spinlock
> +    \param ReleaseLock A callback invoked to release the spinlock
> +    \param Argument An optional context argument passed to the callbacks
> +    \param Cache A pointer to a cache handle to be initialized
> +
> +    If a non-zero \a Reservation is specified then this method will fail
> +    unless that number of objects can be immediately created.
> +*/
> +typedef NTSTATUS
> +(*XENBUS_CACHE_CREATE)(
> +    IN  PINTERFACE                  Interface,
> +    IN  const CHAR                  *Name,
> +    IN  ULONG                       Size,
> +    IN  ULONG                       Reservation,
> +    IN  XENBUS_CACHE_CTOR           Ctor,
> +    IN  XENBUS_CACHE_DTOR           Dtor,
> +    IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
> +    IN  XENBUS_CACHE_RELEASE_LOCK   ReleaseLock,
> +    IN  PVOID                       Argument OPTIONAL,
> +    OUT PXENBUS_CACHE               *Cache
> +    );
> +
> +/*! \typedef XENBUS_CACHE_GET
> +    \brief Get an object from a \a Cache
> +
> +    \param Interface The interface header
> +    \param Cache The cache handle
> +    \param Locked If mutually exclusive access to the cache is already
> +    guaranteed then set this to TRUE
> +*/
> +typedef PVOID
> +(*XENBUS_CACHE_GET)(
> +    IN  PINTERFACE      Interface,
> +    IN  PXENBUS_CACHE   Cache,
> +    IN  BOOLEAN         Locked
> +    );
> +
> +/*! \typedef XENBUS_CACHE_PUT
> +    \brief Return an object to a \a Cache
> +
> +    \param Interface The interface header
> +    \param Cache The cache handle
> +    \param Locked If mutually exclusive access to the cache is already
> +    guaranteed then set this to TRUE
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_PUT)(
> +    IN  PINTERFACE      Interface,
> +    IN  PXENBUS_CACHE   Cache,
> +    IN  PVOID           Object,
> +    IN  BOOLEAN         Locked
> +    );
> +
> +/*! \typedef XENBUS_CACHE_DESTROY
> +    \brief Destroy a \a Cache
> +
> +    \param Interface The interface header
> +    \param Cache The cache handle
> +
> +    All objects must have been returned to the cache prior to destruction
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_DESTROY)(
> +    IN  PINTERFACE      Interface,
> +    IN  PXENBUS_CACHE   Cache
> +    );
> +
> +// {A98DFD78-416A-4949-92A5-E084F2F4B44E}
> +DEFINE_GUID(GUID_XENBUS_CACHE_INTERFACE,
> +0xa98dfd78, 0x416a, 0x4949, 0x92, 0xa5, 0xe0, 0x84, 0xf2, 0xf4, 0xb4, 0x4e);
> +
> +/*! \struct _XENBUS_CACHE_INTERFACE_V1
> +    \brief CACHE interface version 1
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_CACHE_INTERFACE_V1 {
> +    INTERFACE               Interface;
> +    XENBUS_CACHE_ACQUIRE    CacheAcquire;
> +    XENBUS_CACHE_RELEASE    CacheRelease;
> +    XENBUS_CACHE_CREATE     CacheCreate;
> +    XENBUS_CACHE_GET        CacheGet;
> +    XENBUS_CACHE_PUT        CachePut;
> +    XENBUS_CACHE_DESTROY    CacheDestroy;
> +};
> +
> +typedef struct _XENBUS_CACHE_INTERFACE_V1
> XENBUS_CACHE_INTERFACE, *PXENBUS_CACHE_INTERFACE;
> +
> +/*! \def XENBUS_CACHE
> +    \brief Macro at assist in method invocation
> +*/
> +#define XENBUS_CACHE(_Method, _Interface, ...)    \
> +    (_Interface)->Cache ## _Method((PINTERFACE)(_Interface),
> __VA_ARGS__)
> +
> +#endif  // _WINDLL
> +
> +#define XENBUS_CACHE_INTERFACE_VERSION_MIN  1
> +#define XENBUS_CACHE_INTERFACE_VERSION_MAX  1
> +
> +#endif  // _XENBUS_CACHE_INTERFACE_H
> diff --git a/include/evtchn_interface.h b/include/evtchn_interface.h
> new file mode 100644
> index 0000000..c63f063
> --- /dev/null
> +++ b/include/evtchn_interface.h
> @@ -0,0 +1,325 @@
> +/* 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 evtchn_interface.h
> +    \brief XENBUS EVTCHN Interface
> +
> +    This interface provides access to hypervisor event channels
> +*/
> +
> +#ifndef _XENBUS_EVTCHN_INTERFACE_H
> +#define _XENBUS_EVTCHN_INTERFACE_H
> +
> +#ifndef _WINDLL
> +
> +/*! \enum _XENBUS_EVTCHN_TYPE
> +    \brief Event channel type to be opened
> +*/
> +typedef enum _XENBUS_EVTCHN_TYPE {
> +    XENBUS_EVTCHN_TYPE_INVALID = 0,
> +    XENBUS_EVTCHN_TYPE_FIXED,           /*!< Fixed */
> +    XENBUS_EVTCHN_TYPE_UNBOUND,         /*!< Unbound */
> +    XENBUS_EVTCHN_TYPE_INTER_DOMAIN,    /*!< Interdomain */
> +    XENBUS_EVTCHN_TYPE_VIRQ             /*!< VIRQ */
> +} XENBUS_EVTCHN_TYPE, *PXENBUS_EVTCHN_TYPE;
> +
> +/*! \typedef XENBUS_EVTCHN_CHANNEL
> +    \brief Event channel handle
> +*/
> +typedef struct _XENBUS_EVTCHN_CHANNEL XENBUS_EVTCHN_CHANNEL,
> *PXENBUS_EVTCHN_CHANNEL;
> +
> +/*! \typedef XENBUS_EVTCHN_ACQUIRE
> +    \brief Acquire a reference to the EVTCHN interface
> +
> +    \param Interface The interface header
> +*/
> +typedef NTSTATUS
> +(*XENBUS_EVTCHN_ACQUIRE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_RELEASE
> +    \brief Release a reference to the EVTCHN interface
> +
> +    \param Interface The interface header
> +*/
> +typedef VOID
> +(*XENBUS_EVTCHN_RELEASE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_OPEN
> +    \brief Open an event channel
> +
> +    \param Interface The interface header
> +    \param Type The type of event channel to open
> +    \param Function The callback function
> +    \param Argument An optional context argument passed to the callback
> +    \param ... Additional parameters required by \a Type
> +
> +    \b Fixed:
> +    \param LocalPort The local port number of the (already bound) channel
> +    \param Mask Set to TRUE if the channel should be automatically masked
> before invoking the callback
> +
> +    \b Unbound:
> +    \param RemoteDomain The domid of the remote domain which will bind
> the channel
> +    \param Mask Set to TRUE if the channel should be automatically masked
> before invoking the callback
> +
> +    \b Interdomain:
> +    \param RemoteDomain The domid of the remote domain which has
> already bound the channel
> +    \param RemotePort The port number bound to the channel in the
> remote domain
> +    \param Mask Set to TRUE if the channel should be automatically masked
> before invoking the callback
> +
> +    \b VIRQ:
> +    \param Index The index number of the VIRQ
> +
> +    \return Event channel handle
> +*/
> +typedef PXENBUS_EVTCHN_CHANNEL
> +(*XENBUS_EVTCHN_OPEN)(
> +    IN  PINTERFACE          Interface,
> +    IN  XENBUS_EVTCHN_TYPE  Type,
> +    IN  PKSERVICE_ROUTINE   Function,
> +    IN  PVOID               Argument OPTIONAL,
> +    ...
> +    );
> +
> +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 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  USHORT                  Group,
> +    IN  UCHAR                   Number
> +    );
> +
> +typedef BOOLEAN
> +(*XENBUS_EVTCHN_UNMASK_V1)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
> +    IN  BOOLEAN                 InCallback
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_UNMASK
> +    \brief Unmask an event channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +    \param InCallback Set to TRUE if this method is invoked in context of the
> channel callback
> +*/
> +typedef VOID
> +(*XENBUS_EVTCHN_UNMASK)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
> +    IN  BOOLEAN                 InCallback
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_SEND
> +    \brief Send an event to the remote end of the channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +*/
> +typedef VOID
> +(*XENBUS_EVTCHN_SEND)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_TRIGGER
> +    \brief Send an event to the local end of the channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +*/
> +typedef VOID
> +(*XENBUS_EVTCHN_TRIGGER)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_WAIT
> +    \brief Wait for an event to the local end of the channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +    \param Timeout An optional timeout value (similar to
> KeWaitForSingleObject(), but non-zero values are allowed at
> DISPATCH_LEVEL).
> +*/
> +typedef NTSTATUS
> +(*XENBUS_EVTCHN_WAIT)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
> +    IN  PLARGE_INTEGER          Timeout OPTIONAL
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_GET_PORT
> +    \brief Get the local port number bound to the channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +    \return The port number
> +*/
> +typedef ULONG
> +(*XENBUS_EVTCHN_GET_PORT)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_CLOSE
> +    \brief Close an event channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +*/
> +typedef VOID
> +(*XENBUS_EVTCHN_CLOSE)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel
> +    );
> +
> +// {BE2440AC-1098-4150-AF4D-452FADCEF923}
> +DEFINE_GUID(GUID_XENBUS_EVTCHN_INTERFACE,
> +0xbe2440ac, 0x1098, 0x4150, 0xaf, 0x4d, 0x45, 0x2f, 0xad, 0xce, 0xf9, 0x23);
> +
> +/*! \struct _XENBUS_EVTCHN_INTERFACE_V1
> +    \brief EVTCHN interface version 1
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_EVTCHN_INTERFACE_V1 {
> +    INTERFACE               Interface;
> +    XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
> +    XENBUS_EVTCHN_RELEASE   EvtchnRelease;
> +    XENBUS_EVTCHN_OPEN      EvtchnOpen;
> +    XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
> +    XENBUS_EVTCHN_SEND      EvtchnSend;
> +    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
> +    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
> +    XENBUS_EVTCHN_CLOSE     EvtchnClose;
> +};
> +
> +/*! \struct _XENBUS_EVTCHN_INTERFACE_V2
> +    \brief EVTCHN interface version 2
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_EVTCHN_INTERFACE_V2 {
> +    INTERFACE               Interface;
> +    XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
> +    XENBUS_EVTCHN_RELEASE   EvtchnRelease;
> +    XENBUS_EVTCHN_OPEN      EvtchnOpen;
> +    XENBUS_EVTCHN_BIND_V2   EvtchnBindVersion2;
> +    XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
> +    XENBUS_EVTCHN_SEND      EvtchnSend;
> +    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
> +    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
> +    XENBUS_EVTCHN_CLOSE     EvtchnClose;
> +};
> +
> +/*! \struct _XENBUS_EVTCHN_INTERFACE_V3
> +    \brief EVTCHN interface version 3
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_EVTCHN_INTERFACE_V3 {
> +    INTERFACE               Interface;
> +    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;
> +    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
> +    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
> +    XENBUS_EVTCHN_CLOSE     EvtchnClose;
> +};
> +
> +/*! \struct _XENBUS_EVTCHN_INTERFACE_V5
> +    \brief EVTCHN interface version 5
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_EVTCHN_INTERFACE_V5 {
> +    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;
> +    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
> +    XENBUS_EVTCHN_WAIT      EvtchnWait;
> +    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
> +    XENBUS_EVTCHN_CLOSE     EvtchnClose;
> +};
> +
> +typedef struct _XENBUS_EVTCHN_INTERFACE_V5
> XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
> +
> +/*! \def XENBUS_EVTCHN
> +    \brief Macro at assist in method invocation
> +*/
> +#define XENBUS_EVTCHN(_Method, _Interface, ...)    \
> +    (_Interface)->Evtchn ## _Method((PINTERFACE)(_Interface),
> __VA_ARGS__)
> +
> +#endif  // _WINDLL
> +
> +#define XENBUS_EVTCHN_INTERFACE_VERSION_MIN 1
> +#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 5
> +
> +#endif  // _XENBUS_EVTCHN_INTERFACE_H
> +
> diff --git a/include/gnttab_interface.h b/include/gnttab_interface.h
> new file mode 100644
> index 0000000..b0f4adf
> --- /dev/null
> +++ b/include/gnttab_interface.h
> @@ -0,0 +1,249 @@
> +/* 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 gnttab_interface.h
> +    \brief XENBUS GNTTAB Interface
> +
> +    This interface provides access to the hypervisor grant table
> +*/
> +
> +#ifndef _XENBUS_GNTTAB_INTERFACE_H
> +#define _XENBUS_GNTTAB_INTERFACE_H
> +
> +#include <cache_interface.h>
> +
> +#ifndef _WINDLL
> +
> +/*! \typedef XENBUS_GNTTAB_ENTRY
> +    \brief Grant table entry handle
> +*/
> +typedef struct _XENBUS_GNTTAB_ENTRY XENBUS_GNTTAB_ENTRY,
> *PXENBUS_GNTTAB_ENTRY;
> +
> +/*! \typedef XENBUS_GNTTAB_CACHE
> +    \brief Grant table cache handle
> +*/
> +typedef struct _XENBUS_GNTTAB_CACHE XENBUS_GNTTAB_CACHE,
> *PXENBUS_GNTTAB_CACHE;
> +
> +/*! \typedef XENBUS_GNTTAB_ACQUIRE
> +    \brief Acquire a reference to the GNTTAB interface
> +
> +    \param Interface The interface header
> +*/
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_ACQUIRE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_RELEASE
> +    \brief Release a reference to the GNTTAB interface
> +
> +    \param Interface The interface header
> +*/
> +typedef VOID
> +(*XENBUS_GNTTAB_RELEASE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_CREATE_CACHE
> +    \brief Create a cache of grant table entries
> +
> +    \param Interface The interface header
> +    \param Name A name for the cache which will be used in debug output
> +    \param Reservation The target minimum population of the cache
> +    \param AcquireLock A callback invoked to acquire a spinlock
> +    \param ReleaseLock A callback invoked to release the spinlock
> +    \param Argument An optional context argument passed to the callbacks
> +    \param Cache A pointer to a grant table cache handle to be initialized
> +*/
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_CREATE_CACHE)(
> +    IN  PINTERFACE                  Interface,
> +    IN  const CHAR                  *Name,
> +    IN  ULONG                       Reservation,
> +    IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
> +    IN  XENBUS_CACHE_RELEASE_LOCK   ReleaseLock,
> +    IN  PVOID                       Argument OPTIONAL,
> +    OUT PXENBUS_GNTTAB_CACHE        *Cache
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS
> +    \brief Get a table entry from the \a Cache permitting access to a given \a
> Pfn
> +
> +    \param Interface The interface header
> +    \param Cache The grant table cache handle
> +    \param Locked If mutually exclusive access to the cache is already
> +    guaranteed then set this to TRUE
> +    \param Domain The domid of the domain being granted access
> +    \param Pfn The frame number of the page that we are granting access to
> +    \param ReadOnly Set to TRUE if the foreign domain is only being granted
> +    read access
> +    \param Entry A pointer to a grant table entry handle to be initialized
> +*/
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS)(
> +    IN  PINTERFACE                  Interface,
> +    IN  PXENBUS_GNTTAB_CACHE        Cache,
> +    IN  BOOLEAN                     Locked,
> +    IN  USHORT                      Domain,
> +    IN  PFN_NUMBER                  Pfn,
> +    IN  BOOLEAN                     ReadOnly,
> +    OUT PXENBUS_GNTTAB_ENTRY        *Entry
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS
> +    \brief Revoke foreign access and return the \a Entry to the \a Cache
> +
> +    \param Interface The interface header
> +    \param Cache The grant table cache handle
> +    \param Locked If mutually exclusive access to the cache is already
> +    guaranteed then set this to TRUE
> +    \param Entry The grant table entry handle
> +*/
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS)(
> +    IN  PINTERFACE                  Interface,
> +    IN  PXENBUS_GNTTAB_CACHE        Cache,
> +    IN  BOOLEAN                     Locked,
> +    IN  PXENBUS_GNTTAB_ENTRY        Entry
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_GET_REFERENCE
> +    \brief Get the reference number of the entry
> +
> +    \param Interface The interface header
> +    \param Entry The grant table entry handle
> +    \return The reference number
> +*/
> +typedef ULONG
> +(*XENBUS_GNTTAB_GET_REFERENCE)(
> +    IN  PINTERFACE                  Interface,
> +    IN  PXENBUS_GNTTAB_ENTRY        Entry
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_DESTROY_CACHE
> +    \brief Destroy a cache of grant table entries
> +
> +    \param Interface The interface header
> +    \param Cache The grant table cache handle
> +
> +    All grant table entries must have been revoked prior to destruction
> +    of the cache
> +*/
> +typedef VOID
> +(*XENBUS_GNTTAB_DESTROY_CACHE)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_GNTTAB_CACHE    Cache
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_MAP_FOREIGN_PAGES
> +    \brief Map foreign memory pages into the system address space
> +
> +    \param Interface The interface header
> +    \param Domain The domid of the foreign domain that granted the pages
> +    \param NumberPages Number of pages to map
> +    \param References Array of grant reference numbers shared by the
> foreign domain
> +    \param ReadOnly If TRUE, pages are mapped with read-only access
> +    \param Address The physical address that the foreign pages are mapped
> under
> +*/
> +
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_MAP_FOREIGN_PAGES)(
> +    IN  PINTERFACE              Interface,
> +    IN  USHORT                  Domain,
> +    IN  ULONG                   NumberPages,
> +    IN  PULONG                  References,
> +    IN  BOOLEAN                 ReadOnly,
> +    OUT PHYSICAL_ADDRESS        *Address
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES
> +    \brief Unmap foreign memory pages from the system address space
> +
> +    \param Interface The interface header
> +    \param Address The physical address that the foreign pages are mapped
> under
> +*/
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES)(
> +    IN  PINTERFACE              Interface,
> +    IN  PHYSICAL_ADDRESS        Address
> +    );
> +
> +// {763679C5-E5C2-4A6D-8B88-6BB02EC42D8E}
> +DEFINE_GUID(GUID_XENBUS_GNTTAB_INTERFACE,
> +0x763679c5, 0xe5c2, 0x4a6d, 0x8b, 0x88, 0x6b, 0xb0, 0x2e, 0xc4, 0x2d, 0x8e);
> +
> +/*! \struct _XENBUS_GNTTAB_INTERFACE_V1
> +    \brief GNTTAB interface version 1
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_GNTTAB_INTERFACE_V1 {
> +    INTERFACE                           Interface;
> +    XENBUS_GNTTAB_ACQUIRE               GnttabAcquire;
> +    XENBUS_GNTTAB_RELEASE               GnttabRelease;
> +    XENBUS_GNTTAB_CREATE_CACHE          GnttabCreateCache;
> +    XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS
> GnttabPermitForeignAccess;
> +    XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS
> GnttabRevokeForeignAccess;
> +    XENBUS_GNTTAB_GET_REFERENCE         GnttabGetReference;
> +    XENBUS_GNTTAB_DESTROY_CACHE         GnttabDestroyCache;
> +};
> +
> +/*! \struct _XENBUS_GNTTAB_INTERFACE_V2
> +    \brief GNTTAB interface version 2
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_GNTTAB_INTERFACE_V2 {
> +    INTERFACE                           Interface;
> +    XENBUS_GNTTAB_ACQUIRE               GnttabAcquire;
> +    XENBUS_GNTTAB_RELEASE               GnttabRelease;
> +    XENBUS_GNTTAB_CREATE_CACHE          GnttabCreateCache;
> +    XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS
> GnttabPermitForeignAccess;
> +    XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS
> GnttabRevokeForeignAccess;
> +    XENBUS_GNTTAB_GET_REFERENCE         GnttabGetReference;
> +    XENBUS_GNTTAB_DESTROY_CACHE         GnttabDestroyCache;
> +    XENBUS_GNTTAB_MAP_FOREIGN_PAGES     GnttabMapForeignPages;
> +    XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES
> GnttabUnmapForeignPages;
> +};
> +
> +typedef struct _XENBUS_GNTTAB_INTERFACE_V2
> XENBUS_GNTTAB_INTERFACE, *PXENBUS_GNTTAB_INTERFACE;
> +
> +/*! \def XENBUS_GNTTAB
> +    \brief Macro at assist in method invocation
> +*/
> +#define XENBUS_GNTTAB(_Method, _Interface, ...)    \
> +    (_Interface)->Gnttab ## _Method((PINTERFACE)(_Interface),
> __VA_ARGS__)
> +
> +#endif  // _WINDLL
> +
> +#define XENBUS_GNTTAB_INTERFACE_VERSION_MIN 1
> +#define XENBUS_GNTTAB_INTERFACE_VERSION_MAX 2
> +
> +#endif  // _XENBUS_GNTTAB_INTERFACE_H
> +
> diff --git a/include/store_interface.h b/include/store_interface.h
> index 5bcbba3..52f1a1d 100644
> --- a/include/store_interface.h
> +++ b/include/store_interface.h
> @@ -50,6 +50,23 @@ typedef struct _XENBUS_STORE_TRANSACTION
> XENBUS_STORE_TRANSACTION, *PXENBUS_S
>  */
>  typedef struct _XENBUS_STORE_WATCH          XENBUS_STORE_WATCH,
> *PXENBUS_STORE_WATCH;
> 
> +/*! \typedef XENBUS_STORE_PERMISSION_MASK
> +    \brief Bitmask of XenStore key permissions
> +*/
> +typedef enum _XENBUS_STORE_PERMISSION_MASK {
> +    XENBUS_STORE_PERM_NONE = 0,
> +    XENBUS_STORE_PERM_READ = 1,
> +    XENBUS_STORE_PERM_WRITE = 2,
> +} XENBUS_STORE_PERMISSION_MASK;
> +
> +/*! \typedef XENBUS_STORE_PERMISSION
> +    \brief XenStore key permissions entry for a single domain
> +*/
> +typedef struct _XENBUS_STORE_PERMISSION {
> +    USHORT                          Domain;
> +    XENBUS_STORE_PERMISSION_MASK    Mask;
> +} XENBUS_STORE_PERMISSION, *PXENBUS_STORE_PERMISSION;
> +
>  /*! \typedef XENBUS_STORE_ACQUIRE
>      \brief Acquire a reference to the STORE interface
> 
> @@ -247,31 +264,74 @@ typedef VOID
>      IN  PINTERFACE  Interface
>      );
> 
> +/*! \typedef XENBUS_STORE_PERMISSIONS_SET
> +    \brief Set permissions for a XenStore key
> +
> +    \param Interface The interface header
> +    \param Transaction The transaction handle (NULL if this is not
> +    part of a transaction)
> +    \param Prefix An optional prefix for the \a Node
> +    \param Node The concatenation of the \a Prefix and this value specifies
> +    the XenStore key to set permissions of
> +    \param Permissions An array of permissions to set
> +    \param NumberPermissions Number of elements in the \a Permissions
> array
> +*/
> +typedef NTSTATUS
> +(*XENBUS_STORE_PERMISSIONS_SET)(
> +    IN  PINTERFACE                  Interface,
> +    IN  PXENBUS_STORE_TRANSACTION   Transaction OPTIONAL,
> +    IN  PCHAR                       Prefix OPTIONAL,
> +    IN  PCHAR                       Node,
> +    IN  PXENBUS_STORE_PERMISSION    Permissions,
> +    IN  ULONG                       NumberPermissions
> +    );
> +
>  // {86824C3B-D34E-4753-B281-2F1E3AD214D7}
>  DEFINE_GUID(GUID_XENBUS_STORE_INTERFACE,
>  0x86824c3b, 0xd34e, 0x4753, 0xb2, 0x81, 0x2f, 0x1e, 0x3a, 0xd2, 0x14, 0xd7);
> 
> -struct _XENBUS_STORE_INTERFACE_V1 {
> -    INTERFACE                       Interface;
> -    XENBUS_STORE_ACQUIRE            StoreAcquire;
> -    XENBUS_STORE_RELEASE            StoreRelease;
> -    XENBUS_STORE_FREE               StoreFree;
> -    XENBUS_STORE_READ               StoreRead;
> -    XENBUS_STORE_PRINTF             StorePrintf;
> -    XENBUS_STORE_REMOVE             StoreRemove;
> -    XENBUS_STORE_DIRECTORY          StoreDirectory;
> -    XENBUS_STORE_TRANSACTION_START  StoreTransactionStart;
> -    XENBUS_STORE_TRANSACTION_END    StoreTransactionEnd;
> -    XENBUS_STORE_WATCH_ADD          StoreWatchAdd;
> -    XENBUS_STORE_WATCH_REMOVE       StoreWatchRemove;
> -    XENBUS_STORE_POLL               StorePoll;
> -};
> -
>  /*! \struct _XENBUS_STORE_INTERFACE_V1
>      \brief STORE interface version 1
>      \ingroup interfaces
>  */
> -typedef struct _XENBUS_STORE_INTERFACE_V1
> XENBUS_STORE_INTERFACE, *PXENBUS_STORE_INTERFACE;
> +struct _XENBUS_STORE_INTERFACE_V1 {
> +    INTERFACE                       Interface;
> +    XENBUS_STORE_ACQUIRE            StoreAcquire;
> +    XENBUS_STORE_RELEASE            StoreRelease;
> +    XENBUS_STORE_FREE               StoreFree;
> +    XENBUS_STORE_READ               StoreRead;
> +    XENBUS_STORE_PRINTF             StorePrintf;
> +    XENBUS_STORE_REMOVE             StoreRemove;
> +    XENBUS_STORE_DIRECTORY          StoreDirectory;
> +    XENBUS_STORE_TRANSACTION_START  StoreTransactionStart;
> +    XENBUS_STORE_TRANSACTION_END    StoreTransactionEnd;
> +    XENBUS_STORE_WATCH_ADD          StoreWatchAdd;
> +    XENBUS_STORE_WATCH_REMOVE       StoreWatchRemove;
> +    XENBUS_STORE_POLL               StorePoll;
> +};
> +
> +/*! \struct _XENBUS_STORE_INTERFACE_V2
> +    \brief STORE interface version 2
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_STORE_INTERFACE_V2 {
> +    INTERFACE                       Interface;
> +    XENBUS_STORE_ACQUIRE            StoreAcquire;
> +    XENBUS_STORE_RELEASE            StoreRelease;
> +    XENBUS_STORE_FREE               StoreFree;
> +    XENBUS_STORE_READ               StoreRead;
> +    XENBUS_STORE_PRINTF             StorePrintf;
> +    XENBUS_STORE_PERMISSIONS_SET    StorePermissionsSet;
> +    XENBUS_STORE_REMOVE             StoreRemove;
> +    XENBUS_STORE_DIRECTORY          StoreDirectory;
> +    XENBUS_STORE_TRANSACTION_START  StoreTransactionStart;
> +    XENBUS_STORE_TRANSACTION_END    StoreTransactionEnd;
> +    XENBUS_STORE_WATCH_ADD          StoreWatchAdd;
> +    XENBUS_STORE_WATCH_REMOVE       StoreWatchRemove;
> +    XENBUS_STORE_POLL               StorePoll;
> +};
> +
> +typedef struct _XENBUS_STORE_INTERFACE_V2
> XENBUS_STORE_INTERFACE, *PXENBUS_STORE_INTERFACE;
> 
>  /*! \def XENBUS_STORE
>      \brief Macro at assist in method invocation
> @@ -282,7 +342,7 @@ typedef struct _XENBUS_STORE_INTERFACE_V1
> XENBUS_STORE_INTERFACE, *PXENBUS_STORE
>  #endif  // _WINDLL
> 
>  #define XENBUS_STORE_INTERFACE_VERSION_MIN  1
> -#define XENBUS_STORE_INTERFACE_VERSION_MAX  1
> +#define XENBUS_STORE_INTERFACE_VERSION_MAX  2
> 
>  #endif  // _XENBUS_STORE_INTERFACE_H
> 
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Fri Oct 23 13:39:52 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 13:39:52 +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 1ZpcZT-0004dF-8h; Fri, 23 Oct 2015 13:39:51 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7314647ef=Paul.Durrant@citrix.com>)
	id 1ZpcZS-0004d7-If
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 13:39:50 +0000
Received: from [85.158.139.211] by server-5.bemta-5.messagelabs.com id
	1C/11-03819-5A83A265; Fri, 23 Oct 2015 13:39:49 +0000
X-Env-Sender: prvs=7314647ef=Paul.Durrant@citrix.com
X-Msg-Ref: server-15.tower-206.messagelabs.com!1445607587!28896753!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8202 invoked from network); 23 Oct 2015 13:39: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;
	23 Oct 2015 13:39:47 -0000
X-IronPort-AV: E=Sophos;i="5.20,186,1444694400"; 
   d="scan'208";a="5998699"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 1/6] Update XENBUS interface headers
Thread-Index: AQHRC8D5IVFay/h8HkiJit2FPgQBSZ55GOCw
Date: Fri, 23 Oct 2015 13:39:17 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F622FA9@AMSPEX01CL01.citrite.net>
References: <562721CF.6020708@invisiblethingslab.com>
In-Reply-To: <562721CF.6020708@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] [PATCH 1/6] Update XENBUS interface headers
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 Rafal Wojdyla
> Sent: 21 October 2015 06:26
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 1/6] Update XENBUS interface headers
> 
> Also add headers needed for next patches in the series.
> 
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  include/cache_interface.h  | 233 ++++++++++++++++++++++++++++++++
>  include/evtchn_interface.h | 325
> +++++++++++++++++++++++++++++++++++++++++++++
>  include/gnttab_interface.h | 249
> ++++++++++++++++++++++++++++++++++
>  include/store_interface.h  |  96 ++++++++++---
>  4 files changed, 885 insertions(+), 18 deletions(-)
>  create mode 100644 include/cache_interface.h
>  create mode 100644 include/evtchn_interface.h
>  create mode 100644 include/gnttab_interface.h
> 
> diff --git a/include/cache_interface.h b/include/cache_interface.h
> new file mode 100644
> index 0000000..dae3ac6
> --- /dev/null
> +++ b/include/cache_interface.h
> @@ -0,0 +1,233 @@
> +/* 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 cache_interface.h
> +    \brief XENBUS CACHE Interface
> +
> +    This interface provides access to XENBUS's object cache
> +    implementation.
> +*/
> +
> +#ifndef _XENBUS_CACHE_INTERFACE_H
> +#define _XENBUS_CACHE_INTERFACE_H
> +
> +#ifndef _WINDLL
> +
> +/*! \typedef XENBUS_CACHE
> +    \brief Cache handle
> +*/
> +typedef struct _XENBUS_CACHE    XENBUS_CACHE, *PXENBUS_CACHE;
> +
> +/*! \typedef XENBUS_CACHE_ACQUIRE
> +    \brief Acquire a reference to the CACHE interface
> +
> +    \param Interface The interface header
> +*/
> +typedef NTSTATUS
> +(*XENBUS_CACHE_ACQUIRE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_CACHE_RELEASE
> +    \brief Release a reference to the CACHE interface
> +
> +    \param Interface The interface header
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_RELEASE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_CACHE_CTOR
> +    \brief Object creator callback
> +
> +    \param Argument Context \a Argument supplied to \a
> XENBUS_CACHE_CREATE
> +    \param Object Newly allocated object
> +
> +    This callback is invoked just after a new object is allocated and may
> +    be used to initialize any object data prior to its insertion into the
> +    cache.
> +*/
> +typedef NTSTATUS
> +(*XENBUS_CACHE_CTOR)(
> +    IN  PVOID   Argument,
> +    IN  PVOID   Object
> +    );
> +
> +/*! \typedef XENBUS_CACHE_DTOR
> +    \brief Object destructor callback
> +
> +    \param Argument Context \a Argument supplied to \a
> XENBUS_CACHE_CREATE
> +    \param Object Object about to be freed
> +
> +    This callback is invoked just after an object is removed from the
> +    cache and before it is freed and may be used to tear down any object
> data.
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_DTOR)(
> +    IN  PVOID   Argument,
> +    IN  PVOID   Object
> +    );
> +
> +/*! \typedef XENBUS_CACHE_ACQUIRE_LOCK
> +    \brief Cache lock callback
> +
> +    \param Argument Context \a Argument supplied to \a
> XENBUS_CACHE_CREATE
> +
> +    This callback is invoked if the cache implementation requires mutual
> +    exclusion.
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_ACQUIRE_LOCK)(
> +    IN  PVOID   Argument
> +    );
> +
> +/*! \typedef XENBUS_CACHE_RELEASE_LOCK
> +    \brief Cache unlock callback
> +
> +    \param Argument Context \a Argument supplied to \a
> XENBUS_CACHE_CREATE
> +
> +    This callback is invoked to release the mutual exclusion lock acquired
> +    by a previous invocation of \a XENBUS_CACHE_ACQUIRE_LOCK.
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_RELEASE_LOCK)(
> +    IN  PVOID   Argument
> +    );
> +
> +/*! \typedef XENBUS_CACHE_CREATE
> +    \brief Create a cache of objects of the given \a Size
> +
> +    \param Interface The interface header
> +    \param Name A name for the cache which will be used in debug output
> +    \param Size The size of each object in bytes
> +    \param Reservation The target minimum population of the cache
> +    \param Ctor A callback which is invoked when a new object created
> +    \param Dtor A callback which is invoked when an object is destroyed
> +    \param AcquireLock A callback invoked to acquire a spinlock
> +    \param ReleaseLock A callback invoked to release the spinlock
> +    \param Argument An optional context argument passed to the callbacks
> +    \param Cache A pointer to a cache handle to be initialized
> +
> +    If a non-zero \a Reservation is specified then this method will fail
> +    unless that number of objects can be immediately created.
> +*/
> +typedef NTSTATUS
> +(*XENBUS_CACHE_CREATE)(
> +    IN  PINTERFACE                  Interface,
> +    IN  const CHAR                  *Name,
> +    IN  ULONG                       Size,
> +    IN  ULONG                       Reservation,
> +    IN  XENBUS_CACHE_CTOR           Ctor,
> +    IN  XENBUS_CACHE_DTOR           Dtor,
> +    IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
> +    IN  XENBUS_CACHE_RELEASE_LOCK   ReleaseLock,
> +    IN  PVOID                       Argument OPTIONAL,
> +    OUT PXENBUS_CACHE               *Cache
> +    );
> +
> +/*! \typedef XENBUS_CACHE_GET
> +    \brief Get an object from a \a Cache
> +
> +    \param Interface The interface header
> +    \param Cache The cache handle
> +    \param Locked If mutually exclusive access to the cache is already
> +    guaranteed then set this to TRUE
> +*/
> +typedef PVOID
> +(*XENBUS_CACHE_GET)(
> +    IN  PINTERFACE      Interface,
> +    IN  PXENBUS_CACHE   Cache,
> +    IN  BOOLEAN         Locked
> +    );
> +
> +/*! \typedef XENBUS_CACHE_PUT
> +    \brief Return an object to a \a Cache
> +
> +    \param Interface The interface header
> +    \param Cache The cache handle
> +    \param Locked If mutually exclusive access to the cache is already
> +    guaranteed then set this to TRUE
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_PUT)(
> +    IN  PINTERFACE      Interface,
> +    IN  PXENBUS_CACHE   Cache,
> +    IN  PVOID           Object,
> +    IN  BOOLEAN         Locked
> +    );
> +
> +/*! \typedef XENBUS_CACHE_DESTROY
> +    \brief Destroy a \a Cache
> +
> +    \param Interface The interface header
> +    \param Cache The cache handle
> +
> +    All objects must have been returned to the cache prior to destruction
> +*/
> +typedef VOID
> +(*XENBUS_CACHE_DESTROY)(
> +    IN  PINTERFACE      Interface,
> +    IN  PXENBUS_CACHE   Cache
> +    );
> +
> +// {A98DFD78-416A-4949-92A5-E084F2F4B44E}
> +DEFINE_GUID(GUID_XENBUS_CACHE_INTERFACE,
> +0xa98dfd78, 0x416a, 0x4949, 0x92, 0xa5, 0xe0, 0x84, 0xf2, 0xf4, 0xb4, 0x4e);
> +
> +/*! \struct _XENBUS_CACHE_INTERFACE_V1
> +    \brief CACHE interface version 1
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_CACHE_INTERFACE_V1 {
> +    INTERFACE               Interface;
> +    XENBUS_CACHE_ACQUIRE    CacheAcquire;
> +    XENBUS_CACHE_RELEASE    CacheRelease;
> +    XENBUS_CACHE_CREATE     CacheCreate;
> +    XENBUS_CACHE_GET        CacheGet;
> +    XENBUS_CACHE_PUT        CachePut;
> +    XENBUS_CACHE_DESTROY    CacheDestroy;
> +};
> +
> +typedef struct _XENBUS_CACHE_INTERFACE_V1
> XENBUS_CACHE_INTERFACE, *PXENBUS_CACHE_INTERFACE;
> +
> +/*! \def XENBUS_CACHE
> +    \brief Macro at assist in method invocation
> +*/
> +#define XENBUS_CACHE(_Method, _Interface, ...)    \
> +    (_Interface)->Cache ## _Method((PINTERFACE)(_Interface),
> __VA_ARGS__)
> +
> +#endif  // _WINDLL
> +
> +#define XENBUS_CACHE_INTERFACE_VERSION_MIN  1
> +#define XENBUS_CACHE_INTERFACE_VERSION_MAX  1
> +
> +#endif  // _XENBUS_CACHE_INTERFACE_H
> diff --git a/include/evtchn_interface.h b/include/evtchn_interface.h
> new file mode 100644
> index 0000000..c63f063
> --- /dev/null
> +++ b/include/evtchn_interface.h
> @@ -0,0 +1,325 @@
> +/* 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 evtchn_interface.h
> +    \brief XENBUS EVTCHN Interface
> +
> +    This interface provides access to hypervisor event channels
> +*/
> +
> +#ifndef _XENBUS_EVTCHN_INTERFACE_H
> +#define _XENBUS_EVTCHN_INTERFACE_H
> +
> +#ifndef _WINDLL
> +
> +/*! \enum _XENBUS_EVTCHN_TYPE
> +    \brief Event channel type to be opened
> +*/
> +typedef enum _XENBUS_EVTCHN_TYPE {
> +    XENBUS_EVTCHN_TYPE_INVALID = 0,
> +    XENBUS_EVTCHN_TYPE_FIXED,           /*!< Fixed */
> +    XENBUS_EVTCHN_TYPE_UNBOUND,         /*!< Unbound */
> +    XENBUS_EVTCHN_TYPE_INTER_DOMAIN,    /*!< Interdomain */
> +    XENBUS_EVTCHN_TYPE_VIRQ             /*!< VIRQ */
> +} XENBUS_EVTCHN_TYPE, *PXENBUS_EVTCHN_TYPE;
> +
> +/*! \typedef XENBUS_EVTCHN_CHANNEL
> +    \brief Event channel handle
> +*/
> +typedef struct _XENBUS_EVTCHN_CHANNEL XENBUS_EVTCHN_CHANNEL,
> *PXENBUS_EVTCHN_CHANNEL;
> +
> +/*! \typedef XENBUS_EVTCHN_ACQUIRE
> +    \brief Acquire a reference to the EVTCHN interface
> +
> +    \param Interface The interface header
> +*/
> +typedef NTSTATUS
> +(*XENBUS_EVTCHN_ACQUIRE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_RELEASE
> +    \brief Release a reference to the EVTCHN interface
> +
> +    \param Interface The interface header
> +*/
> +typedef VOID
> +(*XENBUS_EVTCHN_RELEASE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_OPEN
> +    \brief Open an event channel
> +
> +    \param Interface The interface header
> +    \param Type The type of event channel to open
> +    \param Function The callback function
> +    \param Argument An optional context argument passed to the callback
> +    \param ... Additional parameters required by \a Type
> +
> +    \b Fixed:
> +    \param LocalPort The local port number of the (already bound) channel
> +    \param Mask Set to TRUE if the channel should be automatically masked
> before invoking the callback
> +
> +    \b Unbound:
> +    \param RemoteDomain The domid of the remote domain which will bind
> the channel
> +    \param Mask Set to TRUE if the channel should be automatically masked
> before invoking the callback
> +
> +    \b Interdomain:
> +    \param RemoteDomain The domid of the remote domain which has
> already bound the channel
> +    \param RemotePort The port number bound to the channel in the
> remote domain
> +    \param Mask Set to TRUE if the channel should be automatically masked
> before invoking the callback
> +
> +    \b VIRQ:
> +    \param Index The index number of the VIRQ
> +
> +    \return Event channel handle
> +*/
> +typedef PXENBUS_EVTCHN_CHANNEL
> +(*XENBUS_EVTCHN_OPEN)(
> +    IN  PINTERFACE          Interface,
> +    IN  XENBUS_EVTCHN_TYPE  Type,
> +    IN  PKSERVICE_ROUTINE   Function,
> +    IN  PVOID               Argument OPTIONAL,
> +    ...
> +    );
> +
> +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 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  USHORT                  Group,
> +    IN  UCHAR                   Number
> +    );
> +
> +typedef BOOLEAN
> +(*XENBUS_EVTCHN_UNMASK_V1)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
> +    IN  BOOLEAN                 InCallback
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_UNMASK
> +    \brief Unmask an event channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +    \param InCallback Set to TRUE if this method is invoked in context of the
> channel callback
> +*/
> +typedef VOID
> +(*XENBUS_EVTCHN_UNMASK)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
> +    IN  BOOLEAN                 InCallback
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_SEND
> +    \brief Send an event to the remote end of the channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +*/
> +typedef VOID
> +(*XENBUS_EVTCHN_SEND)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_TRIGGER
> +    \brief Send an event to the local end of the channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +*/
> +typedef VOID
> +(*XENBUS_EVTCHN_TRIGGER)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_WAIT
> +    \brief Wait for an event to the local end of the channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +    \param Timeout An optional timeout value (similar to
> KeWaitForSingleObject(), but non-zero values are allowed at
> DISPATCH_LEVEL).
> +*/
> +typedef NTSTATUS
> +(*XENBUS_EVTCHN_WAIT)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
> +    IN  PLARGE_INTEGER          Timeout OPTIONAL
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_GET_PORT
> +    \brief Get the local port number bound to the channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +    \return The port number
> +*/
> +typedef ULONG
> +(*XENBUS_EVTCHN_GET_PORT)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel
> +    );
> +
> +/*! \typedef XENBUS_EVTCHN_CLOSE
> +    \brief Close an event channel
> +
> +    \param Interface The interface header
> +    \param Channel The channel handle
> +*/
> +typedef VOID
> +(*XENBUS_EVTCHN_CLOSE)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_EVTCHN_CHANNEL  Channel
> +    );
> +
> +// {BE2440AC-1098-4150-AF4D-452FADCEF923}
> +DEFINE_GUID(GUID_XENBUS_EVTCHN_INTERFACE,
> +0xbe2440ac, 0x1098, 0x4150, 0xaf, 0x4d, 0x45, 0x2f, 0xad, 0xce, 0xf9, 0x23);
> +
> +/*! \struct _XENBUS_EVTCHN_INTERFACE_V1
> +    \brief EVTCHN interface version 1
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_EVTCHN_INTERFACE_V1 {
> +    INTERFACE               Interface;
> +    XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
> +    XENBUS_EVTCHN_RELEASE   EvtchnRelease;
> +    XENBUS_EVTCHN_OPEN      EvtchnOpen;
> +    XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
> +    XENBUS_EVTCHN_SEND      EvtchnSend;
> +    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
> +    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
> +    XENBUS_EVTCHN_CLOSE     EvtchnClose;
> +};
> +
> +/*! \struct _XENBUS_EVTCHN_INTERFACE_V2
> +    \brief EVTCHN interface version 2
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_EVTCHN_INTERFACE_V2 {
> +    INTERFACE               Interface;
> +    XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
> +    XENBUS_EVTCHN_RELEASE   EvtchnRelease;
> +    XENBUS_EVTCHN_OPEN      EvtchnOpen;
> +    XENBUS_EVTCHN_BIND_V2   EvtchnBindVersion2;
> +    XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
> +    XENBUS_EVTCHN_SEND      EvtchnSend;
> +    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
> +    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
> +    XENBUS_EVTCHN_CLOSE     EvtchnClose;
> +};
> +
> +/*! \struct _XENBUS_EVTCHN_INTERFACE_V3
> +    \brief EVTCHN interface version 3
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_EVTCHN_INTERFACE_V3 {
> +    INTERFACE               Interface;
> +    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;
> +    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
> +    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
> +    XENBUS_EVTCHN_CLOSE     EvtchnClose;
> +};
> +
> +/*! \struct _XENBUS_EVTCHN_INTERFACE_V5
> +    \brief EVTCHN interface version 5
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_EVTCHN_INTERFACE_V5 {
> +    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;
> +    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
> +    XENBUS_EVTCHN_WAIT      EvtchnWait;
> +    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
> +    XENBUS_EVTCHN_CLOSE     EvtchnClose;
> +};
> +
> +typedef struct _XENBUS_EVTCHN_INTERFACE_V5
> XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
> +
> +/*! \def XENBUS_EVTCHN
> +    \brief Macro at assist in method invocation
> +*/
> +#define XENBUS_EVTCHN(_Method, _Interface, ...)    \
> +    (_Interface)->Evtchn ## _Method((PINTERFACE)(_Interface),
> __VA_ARGS__)
> +
> +#endif  // _WINDLL
> +
> +#define XENBUS_EVTCHN_INTERFACE_VERSION_MIN 1
> +#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 5
> +
> +#endif  // _XENBUS_EVTCHN_INTERFACE_H
> +
> diff --git a/include/gnttab_interface.h b/include/gnttab_interface.h
> new file mode 100644
> index 0000000..b0f4adf
> --- /dev/null
> +++ b/include/gnttab_interface.h
> @@ -0,0 +1,249 @@
> +/* 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 gnttab_interface.h
> +    \brief XENBUS GNTTAB Interface
> +
> +    This interface provides access to the hypervisor grant table
> +*/
> +
> +#ifndef _XENBUS_GNTTAB_INTERFACE_H
> +#define _XENBUS_GNTTAB_INTERFACE_H
> +
> +#include <cache_interface.h>
> +
> +#ifndef _WINDLL
> +
> +/*! \typedef XENBUS_GNTTAB_ENTRY
> +    \brief Grant table entry handle
> +*/
> +typedef struct _XENBUS_GNTTAB_ENTRY XENBUS_GNTTAB_ENTRY,
> *PXENBUS_GNTTAB_ENTRY;
> +
> +/*! \typedef XENBUS_GNTTAB_CACHE
> +    \brief Grant table cache handle
> +*/
> +typedef struct _XENBUS_GNTTAB_CACHE XENBUS_GNTTAB_CACHE,
> *PXENBUS_GNTTAB_CACHE;
> +
> +/*! \typedef XENBUS_GNTTAB_ACQUIRE
> +    \brief Acquire a reference to the GNTTAB interface
> +
> +    \param Interface The interface header
> +*/
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_ACQUIRE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_RELEASE
> +    \brief Release a reference to the GNTTAB interface
> +
> +    \param Interface The interface header
> +*/
> +typedef VOID
> +(*XENBUS_GNTTAB_RELEASE)(
> +    IN  PINTERFACE  Interface
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_CREATE_CACHE
> +    \brief Create a cache of grant table entries
> +
> +    \param Interface The interface header
> +    \param Name A name for the cache which will be used in debug output
> +    \param Reservation The target minimum population of the cache
> +    \param AcquireLock A callback invoked to acquire a spinlock
> +    \param ReleaseLock A callback invoked to release the spinlock
> +    \param Argument An optional context argument passed to the callbacks
> +    \param Cache A pointer to a grant table cache handle to be initialized
> +*/
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_CREATE_CACHE)(
> +    IN  PINTERFACE                  Interface,
> +    IN  const CHAR                  *Name,
> +    IN  ULONG                       Reservation,
> +    IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
> +    IN  XENBUS_CACHE_RELEASE_LOCK   ReleaseLock,
> +    IN  PVOID                       Argument OPTIONAL,
> +    OUT PXENBUS_GNTTAB_CACHE        *Cache
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS
> +    \brief Get a table entry from the \a Cache permitting access to a given \a
> Pfn
> +
> +    \param Interface The interface header
> +    \param Cache The grant table cache handle
> +    \param Locked If mutually exclusive access to the cache is already
> +    guaranteed then set this to TRUE
> +    \param Domain The domid of the domain being granted access
> +    \param Pfn The frame number of the page that we are granting access to
> +    \param ReadOnly Set to TRUE if the foreign domain is only being granted
> +    read access
> +    \param Entry A pointer to a grant table entry handle to be initialized
> +*/
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS)(
> +    IN  PINTERFACE                  Interface,
> +    IN  PXENBUS_GNTTAB_CACHE        Cache,
> +    IN  BOOLEAN                     Locked,
> +    IN  USHORT                      Domain,
> +    IN  PFN_NUMBER                  Pfn,
> +    IN  BOOLEAN                     ReadOnly,
> +    OUT PXENBUS_GNTTAB_ENTRY        *Entry
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS
> +    \brief Revoke foreign access and return the \a Entry to the \a Cache
> +
> +    \param Interface The interface header
> +    \param Cache The grant table cache handle
> +    \param Locked If mutually exclusive access to the cache is already
> +    guaranteed then set this to TRUE
> +    \param Entry The grant table entry handle
> +*/
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS)(
> +    IN  PINTERFACE                  Interface,
> +    IN  PXENBUS_GNTTAB_CACHE        Cache,
> +    IN  BOOLEAN                     Locked,
> +    IN  PXENBUS_GNTTAB_ENTRY        Entry
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_GET_REFERENCE
> +    \brief Get the reference number of the entry
> +
> +    \param Interface The interface header
> +    \param Entry The grant table entry handle
> +    \return The reference number
> +*/
> +typedef ULONG
> +(*XENBUS_GNTTAB_GET_REFERENCE)(
> +    IN  PINTERFACE                  Interface,
> +    IN  PXENBUS_GNTTAB_ENTRY        Entry
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_DESTROY_CACHE
> +    \brief Destroy a cache of grant table entries
> +
> +    \param Interface The interface header
> +    \param Cache The grant table cache handle
> +
> +    All grant table entries must have been revoked prior to destruction
> +    of the cache
> +*/
> +typedef VOID
> +(*XENBUS_GNTTAB_DESTROY_CACHE)(
> +    IN  PINTERFACE              Interface,
> +    IN  PXENBUS_GNTTAB_CACHE    Cache
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_MAP_FOREIGN_PAGES
> +    \brief Map foreign memory pages into the system address space
> +
> +    \param Interface The interface header
> +    \param Domain The domid of the foreign domain that granted the pages
> +    \param NumberPages Number of pages to map
> +    \param References Array of grant reference numbers shared by the
> foreign domain
> +    \param ReadOnly If TRUE, pages are mapped with read-only access
> +    \param Address The physical address that the foreign pages are mapped
> under
> +*/
> +
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_MAP_FOREIGN_PAGES)(
> +    IN  PINTERFACE              Interface,
> +    IN  USHORT                  Domain,
> +    IN  ULONG                   NumberPages,
> +    IN  PULONG                  References,
> +    IN  BOOLEAN                 ReadOnly,
> +    OUT PHYSICAL_ADDRESS        *Address
> +    );
> +
> +/*! \typedef XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES
> +    \brief Unmap foreign memory pages from the system address space
> +
> +    \param Interface The interface header
> +    \param Address The physical address that the foreign pages are mapped
> under
> +*/
> +typedef NTSTATUS
> +(*XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES)(
> +    IN  PINTERFACE              Interface,
> +    IN  PHYSICAL_ADDRESS        Address
> +    );
> +
> +// {763679C5-E5C2-4A6D-8B88-6BB02EC42D8E}
> +DEFINE_GUID(GUID_XENBUS_GNTTAB_INTERFACE,
> +0x763679c5, 0xe5c2, 0x4a6d, 0x8b, 0x88, 0x6b, 0xb0, 0x2e, 0xc4, 0x2d, 0x8e);
> +
> +/*! \struct _XENBUS_GNTTAB_INTERFACE_V1
> +    \brief GNTTAB interface version 1
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_GNTTAB_INTERFACE_V1 {
> +    INTERFACE                           Interface;
> +    XENBUS_GNTTAB_ACQUIRE               GnttabAcquire;
> +    XENBUS_GNTTAB_RELEASE               GnttabRelease;
> +    XENBUS_GNTTAB_CREATE_CACHE          GnttabCreateCache;
> +    XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS
> GnttabPermitForeignAccess;
> +    XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS
> GnttabRevokeForeignAccess;
> +    XENBUS_GNTTAB_GET_REFERENCE         GnttabGetReference;
> +    XENBUS_GNTTAB_DESTROY_CACHE         GnttabDestroyCache;
> +};
> +
> +/*! \struct _XENBUS_GNTTAB_INTERFACE_V2
> +    \brief GNTTAB interface version 2
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_GNTTAB_INTERFACE_V2 {
> +    INTERFACE                           Interface;
> +    XENBUS_GNTTAB_ACQUIRE               GnttabAcquire;
> +    XENBUS_GNTTAB_RELEASE               GnttabRelease;
> +    XENBUS_GNTTAB_CREATE_CACHE          GnttabCreateCache;
> +    XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS
> GnttabPermitForeignAccess;
> +    XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS
> GnttabRevokeForeignAccess;
> +    XENBUS_GNTTAB_GET_REFERENCE         GnttabGetReference;
> +    XENBUS_GNTTAB_DESTROY_CACHE         GnttabDestroyCache;
> +    XENBUS_GNTTAB_MAP_FOREIGN_PAGES     GnttabMapForeignPages;
> +    XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES
> GnttabUnmapForeignPages;
> +};
> +
> +typedef struct _XENBUS_GNTTAB_INTERFACE_V2
> XENBUS_GNTTAB_INTERFACE, *PXENBUS_GNTTAB_INTERFACE;
> +
> +/*! \def XENBUS_GNTTAB
> +    \brief Macro at assist in method invocation
> +*/
> +#define XENBUS_GNTTAB(_Method, _Interface, ...)    \
> +    (_Interface)->Gnttab ## _Method((PINTERFACE)(_Interface),
> __VA_ARGS__)
> +
> +#endif  // _WINDLL
> +
> +#define XENBUS_GNTTAB_INTERFACE_VERSION_MIN 1
> +#define XENBUS_GNTTAB_INTERFACE_VERSION_MAX 2
> +
> +#endif  // _XENBUS_GNTTAB_INTERFACE_H
> +
> diff --git a/include/store_interface.h b/include/store_interface.h
> index 5bcbba3..52f1a1d 100644
> --- a/include/store_interface.h
> +++ b/include/store_interface.h
> @@ -50,6 +50,23 @@ typedef struct _XENBUS_STORE_TRANSACTION
> XENBUS_STORE_TRANSACTION, *PXENBUS_S
>  */
>  typedef struct _XENBUS_STORE_WATCH          XENBUS_STORE_WATCH,
> *PXENBUS_STORE_WATCH;
> 
> +/*! \typedef XENBUS_STORE_PERMISSION_MASK
> +    \brief Bitmask of XenStore key permissions
> +*/
> +typedef enum _XENBUS_STORE_PERMISSION_MASK {
> +    XENBUS_STORE_PERM_NONE = 0,
> +    XENBUS_STORE_PERM_READ = 1,
> +    XENBUS_STORE_PERM_WRITE = 2,
> +} XENBUS_STORE_PERMISSION_MASK;
> +
> +/*! \typedef XENBUS_STORE_PERMISSION
> +    \brief XenStore key permissions entry for a single domain
> +*/
> +typedef struct _XENBUS_STORE_PERMISSION {
> +    USHORT                          Domain;
> +    XENBUS_STORE_PERMISSION_MASK    Mask;
> +} XENBUS_STORE_PERMISSION, *PXENBUS_STORE_PERMISSION;
> +
>  /*! \typedef XENBUS_STORE_ACQUIRE
>      \brief Acquire a reference to the STORE interface
> 
> @@ -247,31 +264,74 @@ typedef VOID
>      IN  PINTERFACE  Interface
>      );
> 
> +/*! \typedef XENBUS_STORE_PERMISSIONS_SET
> +    \brief Set permissions for a XenStore key
> +
> +    \param Interface The interface header
> +    \param Transaction The transaction handle (NULL if this is not
> +    part of a transaction)
> +    \param Prefix An optional prefix for the \a Node
> +    \param Node The concatenation of the \a Prefix and this value specifies
> +    the XenStore key to set permissions of
> +    \param Permissions An array of permissions to set
> +    \param NumberPermissions Number of elements in the \a Permissions
> array
> +*/
> +typedef NTSTATUS
> +(*XENBUS_STORE_PERMISSIONS_SET)(
> +    IN  PINTERFACE                  Interface,
> +    IN  PXENBUS_STORE_TRANSACTION   Transaction OPTIONAL,
> +    IN  PCHAR                       Prefix OPTIONAL,
> +    IN  PCHAR                       Node,
> +    IN  PXENBUS_STORE_PERMISSION    Permissions,
> +    IN  ULONG                       NumberPermissions
> +    );
> +
>  // {86824C3B-D34E-4753-B281-2F1E3AD214D7}
>  DEFINE_GUID(GUID_XENBUS_STORE_INTERFACE,
>  0x86824c3b, 0xd34e, 0x4753, 0xb2, 0x81, 0x2f, 0x1e, 0x3a, 0xd2, 0x14, 0xd7);
> 
> -struct _XENBUS_STORE_INTERFACE_V1 {
> -    INTERFACE                       Interface;
> -    XENBUS_STORE_ACQUIRE            StoreAcquire;
> -    XENBUS_STORE_RELEASE            StoreRelease;
> -    XENBUS_STORE_FREE               StoreFree;
> -    XENBUS_STORE_READ               StoreRead;
> -    XENBUS_STORE_PRINTF             StorePrintf;
> -    XENBUS_STORE_REMOVE             StoreRemove;
> -    XENBUS_STORE_DIRECTORY          StoreDirectory;
> -    XENBUS_STORE_TRANSACTION_START  StoreTransactionStart;
> -    XENBUS_STORE_TRANSACTION_END    StoreTransactionEnd;
> -    XENBUS_STORE_WATCH_ADD          StoreWatchAdd;
> -    XENBUS_STORE_WATCH_REMOVE       StoreWatchRemove;
> -    XENBUS_STORE_POLL               StorePoll;
> -};
> -
>  /*! \struct _XENBUS_STORE_INTERFACE_V1
>      \brief STORE interface version 1
>      \ingroup interfaces
>  */
> -typedef struct _XENBUS_STORE_INTERFACE_V1
> XENBUS_STORE_INTERFACE, *PXENBUS_STORE_INTERFACE;
> +struct _XENBUS_STORE_INTERFACE_V1 {
> +    INTERFACE                       Interface;
> +    XENBUS_STORE_ACQUIRE            StoreAcquire;
> +    XENBUS_STORE_RELEASE            StoreRelease;
> +    XENBUS_STORE_FREE               StoreFree;
> +    XENBUS_STORE_READ               StoreRead;
> +    XENBUS_STORE_PRINTF             StorePrintf;
> +    XENBUS_STORE_REMOVE             StoreRemove;
> +    XENBUS_STORE_DIRECTORY          StoreDirectory;
> +    XENBUS_STORE_TRANSACTION_START  StoreTransactionStart;
> +    XENBUS_STORE_TRANSACTION_END    StoreTransactionEnd;
> +    XENBUS_STORE_WATCH_ADD          StoreWatchAdd;
> +    XENBUS_STORE_WATCH_REMOVE       StoreWatchRemove;
> +    XENBUS_STORE_POLL               StorePoll;
> +};
> +
> +/*! \struct _XENBUS_STORE_INTERFACE_V2
> +    \brief STORE interface version 2
> +    \ingroup interfaces
> +*/
> +struct _XENBUS_STORE_INTERFACE_V2 {
> +    INTERFACE                       Interface;
> +    XENBUS_STORE_ACQUIRE            StoreAcquire;
> +    XENBUS_STORE_RELEASE            StoreRelease;
> +    XENBUS_STORE_FREE               StoreFree;
> +    XENBUS_STORE_READ               StoreRead;
> +    XENBUS_STORE_PRINTF             StorePrintf;
> +    XENBUS_STORE_PERMISSIONS_SET    StorePermissionsSet;
> +    XENBUS_STORE_REMOVE             StoreRemove;
> +    XENBUS_STORE_DIRECTORY          StoreDirectory;
> +    XENBUS_STORE_TRANSACTION_START  StoreTransactionStart;
> +    XENBUS_STORE_TRANSACTION_END    StoreTransactionEnd;
> +    XENBUS_STORE_WATCH_ADD          StoreWatchAdd;
> +    XENBUS_STORE_WATCH_REMOVE       StoreWatchRemove;
> +    XENBUS_STORE_POLL               StorePoll;
> +};
> +
> +typedef struct _XENBUS_STORE_INTERFACE_V2
> XENBUS_STORE_INTERFACE, *PXENBUS_STORE_INTERFACE;
> 
>  /*! \def XENBUS_STORE
>      \brief Macro at assist in method invocation
> @@ -282,7 +342,7 @@ typedef struct _XENBUS_STORE_INTERFACE_V1
> XENBUS_STORE_INTERFACE, *PXENBUS_STORE
>  #endif  // _WINDLL
> 
>  #define XENBUS_STORE_INTERFACE_VERSION_MIN  1
> -#define XENBUS_STORE_INTERFACE_VERSION_MAX  1
> +#define XENBUS_STORE_INTERFACE_VERSION_MAX  2
> 
>  #endif  // _XENBUS_STORE_INTERFACE_H
> 
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Fri Oct 23 13:40:05 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 13:40: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 1ZpcZg-0004ha-Oh; Fri, 23 Oct 2015 13:40:04 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7314647ef=Paul.Durrant@citrix.com>)
	id 1ZpcZf-0004gR-5U
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 13:40:03 +0000
Received: from [193.109.254.147] by server-5.bemta-14.messagelabs.com id
	57/ED-00475-2B83A265; Fri, 23 Oct 2015 13:40:02 +0000
X-Env-Sender: prvs=7314647ef=Paul.Durrant@citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1445607601!60956914!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 2010 invoked from network); 23 Oct 2015 13:40:01 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 13:40:01 -0000
X-IronPort-AV: E=Sophos;i="5.20,186,1444694400"; 
   d="scan'208";a="5998743"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 2/6] Include ntifs.h instead of ntddk.h
Thread-Index: AQHRC8D76NNVN4bW7k6GiFaI/ZQj3555GQzg
Date: Fri, 23 Oct 2015 13:39:53 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F622FB6@AMSPEX01CL01.citrite.net>
References: <562721E2.9090506@invisiblethingslab.com>
In-Reply-To: <562721E2.9090506@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] [PATCH 2/6] Include ntifs.h instead of ntddk.h
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 Rafal Wojdyla
> Sent: 21 October 2015 06:26
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 2/6] Include ntifs.h instead of ntddk.h
> 
> Gnttab code uses KeStackAttachProcess which is only declared in ntifs.h
> (conflicts with ntddk.h).
> 
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xeniface/driver.c | 3 +--
>  src/xeniface/driver.h | 2 +-
>  src/xeniface/fdo.c    | 2 +-
>  src/xeniface/fdo.h    | 2 +-
>  src/xeniface/wmi.c    | 3 +--
>  src/xeniface/wmi.h    | 2 +-
>  6 files changed, 6 insertions(+), 8 deletions(-)
> 
> diff --git a/src/xeniface/driver.c b/src/xeniface/driver.c
> index 281ebdf..1c84467 100644
> --- a/src/xeniface/driver.c
> +++ b/src/xeniface/driver.c
> @@ -29,8 +29,7 @@
>   * SUCH DAMAGE.
>   */
> 
> -#include <ntddk.h>
> -//#include <util.h>
> +#include <ntifs.h>
>  #include <version.h>
> 
>  #include "fdo.h"
> diff --git a/src/xeniface/driver.h b/src/xeniface/driver.h
> index 93ac645..00f2d8f 100644
> --- a/src/xeniface/driver.h
> +++ b/src/xeniface/driver.h
> @@ -44,7 +44,7 @@
>  #pragma warning(disable:4100 4057)
> 
>  #include <wmilib.h>
> -#include <ntddk.h>
> +#include <ntifs.h>
>  extern PDRIVER_OBJECT   DriverObject;
> 
> 
> diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
> index 321bfb3..51bda24 100644
> --- a/src/xeniface/fdo.c
> +++ b/src/xeniface/fdo.c
> @@ -30,7 +30,7 @@
>   */
> 
> 
> -#include <ntddk.h>
> +#include <ntifs.h>
>  #include <wdmguid.h>
>  #include <ntstrsafe.h>
>  #include <stdlib.h>
> diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
> index 32f6bb1..4416064 100644
> --- a/src/xeniface/fdo.h
> +++ b/src/xeniface/fdo.h
> @@ -32,7 +32,7 @@
>  #ifndef _XENIFACE_FDO_H
>  #define _XENIFACE_FDO_H
> 
> -#include <ntddk.h>
> +#include <ntifs.h>
>  #include <store_interface.h>
>  #include <suspend_interface.h>
>  #include <shared_info_interface.h>
> diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
> index 4285ada..1bdb834 100644
> --- a/src/xeniface/wmi.c
> +++ b/src/xeniface/wmi.c
> @@ -30,12 +30,11 @@
>   */
> 
> 
> -#include <ntddk.h>
> +#include <ntifs.h>
>  #include <initguid.h>
>  #include <wmistr.h>
>  #include <wmilib.h>
>  #include <stdio.h>
> -#include <ntddk.h>
>  #include <guiddef.h>
>  #define NTSTRSAFE_LIB
>  #include<ntstrsafe.h>
> diff --git a/src/xeniface/wmi.h b/src/xeniface/wmi.h
> index 7fb67ca..ed77af7 100644
> --- a/src/xeniface/wmi.h
> +++ b/src/xeniface/wmi.h
> @@ -33,7 +33,7 @@
>  #ifndef _XEVTCHN_WMI_H
>  #define _XEVTCHN_WMI_H
> 
> -#include <ntddk.h>
> +#include <ntifs.h>
>  #include "driver.h"
>  #include "wmi_generated.h"
> 
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Fri Oct 23 13:40:05 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 13:40: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 1ZpcZg-0004ha-Oh; Fri, 23 Oct 2015 13:40:04 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7314647ef=Paul.Durrant@citrix.com>)
	id 1ZpcZf-0004gR-5U
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 13:40:03 +0000
Received: from [193.109.254.147] by server-5.bemta-14.messagelabs.com id
	57/ED-00475-2B83A265; Fri, 23 Oct 2015 13:40:02 +0000
X-Env-Sender: prvs=7314647ef=Paul.Durrant@citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1445607601!60956914!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 2010 invoked from network); 23 Oct 2015 13:40:01 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 13:40:01 -0000
X-IronPort-AV: E=Sophos;i="5.20,186,1444694400"; 
   d="scan'208";a="5998743"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 2/6] Include ntifs.h instead of ntddk.h
Thread-Index: AQHRC8D76NNVN4bW7k6GiFaI/ZQj3555GQzg
Date: Fri, 23 Oct 2015 13:39:53 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F622FB6@AMSPEX01CL01.citrite.net>
References: <562721E2.9090506@invisiblethingslab.com>
In-Reply-To: <562721E2.9090506@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] [PATCH 2/6] Include ntifs.h instead of ntddk.h
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 Rafal Wojdyla
> Sent: 21 October 2015 06:26
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 2/6] Include ntifs.h instead of ntddk.h
> 
> Gnttab code uses KeStackAttachProcess which is only declared in ntifs.h
> (conflicts with ntddk.h).
> 
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xeniface/driver.c | 3 +--
>  src/xeniface/driver.h | 2 +-
>  src/xeniface/fdo.c    | 2 +-
>  src/xeniface/fdo.h    | 2 +-
>  src/xeniface/wmi.c    | 3 +--
>  src/xeniface/wmi.h    | 2 +-
>  6 files changed, 6 insertions(+), 8 deletions(-)
> 
> diff --git a/src/xeniface/driver.c b/src/xeniface/driver.c
> index 281ebdf..1c84467 100644
> --- a/src/xeniface/driver.c
> +++ b/src/xeniface/driver.c
> @@ -29,8 +29,7 @@
>   * SUCH DAMAGE.
>   */
> 
> -#include <ntddk.h>
> -//#include <util.h>
> +#include <ntifs.h>
>  #include <version.h>
> 
>  #include "fdo.h"
> diff --git a/src/xeniface/driver.h b/src/xeniface/driver.h
> index 93ac645..00f2d8f 100644
> --- a/src/xeniface/driver.h
> +++ b/src/xeniface/driver.h
> @@ -44,7 +44,7 @@
>  #pragma warning(disable:4100 4057)
> 
>  #include <wmilib.h>
> -#include <ntddk.h>
> +#include <ntifs.h>
>  extern PDRIVER_OBJECT   DriverObject;
> 
> 
> diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
> index 321bfb3..51bda24 100644
> --- a/src/xeniface/fdo.c
> +++ b/src/xeniface/fdo.c
> @@ -30,7 +30,7 @@
>   */
> 
> 
> -#include <ntddk.h>
> +#include <ntifs.h>
>  #include <wdmguid.h>
>  #include <ntstrsafe.h>
>  #include <stdlib.h>
> diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
> index 32f6bb1..4416064 100644
> --- a/src/xeniface/fdo.h
> +++ b/src/xeniface/fdo.h
> @@ -32,7 +32,7 @@
>  #ifndef _XENIFACE_FDO_H
>  #define _XENIFACE_FDO_H
> 
> -#include <ntddk.h>
> +#include <ntifs.h>
>  #include <store_interface.h>
>  #include <suspend_interface.h>
>  #include <shared_info_interface.h>
> diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
> index 4285ada..1bdb834 100644
> --- a/src/xeniface/wmi.c
> +++ b/src/xeniface/wmi.c
> @@ -30,12 +30,11 @@
>   */
> 
> 
> -#include <ntddk.h>
> +#include <ntifs.h>
>  #include <initguid.h>
>  #include <wmistr.h>
>  #include <wmilib.h>
>  #include <stdio.h>
> -#include <ntddk.h>
>  #include <guiddef.h>
>  #define NTSTRSAFE_LIB
>  #include<ntstrsafe.h>
> diff --git a/src/xeniface/wmi.h b/src/xeniface/wmi.h
> index 7fb67ca..ed77af7 100644
> --- a/src/xeniface/wmi.h
> +++ b/src/xeniface/wmi.h
> @@ -33,7 +33,7 @@
>  #ifndef _XEVTCHN_WMI_H
>  #define _XEVTCHN_WMI_H
> 
> -#include <ntddk.h>
> +#include <ntifs.h>
>  #include "driver.h"
>  #include "wmi_generated.h"
> 
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Fri Oct 23 13:40:32 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 13:40: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 1Zpca7-0004oW-Qt; Fri, 23 Oct 2015 13:40:31 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7314647ef=Paul.Durrant@citrix.com>)
	id 1Zpca6-0004nv-IT
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 13:40:31 +0000
Received: from [85.158.139.211] by server-17.bemta-5.messagelabs.com id
	5A/10-18107-DC83A265; Fri, 23 Oct 2015 13:40:29 +0000
X-Env-Sender: prvs=7314647ef=Paul.Durrant@citrix.com
X-Msg-Ref: server-14.tower-206.messagelabs.com!1445607626!39212485!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16175 invoked from network); 23 Oct 2015 13:40:26 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-14.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 13:40:26 -0000
X-IronPort-AV: E=Sophos;i="5.20,186,1444694400"; 
   d="scan'208";a="5998779"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 3/6] Untabify the whole XENIFACE project
Thread-Index: AQHRC8ELFaul0EcQD0yK0RCjO2Wem555GTJg
Date: Fri, 23 Oct 2015 13:40:25 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F622FCE@AMSPEX01CL01.citrite.net>
References: <562721EE.6090909@invisiblethingslab.com>
In-Reply-To: <562721EE.6090909@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] [PATCH 3/6] Untabify the whole XENIFACE project
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 Rafal Wojdyla
> Sent: 21 October 2015 06:26
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 3/6] Untabify the whole XENIFACE project
> 
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  include/util.h        |   8 +-
>  src/xeniface/driver.c |  32 +--
>  src/xeniface/driver.h |   2 +-
>  src/xeniface/fdo.c    | 268 +++++++++++-----------
>  src/xeniface/fdo.h    |  14 +-
>  src/xeniface/ioctls.c |   4 +-
>  src/xeniface/log.h    |   4 +-
>  src/xeniface/thread.c |   2 +-
>  src/xeniface/wmi.c    | 604 +++++++++++++++++++++++++--------------------
> -----
>  src/xeniface/wmi.h    |   8 +-
>  10 files changed, 473 insertions(+), 473 deletions(-)
> 
> diff --git a/include/util.h b/include/util.h
> index a05fb34..10e5414 100644
> --- a/include/util.h
> +++ b/include/util.h
> @@ -232,10 +232,10 @@ __AllocatePage(
> 
>      MdlMappedSystemVa = MmMapLockedPagesSpecifyCache(Mdl,
>                                                       KernelMode,
> -						                             MmCached,
> -						                             NULL,
> -						                             FALSE,
> -
> NormalPagePriority);
> +                                                     MmCached,
> +                                                     NULL,
> +                                                     FALSE,
> +                                                     NormalPagePriority);
> 
>      status = STATUS_UNSUCCESSFUL;
>      if (MdlMappedSystemVa == NULL)
> diff --git a/src/xeniface/driver.c b/src/xeniface/driver.c
> index 1c84467..40b1669 100644
> --- a/src/xeniface/driver.c
> +++ b/src/xeniface/driver.c
> @@ -58,9 +58,9 @@ DriverUnload(
>          goto done;
> 
> 
> -	if (DriverParameters.RegistryPath.Buffer != NULL) {
> -		ExFreePool(DriverParameters.RegistryPath.Buffer);
> -	}
> +    if (DriverParameters.RegistryPath.Buffer != NULL) {
> +        ExFreePool(DriverParameters.RegistryPath.Buffer);
> +    }
> 
>  done:
>      DriverObject = NULL;
> @@ -145,7 +145,7 @@ DriverEntry(
>      )
>  {
>      ULONG               Index;
> -	NTSTATUS status = STATUS_UNSUCCESSFUL;
> +    NTSTATUS status = STATUS_UNSUCCESSFUL;
>      ASSERT3P(DriverObject, ==, NULL);
> 
>      ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
> @@ -156,16 +156,16 @@ DriverEntry(
>           MAJOR_VERSION_STR "." MINOR_VERSION_STR "."
> MICRO_VERSION_STR "." BUILD_NUMBER_STR,
>           DAY_STR "/" MONTH_STR "/" YEAR_STR);
> 
> -	DriverParameters.RegistryPath.MaximumLength = RegistryPath-
> >Length + sizeof(UNICODE_NULL);
> -	DriverParameters.RegistryPath.Length = RegistryPath->Length;
> -	DriverParameters.RegistryPath.Buffer = ExAllocatePoolWithTag
> (PagedPool,
> -
> 			DriverParameters.RegistryPath.MaximumLength,
> -
> 			XENIFACE_POOL_TAG);
> -	if (NULL == DriverParameters.RegistryPath.Buffer) {
> -		status = STATUS_INSUFFICIENT_RESOURCES;
> -		goto fail1;
> -	}
> -	RtlCopyUnicodeString(&DriverParameters.RegistryPath,
> RegistryPath);
> +    DriverParameters.RegistryPath.MaximumLength = RegistryPath->Length
> + sizeof(UNICODE_NULL);
> +    DriverParameters.RegistryPath.Length = RegistryPath->Length;
> +    DriverParameters.RegistryPath.Buffer = ExAllocatePoolWithTag
> (PagedPool,
> +                                                DriverParameters.RegistryPath.MaximumLength,
> +                                                XENIFACE_POOL_TAG);
> +    if (NULL == DriverParameters.RegistryPath.Buffer) {
> +        status = STATUS_INSUFFICIENT_RESOURCES;
> +        goto fail1;
> +    }
> +    RtlCopyUnicodeString(&DriverParameters.RegistryPath, RegistryPath);
> 
> 
>      DriverObject = _DriverObject;
> @@ -187,6 +187,6 @@ done:
> 
>      return STATUS_SUCCESS;
>  fail1:
> -	Error("fail1 (%08x)\n", status);
> -	return status;
> +    Error("fail1 (%08x)\n", status);
> +    return status;
>  }
> diff --git a/src/xeniface/driver.h b/src/xeniface/driver.h
> index 00f2d8f..f3c86e8 100644
> --- a/src/xeniface/driver.h
> +++ b/src/xeniface/driver.h
> @@ -51,7 +51,7 @@ extern PDRIVER_OBJECT   DriverObject;
>  #define MAX_DEVICE_ID_LEN   200
> 
>  typedef struct _XENIFACE_PARAMETERS {
> -	UNICODE_STRING RegistryPath;
> +    UNICODE_STRING RegistryPath;
> 
>  } XENIFACE_PARAMETERS, *PXENIFACE_PARAMETERS;
> 
> diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
> index 51bda24..b73dee1 100644
> --- a/src/xeniface/fdo.c
> +++ b/src/xeniface/fdo.c
> @@ -1,31 +1,31 @@
>  /* Copyright (c) Citrix Systems Inc.
>   * All rights reserved.
> - *
> - * Redistribution and use in source and binary forms,
> - * with or without modification, are permitted provided
> + *
> + * 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
> + *
> + * *   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
> + * *   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
> + *
> + * 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.
>   */
> 
> @@ -70,7 +70,7 @@ FdoInitialiseXSRegistryEntries(
>      ANSI_STRING AnsiValue;
>      char *value;
>      NTSTATUS status;
> -	NT_ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
> +    NT_ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
>      status = XENBUS_STORE(Read,
>                            &Fdo->StoreInterface,
>                            NULL,
> @@ -113,7 +113,7 @@ FdoInitialiseXSRegistryEntries(
>      }
> 
>      ZwClose(RegHandle);
> -
> +
>      RtlFreeUnicodeString(&UnicodeValue);
>      XENBUS_STORE(Free, &Fdo->StoreInterface, value);
> 
> @@ -140,40 +140,40 @@ failXS:
>  #define REGISTRY_THREAD_END_EVENT 1
>  #define REGISTRY_EVENTS 2
> 
> -static NTSTATUS FdoRegistryThreadHandler(IN  PXENIFACE_THREAD  Self,
> -								  IN PVOID
> StartContext) {
> -	KEVENT* threadevents[REGISTRY_EVENTS];
> -	PXENIFACE_FDO Fdo = (PXENIFACE_FDO)StartContext;
> -	NTSTATUS status;
> +static NTSTATUS FdoRegistryThreadHandler(IN  PXENIFACE_THREAD  Self,
> +                                         IN  PVOID StartContext) {
> +    KEVENT* threadevents[REGISTRY_EVENTS];
> +    PXENIFACE_FDO Fdo = (PXENIFACE_FDO)StartContext;
> +    NTSTATUS status;
> 
> -	PKEVENT             Event;
> +    PKEVENT             Event;
> 
>      Event = ThreadGetEvent(Self);
> 
> -	threadevents[REGISTRY_WRITE_EVENT] = &Fdo-
> >registryWriteEvent;
> -	threadevents[REGISTRY_THREAD_END_EVENT] = Event;
> +    threadevents[REGISTRY_WRITE_EVENT] = &Fdo->registryWriteEvent;
> +    threadevents[REGISTRY_THREAD_END_EVENT] = Event;
> 
> -	for(;;) {
> -
> -		status = KeWaitForMultipleObjects(REGISTRY_EVENTS,
> (PVOID *)threadevents, WaitAny, Executive, KernelMode, TRUE, NULL,
> NULL);
> -		if ((status>=STATUS_WAIT_0) && (status <
> STATUS_WAIT_0+REGISTRY_EVENTS)) {
> -			if (status ==
> STATUS_WAIT_0+REGISTRY_WRITE_EVENT) {
> +    for(;;) {
> +
> +        status = KeWaitForMultipleObjects(REGISTRY_EVENTS, (PVOID
> *)threadevents, WaitAny, Executive, KernelMode, TRUE, NULL, NULL);
> +        if ((status>=STATUS_WAIT_0) && (status <
> STATUS_WAIT_0+REGISTRY_EVENTS)) {
> +            if (status == STATUS_WAIT_0+REGISTRY_WRITE_EVENT) {
>                  XenIfaceDebugPrint(ERROR,"WriteRegistry\n");
>                  FdoInitialiseXSRegistryEntries(Fdo);
>                  KeClearEvent(threadevents[REGISTRY_WRITE_EVENT]);
> -			}
> -			if (status ==
> STATUS_WAIT_0+REGISTRY_THREAD_END_EVENT) {
> -				if (ThreadIsAlerted(Self))
> -					return STATUS_SUCCESS;
> -
> 	KeClearEvent(threadevents[REGISTRY_THREAD_END_EVENT]);
> -			}
> -
> -		}
> -		else if (!NT_SUCCESS(status)) {
> -			XenIfaceDebugPrint(ERROR, "Registry handler thread
> failed %x\n", status);
> -			return status;
> -		}
> -	}
> +            }
> +            if (status == STATUS_WAIT_0+REGISTRY_THREAD_END_EVENT) {
> +                if (ThreadIsAlerted(Self))
> +                    return STATUS_SUCCESS;
> +                KeClearEvent(threadevents[REGISTRY_THREAD_END_EVENT]);
> +            }
> +
> +        }
> +        else if (!NT_SUCCESS(status)) {
> +            XenIfaceDebugPrint(ERROR, "Registry handler thread failed %x\n",
> status);
> +            return status;
> +        }
> +    }
> 
>  }
> 
> @@ -311,7 +311,7 @@ __FdoSetName(
>      status = RtlUnicodeStringToAnsiString(&Ansi, &Unicode, FALSE);
>      if (!NT_SUCCESS(status))
>          goto fail1;
> -
> +
>      for (Index = 0; Dx->Name[Index] != '\0'; Index++) {
>          if (!isalnum((UCHAR)Dx->Name[Index]))
>              Dx->Name[Index] = '_';
> @@ -437,7 +437,7 @@ __FdoForwardIrpSynchronously(
>      IN  PVOID           Context
>      )
>  {
> -	PKEVENT             Event = (PKEVENT)Context;
> +    PKEVENT             Event = (PKEVENT)Context;
> 
>      UNREFERENCED_PARAMETER(DeviceObject);
>      UNREFERENCED_PARAMETER(Irp);
> @@ -595,7 +595,7 @@ __FdoFreeAnsi(
> 
>      for (Index = 0; Ansi[Index].Buffer != NULL; Index++)
>          __FdoFree(Ansi[Index].Buffer);
> -
> +
>      __FdoFree(Ansi);
>  }
> 
> @@ -752,7 +752,7 @@ FdoD3ToD0(
>      if (!NT_SUCCESS(status))
>          goto fail4;
> 
> -	Fdo->InterfacesAcquired = TRUE;
> +    Fdo->InterfacesAcquired = TRUE;
>      KeLowerIrql(Irql);
> 
>      return STATUS_SUCCESS;
> @@ -760,7 +760,7 @@ FdoD3ToD0(
>  fail4:
>      Error("fail4\n");
> 
> -	XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
> +    XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
> 
>  fail3:
>      Error("fail3\n");
> @@ -788,7 +788,7 @@ FdoD0ToD3(
>      KIRQL           Irql;
> 
>      ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
> -	Fdo->InterfacesAcquired = FALSE;
> +    Fdo->InterfacesAcquired = FALSE;
>      KeRaiseIrql(DISPATCH_LEVEL, &Irql);
> 
>      XENBUS_SUSPEND(Deregister,
> @@ -796,12 +796,12 @@ FdoD0ToD3(
>                     Fdo->SuspendCallbackLate);
>      Fdo->SuspendCallbackLate = NULL;
> 
> -	XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
> +    XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
> 
>      XENBUS_SUSPEND(Release, &Fdo->SuspendInterface);
> 
>      __FdoD0ToD3(Fdo);
> -
> +
>      KeLowerIrql(Irql);
>  }
> 
> @@ -854,16 +854,16 @@ FdoStartDevice(
>      if (!NT_SUCCESS(status))
>          goto fail3;
> 
> -	status =  IoSetDeviceInterfaceState(&Fdo->InterfaceName, TRUE);
> -	if (!NT_SUCCESS(status))
> -		goto fail4;
> +    status =  IoSetDeviceInterfaceState(&Fdo->InterfaceName, TRUE);
> +    if (!NT_SUCCESS(status))
> +        goto fail4;
> 
> 
> -	if (__FdoGetDevicePnpState(Fdo) != Stopped) {
> -		status = WmiInit(Fdo);
> -		if (!NT_SUCCESS(status))
> -			goto fail5;
> -	}
> +    if (__FdoGetDevicePnpState(Fdo) != Stopped) {
> +        status = WmiInit(Fdo);
> +        if (!NT_SUCCESS(status))
> +            goto fail5;
> +    }
> 
>      __FdoSetDevicePnpState(Fdo, Started);
> 
> @@ -874,13 +874,13 @@ FdoStartDevice(
>      return status;
> 
>  fail5:
> -	Error("fail5\n");
> +    Error("fail5\n");
>  #pragma warning(suppress : 6031)
> -	IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
> +    IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
> 
>  fail4:
> -	Error("fail4\n");
> -	FdoD0ToD3(Fdo);
> +    Error("fail4\n");
> +    FdoD0ToD3(Fdo);
> 
>  fail3:
>      Error("fail3\n");
> @@ -1008,7 +1008,7 @@ FdoSurpriseRemoval(
>      __FdoSetDevicePnpState(Fdo, SurpriseRemovePending);
> 
>      Irp->IoStatus.Status = STATUS_SUCCESS;
> -#pragma warning(suppress : 6031)
> +#pragma warning(suppress : 6031)
>      IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
>      WmiFinalise(Fdo);
> 
> @@ -1031,7 +1031,7 @@ FdoRemoveDevice(
>      if (__FdoGetDevicePowerState(Fdo) != PowerDeviceD0)
>          goto done;
> 
> -	FdoD0ToD3(Fdo);
> +    FdoD0ToD3(Fdo);
> 
>      __FdoSetSystemPowerState(Fdo, PowerSystemSleeping3);
>      FdoS3ToS4(Fdo);
> @@ -1043,7 +1043,7 @@ done:
>      __FdoSetDevicePnpState(Fdo, Deleted);
> 
>      Irp->IoStatus.Status = STATUS_SUCCESS;
> -#pragma warning(suppress : 6031)
> +#pragma warning(suppress : 6031)
>      IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
>      WmiFinalise(Fdo);
> 
> @@ -1139,7 +1139,7 @@ FdoDeviceUsageNotification(
>      if (!NT_SUCCESS(status))
>          goto fail1;
> 
> -    NotDisableable = FALSE;
> +    NotDisableable = FALSE;
>      for (Type = (DEVICE_USAGE_NOTIFICATION_TYPE)0; Type <=
> DeviceUsageTypeDumpFile; Type++) {
>          if (Fdo->Usage[Type] != 0) {
>              NotDisableable = TRUE;
> @@ -1151,7 +1151,7 @@ FdoDeviceUsageNotification(
> 
>      if (Fdo->NotDisableable != NotDisableable) {
>          Fdo->NotDisableable = NotDisableable;
> -
> +
>          IoInvalidateDeviceState(__FdoGetPhysicalDeviceObject(Fdo));
>      }
> 
> @@ -1210,8 +1210,8 @@ FdoDispatchPnp(
>      MinorFunction = StackLocation->MinorFunction;
> 
>      Trace("====> (%02x:%s)\n",
> -          MinorFunction,
> -          PnpMinorFunctionName(MinorFunction));
> +          MinorFunction,
> +          PnpMinorFunctionName(MinorFunction));
> 
>      switch (StackLocation->MinorFunction) {
>      case IRP_MN_START_DEVICE:
> @@ -1265,9 +1265,9 @@ FdoDispatchPnp(
>      }
> 
>      Trace("<==== (%02x:%s)(%08x)\n",
> -          MinorFunction,
> +          MinorFunction,
>            PnpMinorFunctionName(MinorFunction),
> -          status);
> +          status);
> 
>      return status;
>  }
> @@ -1299,7 +1299,7 @@ __FdoSetDevicePowerUp(
> 
>      ASSERT3U(DeviceState, ==, PowerDeviceD0);
>      status = FdoD3ToD0(Fdo);
> -	SessionsResumeAll(Fdo);
> +    SessionsResumeAll(Fdo);
>      ASSERT(NT_SUCCESS(status));
> 
>  done:
> @@ -1332,9 +1332,9 @@ __FdoSetDevicePowerDown(
>      ASSERT3U(DeviceState, ==, PowerDeviceD3);
> 
>      if (__FdoGetDevicePowerState(Fdo) == PowerDeviceD0){
> -		SessionsSuspendAll(Fdo);
> +        SessionsSuspendAll(Fdo);
>          FdoD0ToD3(Fdo);
> -	}
> +    }
> 
>      IoSkipCurrentIrpStackLocation(Irp);
>      status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
> @@ -1358,7 +1358,7 @@ __FdoSetDevicePower(
>      PowerAction = StackLocation->Parameters.Power.ShutdownType;
> 
>      Trace("====> (%s:%s)\n",
> -          PowerDeviceStateName(DeviceState),
> +          PowerDeviceStateName(DeviceState),
>            PowerActionName(PowerAction));
> 
>      ASSERT3U(PowerAction, <, PowerActionShutdown);
> @@ -1376,7 +1376,7 @@ __FdoSetDevicePower(
> 
>  done:
>      Trace("<==== (%s:%s)(%08x)\n",
> -          PowerDeviceStateName(DeviceState),
> +          PowerDeviceStateName(DeviceState),
>            PowerActionName(PowerAction),
>            status);
>      return status;
> @@ -1532,7 +1532,7 @@ __FdoSetSystemPower(
>      PowerAction = StackLocation->Parameters.Power.ShutdownType;
> 
>      Trace("====> (%s:%s)\n",
> -          PowerSystemStateName(SystemState),
> +          PowerSystemStateName(SystemState),
>            PowerActionName(PowerAction));
> 
>      ASSERT3U(PowerAction, <, PowerActionShutdown);
> @@ -1550,7 +1550,7 @@ __FdoSetSystemPower(
> 
>  done:
>      Trace("<==== (%s:%s)(%08x)\n",
> -          PowerSystemStateName(SystemState),
> +          PowerSystemStateName(SystemState),
>            PowerActionName(PowerAction),
>            status);
>      return status;
> @@ -1616,7 +1616,7 @@ __FdoQueryDevicePower(
>      PowerAction = StackLocation->Parameters.Power.ShutdownType;
> 
>      Trace("====> (%s:%s)\n",
> -          PowerDeviceStateName(DeviceState),
> +          PowerDeviceStateName(DeviceState),
>            PowerActionName(PowerAction));
> 
>      ASSERT3U(PowerAction, <, PowerActionShutdown);
> @@ -1634,7 +1634,7 @@ __FdoQueryDevicePower(
> 
>  done:
>      Trace("<==== (%s:%s)(%08x)\n",
> -          PowerDeviceStateName(DeviceState),
> +          PowerDeviceStateName(DeviceState),
>            PowerActionName(PowerAction),
>            status);
>      return status;
> @@ -1768,7 +1768,7 @@ __FdoQuerySystemPower(
>      PowerAction = StackLocation->Parameters.Power.ShutdownType;
> 
>      Trace("====> (%s:%s)\n",
> -          PowerSystemStateName(SystemState),
> +          PowerSystemStateName(SystemState),
>            PowerActionName(PowerAction));
> 
>      ASSERT3U(PowerAction, <, PowerActionShutdown);
> @@ -1786,7 +1786,7 @@ __FdoQuerySystemPower(
> 
>  done:
>      Trace("<==== (%s:%s)(%08x)\n",
> -          PowerSystemStateName(SystemState),
> +          PowerSystemStateName(SystemState),
>            PowerActionName(PowerAction),
>            status);
> 
> @@ -2080,26 +2080,26 @@ FdoDispatch(
>          status = FdoDispatchPower(Fdo, Irp);
>          break;
> 
> -	case IRP_MJ_DEVICE_CONTROL:
> -		status = XenIFaceIoctl(Fdo, Irp);
> -		break;
> +    case IRP_MJ_DEVICE_CONTROL:
> +        status = XenIFaceIoctl(Fdo, Irp);
> +        break;
> 
> -	case IRP_MJ_SYSTEM_CONTROL:
> -		status = XenIfaceSystemControl(Fdo, Irp);
> -		break;
> +    case IRP_MJ_SYSTEM_CONTROL:
> +        status = XenIfaceSystemControl(Fdo, Irp);
> +        break;
> 
> -	case IRP_MJ_READ:
> -	case IRP_MJ_WRITE:
> -		status = FdoReadWrite(Fdo, Irp);
> -		break;
> +    case IRP_MJ_READ:
> +    case IRP_MJ_WRITE:
> +        status = FdoReadWrite(Fdo, Irp);
> +        break;
> 
> -	case IRP_MJ_CREATE:
> -		status = FdoCreateFile(Fdo, Irp);
> -		break;
> +    case IRP_MJ_CREATE:
> +        status = FdoCreateFile(Fdo, Irp);
> +        break;
> 
> -	case IRP_MJ_CLOSE:
> -		status = FdoClose(Fdo, Irp);
> -		break;
> +    case IRP_MJ_CLOSE:
> +        status = FdoClose(Fdo, Irp);
> +        break;
> 
>      default:
>          status = FdoDispatchDefault(Fdo, Irp);
> @@ -2149,7 +2149,7 @@ FdoQueryInterface(
>      StackLocation->Parameters.QueryInterface.Size = (USHORT)Size;
>      StackLocation->Parameters.QueryInterface.Version = (USHORT)Version;
>      StackLocation->Parameters.QueryInterface.Interface = Interface;
> -
> +
>      Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
> 
>      status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
> @@ -2227,7 +2227,7 @@ FdoCreate(
>      Dx->SystemPowerState = PowerSystemShutdown;
>      Dx->DevicePowerState = PowerDeviceD3;
> 
> -	FunctionDeviceObject->Flags |= DO_POWER_PAGABLE;
> +    FunctionDeviceObject->Flags |= DO_POWER_PAGABLE;
>      FunctionDeviceObject->Flags |= DO_BUFFERED_IO;
> 
>      Fdo = (PXENIFACE_FDO)__FdoAllocate(sizeof (XENIFACE_FDO));
> @@ -2258,12 +2258,12 @@ FdoCreate(
>          goto fail5;
> 
>  #pragma prefast(suppress:6014) // Possibly leaking Fdo->InterfaceName
> -	status = IoRegisterDeviceInterface(PhysicalDeviceObject,
> -
> 	(LPGUID)&GUID_INTERFACE_XENIFACE,
> -
> 	NULL,
> -
> 	&Fdo->InterfaceName);
> -	if (!NT_SUCCESS(status))
> -		goto fail6;
> +    status = IoRegisterDeviceInterface(PhysicalDeviceObject,
> +                                       (LPGUID)&GUID_INTERFACE_XENIFACE,
> +                                       NULL,
> +                                       &Fdo->InterfaceName);
> +    if (!NT_SUCCESS(status))
> +        goto fail6;
> 
>      status = __FdoSetName(Fdo, Name);
>      if (!NT_SUCCESS(status))
> @@ -2300,13 +2300,13 @@ FdoCreate(
>      InitializeListHead(&Dx->ListEntry);
>      Fdo->References = 1;
> 
> -	FdoInitialiseXSRegistryEntries(Fdo);
> +    FdoInitialiseXSRegistryEntries(Fdo);
> 
> -	KeInitializeEvent(&Fdo->registryWriteEvent, NotificationEvent,
> FALSE);
> +    KeInitializeEvent(&Fdo->registryWriteEvent, NotificationEvent, FALSE);
> 
> -	status = ThreadCreate(FdoRegistryThreadHandler, Fdo, &Fdo-
> >registryThread);
> -	if (!NT_SUCCESS(status))
> -		goto fail11;
> +    status = ThreadCreate(FdoRegistryThreadHandler, Fdo, &Fdo-
> >registryThread);
> +    if (!NT_SUCCESS(status))
> +        goto fail11;
> 
>      Info("%p (%s)\n",
>           FunctionDeviceObject,
> @@ -2317,15 +2317,15 @@ FdoCreate(
> 
>      return STATUS_SUCCESS;
> 
> -
> +
>  fail11:
> -	Error("fail11\n");
> +    Error("fail11\n");
> 
>      RtlZeroMemory(&Fdo->StoreInterface,
>                    sizeof (XENBUS_STORE_INTERFACE));
> 
>  fail10:
> -	Error("fail10\n");
> +    Error("fail10\n");
> 
>      RtlZeroMemory(&Fdo->SharedInfoInterface,
>                    sizeof (XENBUS_SHARED_INFO_INTERFACE));
> @@ -2341,8 +2341,8 @@ fail8:
> 
>  fail7:
>      Error("fail7\n");
> -	RtlFreeUnicodeString(&Fdo->InterfaceName);
> -	RtlZeroMemory(&Fdo->InterfaceName,sizeof(UNICODE_STRING));
> +    RtlFreeUnicodeString(&Fdo->InterfaceName);
> +    RtlZeroMemory(&Fdo->InterfaceName,sizeof(UNICODE_STRING));
> 
>  fail6:
>      Error("fail6\n");
> @@ -2353,14 +2353,14 @@ fail5:
>      ThreadAlert(Fdo->DevicePowerThread);
>      ThreadJoin(Fdo->DevicePowerThread);
>      Fdo->DevicePowerThread = NULL;
> -
> +
>  fail4:
>      Error("fail4\n");
> 
>      ThreadAlert(Fdo->SystemPowerThread);
>      ThreadJoin(Fdo->SystemPowerThread);
>      Fdo->SystemPowerThread = NULL;
> -
> +
>  fail3:
>      Error("fail3\n");
> 
> @@ -2410,7 +2410,7 @@ FdoDestroy(
> 
>      RtlZeroMemory(&Fdo->Mutex, sizeof (XENIFACE_MUTEX));
> 
> -	Fdo->InterfacesAcquired = FALSE;
> +    Fdo->InterfacesAcquired = FALSE;
> 
>      RtlZeroMemory(&Fdo->StoreInterface,
>                    sizeof (XENBUS_STORE_INTERFACE));
> @@ -2421,7 +2421,7 @@ FdoDestroy(
>      RtlZeroMemory(&Fdo->SuspendInterface,
>                    sizeof (XENBUS_SUSPEND_INTERFACE));
> 
> -	ThreadAlert(Fdo->registryThread);
> +    ThreadAlert(Fdo->registryThread);
>      ThreadJoin(Fdo->registryThread);
>      Fdo->registryThread = NULL;
> 
> @@ -2440,12 +2440,12 @@ FdoDestroy(
>      Fdo->PhysicalDeviceObject = NULL;
>      Fdo->Dx = NULL;
> 
> -	RtlZeroMemory(&Fdo->SessionLock, sizeof(FAST_MUTEX));
> -	RtlZeroMemory(&Fdo->SessionHead, sizeof(LIST_ENTRY));
> -	RtlZeroMemory(&Fdo->registryWriteEvent, sizeof(KEVENT));
> +    RtlZeroMemory(&Fdo->SessionLock, sizeof(FAST_MUTEX));
> +    RtlZeroMemory(&Fdo->SessionHead, sizeof(LIST_ENTRY));
> +    RtlZeroMemory(&Fdo->registryWriteEvent, sizeof(KEVENT));
> 
> -	RtlFreeUnicodeString(&Fdo->InterfaceName);
> -	RtlZeroMemory(&Fdo->InterfaceName,sizeof(UNICODE_STRING));
> +    RtlFreeUnicodeString(&Fdo->InterfaceName);
> +    RtlZeroMemory(&Fdo->InterfaceName,sizeof(UNICODE_STRING));
> 
>      ASSERT(IsZeroMemory(Fdo, sizeof (XENIFACE_FDO)));
>      __FdoFree(Fdo);
> diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
> index 4416064..c859338 100644
> --- a/src/xeniface/fdo.h
> +++ b/src/xeniface/fdo.h
> @@ -78,13 +78,13 @@ typedef struct _XENIFACE_FDO {
> 
>      XENBUS_SUSPEND_INTERFACE        SuspendInterface;
> 
> -	XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
> +    XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
> 
>      PXENBUS_SUSPEND_CALLBACK        SuspendCallbackLate;
> 
> -	BOOLEAN
> InterfacesAcquired;
> +    BOOLEAN						    InterfacesAcquired;
> 
> -	#define MAX_SESSIONS    (65536)
> +    #define MAX_SESSIONS    (65536)
> 
>      int							    WmiReady;
> 
> @@ -92,13 +92,13 @@ typedef struct _XENIFACE_FDO {
>      FAST_MUTEX					    SessionLock;
>      LIST_ENTRY					    SessionHead;
> 
> -	PXENIFACE_THREAD			    registryThread;
> -	KEVENT
> registryWriteEvent;
> +    PXENIFACE_THREAD			    registryThread;
> +    KEVENT						    registryWriteEvent;
> 
> 
> -	UNICODE_STRING
> SuggestedInstanceName;
> +    UNICODE_STRING				    SuggestedInstanceName;
> 
> -	UNICODE_STRING				    InterfaceName;
> +    UNICODE_STRING				    InterfaceName;
> 
>  } XENIFACE_FDO, *PXENIFACE_FDO;
> 
> diff --git a/src/xeniface/ioctls.c b/src/xeniface/ioctls.c
> index 3bef9ea..ead7f9b 100644
> --- a/src/xeniface/ioctls.c
> +++ b/src/xeniface/ioctls.c
> @@ -325,9 +325,9 @@ XenIFaceIoctl(
> 
>  done:
> 
> -	Irp->IoStatus.Status = status;
> +    Irp->IoStatus.Status = status;
> 
> -	IoCompleteRequest(Irp, IO_NO_INCREMENT);
> +    IoCompleteRequest(Irp, IO_NO_INCREMENT);
> 
>      return status;
>  }
> diff --git a/src/xeniface/log.h b/src/xeniface/log.h
> index 375a61f..5524f05 100644
> --- a/src/xeniface/log.h
> +++ b/src/xeniface/log.h
> @@ -142,11 +142,11 @@ __Info(
> 
> 
>  #define XenIfaceDebugPrint(LEVEL, ...) \
> -	__XenIfaceDebugPrint(__MODULE__ "|" __FUNCTION__ ": ",LEVEL,
> __VA_ARGS__)
> +    __XenIfaceDebugPrint(__MODULE__ "|" __FUNCTION__ ": ",LEVEL,
> __VA_ARGS__)
> 
>  static __inline VOID
>  __XenIfaceDebugPrint    (
> -	__in const CHAR *Prefix,
> +    __in const CHAR *Prefix,
>      __in ULONG   DebugPrintLevel,
>      __in PCCHAR  DebugMessage,
>      ...
> diff --git a/src/xeniface/thread.c b/src/xeniface/thread.c
> index 51967ed..f008834 100644
> --- a/src/xeniface/thread.c
> +++ b/src/xeniface/thread.c
> @@ -129,7 +129,7 @@ ThreadCreate(
> 
>      (*Thread) = __ThreadAllocate(sizeof (XENIFACE_THREAD));
> 
> -	Warning("Create thread %p %p\n", Function, Thread);
> +    Warning("Create thread %p %p\n", Function, Thread);
> 
>      status = STATUS_NO_MEMORY;
>      if (*Thread == NULL)
> diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
> index 1bdb834..82592e3 100644
> --- a/src/xeniface/wmi.c
> +++ b/src/xeniface/wmi.c
> @@ -1,31 +1,31 @@
>  /* Copyright (c) Citrix Systems Inc.
>   * All rights reserved.
>   *
> - * Redistribution and use in source and binary forms,
> - * with or without modification, are permitted provided
> + * 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
> + * *   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
> + * *   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
> + * 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.
>   */
> 
> @@ -47,7 +47,7 @@
>  #include <version.h>
> 
>  __drv_raisesIRQL(APC_LEVEL)
> -__drv_savesIRQLGlobal(OldIrql, fdoData->SessionLock)
> +__drv_savesIRQLGlobal(OldIrql, fdoData->SessionLock)
>  void LockSessions(
>          XENIFACE_FDO* fdoData)
>  {
> @@ -93,7 +93,7 @@ NTSTATUS GetAnsiString(ANSI_STRING *ansi, USHORT
> maxlength, LPWSTR location) {
> 
>  // Rather inconveniently, xenstore needs UTF8 data, WMI works in UTF16
>  // and windows doesn't provide conversion functions in any version
> -// prior to Windows 7.
> +// prior to Windows 7.
> 
>  USHORT Utf32FromUtf16(ULONG *utf32, const WCHAR* utf16) {
>      ULONG w;
> @@ -132,22 +132,22 @@ USHORT Utf32FromUtf8(ULONG *utf32, const
> CHAR *utf8) {
>      else if ((utf8[0] & 0xE0) == 0xC0) {
>          y = utf8[0] & 0x1F;
>          x = utf8[1] & 0x3F;
> -        *utf32 = (y<<6) | x;
> +        *utf32 = (y<<6) | x;
>          return 2;
>      }
>      else if ((utf8[0] & 0xF0) == 0xE0) {
>          z = utf8[0] & 0x0F;
>          y = utf8[1] & 0x3F;
>          x = utf8[2] & 0x3F;
> -       *utf32 = (z <<12) | (y<<6) | x;
> +       *utf32 = (z <<12) | (y<<6) | x;
>         return 3;
> -    }
> +    }
>      else {
>          ua = utf8[0] & 0x7;
>          ub = (utf8[1] & 0x30) >> 4;
>          u = (ua << 2) | ub;
>          z = utf8[1] & 0x0f;
> -        y = utf8[2] & 0x3f;
> +        y = utf8[2] & 0x3f;
>          x = utf8[3] & 0x3f;
>          *utf32 = (u<<16) | (z <<12) | (y <<6) | x;
>          return 4;
> @@ -277,7 +277,7 @@ NTSTATUS GetUTF8String(UTF8_STRING** utf8,
> USHORT bufsize, LPWSTR ustring)
> 
>      (*utf8)->Length = bytecount;
>      (*utf8)->Buffer[bytecount]=0;
> -
> +
>      bytecount = 0;
>      i=0;
>      while (i < bufsize/sizeof(WCHAR)) {
> @@ -305,7 +305,7 @@ void GetCountedUnicodeString(UNICODE_STRING
> *unicode, UCHAR *location)
>      USHORT bufsize = *(USHORT*)location;
>      LPWSTR ustring = (LPWSTR)(location+sizeof(USHORT));
>      GetUnicodeString(unicode, bufsize, ustring);
> -}
> +}
> 
>  NTSTATUS GetCountedAnsiString(ANSI_STRING *ansi, UCHAR *location)
>  {
> @@ -332,7 +332,7 @@ typedef enum {
>      WMI_STRINGOFFSET
>  } WMI_TYPE;
> 
> -int AccessWmiBuffer(PUCHAR Buffer, int readbuffer, ULONG *
> RequiredSize,
> +int AccessWmiBuffer(PUCHAR Buffer, int readbuffer, ULONG *
> RequiredSize,
>                      size_t BufferSize, ...) {
>      va_list vl;
>      ULONG_PTR offset;
> @@ -405,7 +405,7 @@ int AccessWmiBuffer(PUCHAR Buffer, int readbuffer,
> ULONG * RequiredSize,
>                          UCHAR *bufferpos = Buffer + inpos;
>                          ULONG insize = va_arg(vl, ULONG);
>                          UCHAR **writebuf = va_arg(vl, UCHAR**);
> -                        *writebuf = NULL;
> +                        *writebuf = NULL;
>                          if (bufferpos+ insize > endbuffer) {;
>                              overflow = TRUE;
>                          }
> @@ -460,12 +460,12 @@ int AccessWmiBuffer(PUCHAR Buffer, int
> readbuffer, ULONG * RequiredSize,
>                          LPWSTR *val;
>                          offset = (2-((ULONG_PTR)position%2))%2;
>                          position += offset;
> -                        if (position + sizeof(WCHAR)*25 > endbuffer)
> +                        if (position + sizeof(WCHAR)*25 > endbuffer)
>                              overflow = TRUE;
> -                        val = va_arg(vl, LPWSTR*);
> -                        *val = NULL;
> -                        if (!overflow)
> -                            *val = (LPWSTR )position;
> +                        val = va_arg(vl, LPWSTR*);
> +                        *val = NULL;
> +                        if (!overflow)
> +                            *val = (LPWSTR )position;
>                          position += sizeof(WCHAR)*25;
>                      }
>                      break;
> @@ -477,7 +477,7 @@ int AccessWmiBuffer(PUCHAR Buffer, int readbuffer,
> ULONG * RequiredSize,
>              break;
>          }
>      }
> -    *RequiredSize = (ULONG)(position - Buffer);
> +    *RequiredSize = (ULONG)(position - Buffer);
>      va_end(vl);
>      if (overflow)
>          return FALSE;
> @@ -485,9 +485,9 @@ int AccessWmiBuffer(PUCHAR Buffer, int readbuffer,
> ULONG * RequiredSize,
>  }
> 
> 
> -NTSTATUS
> +NTSTATUS
>  WriteCountedUnicodeString(
> -    const UNICODE_STRING *ustr,
> +    const UNICODE_STRING *ustr,
>      UCHAR *location
>      )
>  {
> @@ -516,7 +516,7 @@ WriteCountedUTF8String(const char * string, UCHAR
> *location) {
>      }
>      buffer[bytesize/sizeof(WCHAR)] = 0;
> 
> -    i=0;
> +    i=0;
>      b=0;
>      while (string[i] != 0) {
>          i += Utf32FromUtf8(&utf32, &string[i]);
> @@ -533,7 +533,7 @@ NTSTATUS
>  WriteCountedString(
>      const char * string,
>      UCHAR * location
> -    )
> +    )
>  {
>      ANSI_STRING ansi;
>      UNICODE_STRING unicode;
> @@ -542,7 +542,7 @@ WriteCountedString(
>      RtlInitAnsiString(&ansi, string);
> 
>      status = RtlAnsiStringToUnicodeString(&unicode, &ansi, TRUE);
> -    if (NT_SUCCESS(status)) {
> +    if (NT_SUCCESS(status)) {
> 
>          status = WriteCountedUnicodeString(&unicode, location);
>          RtlFreeUnicodeString(&unicode);
> @@ -583,7 +583,7 @@ CloneUnicodeString(UNICODE_STRING *dest,
> UNICODE_STRING *src) {
>      return status;
>  }
> 
> -NTSTATUS
> +NTSTATUS
>  StringToUnicode(UNICODE_STRING *ustr, const char * str) {
>      ANSI_STRING ansi;
>      RtlInitAnsiString(&ansi, str);
> @@ -632,7 +632,7 @@ GetInstanceName(UNICODE_STRING *dest,
> XENIFACE_FDO* FdoData, const char *string)
>          return status;
>      }
>      destsz = FdoData->SuggestedInstanceName.Length +
> -                sizeof(WCHAR) +
> +                sizeof(WCHAR) +
>                  unicode.Length;
> 
>      AllocUnicodeStringBuffer(dest, (USHORT)destsz);
> @@ -640,8 +640,8 @@ GetInstanceName(UNICODE_STRING *dest,
> XENIFACE_FDO* FdoData, const char *string)
>          RtlFreeUnicodeString(&unicode);
>          return STATUS_INSUFFICIENT_RESOURCES;
>      }
> -    status = RtlUnicodeStringPrintf(dest, L"%s\\%s",
> -                FdoData->SuggestedInstanceName.Buffer,
> +    status = RtlUnicodeStringPrintf(dest, L"%s\\%s",
> +                FdoData->SuggestedInstanceName.Buffer,
>                  unicode.Buffer);
>      if (!NT_SUCCESS(status)) {
>          RtlFreeUnicodeString(&unicode);
> @@ -701,14 +701,14 @@ void UnicodeShallowCopy(UNICODE_STRING
> *dest, UNICODE_STRING *src) {
>      dest->Buffer = src->Buffer;
>      dest->Length = src->Length;
>      dest->MaximumLength = src->MaximumLength;
> -}
> +}
> 
> 
>  XenStoreSession*
> -FindSessionLocked(XENIFACE_FDO *fdoData,
> +FindSessionLocked(XENIFACE_FDO *fdoData,
>                                  LONG id) {
>      XenStoreSession *session;
> -
> +
>      session = (XenStoreSession *)fdoData->SessionHead.Flink;
>      while (session != (XenStoreSession *)&fdoData->SessionHead){
>          if (session->id == id) {
> @@ -735,7 +735,7 @@ XenStoreWatch *
>  SessionFindWatchLocked(XenStoreSession *session,
>                          UNICODE_STRING *path) {
>      XenStoreWatch * watch;
> -
> +
>      XenIfaceDebugPrint(TRACE,"Wait for session watch lock\n");
>      ExAcquireFastMutex(&session->WatchMapLock);
>      XenIfaceDebugPrint(TRACE,"got session watch lock\n");
> @@ -751,11 +751,11 @@ SessionFindWatchLocked(XenStoreSession
> *session,
>      XenIfaceDebugPrint(WARNING,"couldn't find watch\n");
>      return NULL;
> 
> -}
> +}
> 
>  void FireSuspendEvent(PXENIFACE_FDO fdoData) {
> -	XenIfaceDebugPrint(ERROR,"Ready to unsuspend Event\n");
> -	KeSetEvent(&fdoData->registryWriteEvent, IO_NO_INCREMENT,
> FALSE);
> +    XenIfaceDebugPrint(ERROR,"Ready to unsuspend Event\n");
> +    KeSetEvent(&fdoData->registryWriteEvent, IO_NO_INCREMENT, FALSE);
>      if (fdoData->WmiReady) {
>          XenIfaceDebugPrint(TRACE,"Fire Suspend Event\n");
>          WmiFireEvent(fdoData->Dx->DeviceObject,
> @@ -764,7 +764,7 @@ void FireSuspendEvent(PXENIFACE_FDO fdoData) {
>                       0,
>                       NULL);
>      }
> -}
> +}
>  void FireWatch(XenStoreWatch* watch) {
>      UCHAR * eventdata;
>      ULONG RequiredSize;
> @@ -774,7 +774,7 @@ void FireWatch(XenStoreWatch* watch) {
>              WMI_STRING, GetCountedUnicodeStringSize(&watch->path),
>                  &sesbuf,
>              WMI_DONE);
> -
> +
>      eventdata = ExAllocatePoolWithTag(NonPagedPool, RequiredSize,'XIEV');
>      if (eventdata!=NULL) {
>          AccessWmiBuffer(eventdata, FALSE, &RequiredSize, RequiredSize,
> @@ -782,17 +782,17 @@ void FireWatch(XenStoreWatch* watch) {
>                  &sesbuf,
>              WMI_DONE);
> 
> -        WriteCountedUnicodeString(&watch->path, sesbuf);
> +        WriteCountedUnicodeString(&watch->path, sesbuf);
>      }
> 
>      if (eventdata !=NULL) {
>          XenIfaceDebugPrint(TRACE,"Fire Watch Event\n");
> -        WmiFireEvent(watch->fdoData->Dx->DeviceObject,
> +        WmiFireEvent(watch->fdoData->Dx->DeviceObject,
>                       (LPGUID)&OBJECT_GUID(XenStoreWatchEvent),
>                       0,
> -                     RequiredSize,
> +                     RequiredSize,
>                       eventdata);
> -    }
> +    }
>  }
> 
> 
> @@ -800,7 +800,7 @@ KSTART_ROUTINE WatchCallbackThread;
>  NTSTATUS
>  StartWatch(XENIFACE_FDO *fdoData, XenStoreWatch *watch)
>  {
> -    char *tmppath;
> +    char *tmppath;
>      ANSI_STRING ansipath;
>      NTSTATUS status;
>      status = RtlUnicodeStringToAnsiString(&ansipath, &watch->path, TRUE);
> @@ -814,7 +814,7 @@ StartWatch(XENIFACE_FDO *fdoData,
> XenStoreWatch *watch)
>      }
>      RtlZeroMemory(tmppath, ansipath.Length+1);
>      RtlCopyBytes(tmppath,ansipath.Buffer, ansipath.Length);
> -
> +
>      status = XENBUS_STORE(WatchAdd, &fdoData->StoreInterface, NULL,
> tmppath, &watch->watchevent, &watch->watchhandle );
>      if (!NT_SUCCESS(status)) {
>          ExFreePool(tmppath);
> @@ -848,7 +848,7 @@ VOID WatchCallbackThread(__in PVOID StartContext)
> {
>                  watch = (XenStoreWatch *)watch->listentry.Flink;
>              }
>              session->mapchanged = FALSE;
> -            session->watchevents[i] = &session->SessionChangedEvent;
> +            session->watchevents[i] = &session->SessionChangedEvent;
>          }
>          ExReleaseFastMutex(&session->WatchMapLock);
>          XenIfaceDebugPrint(TRACE,"Wait for new event\n");
> @@ -875,7 +875,7 @@ VOID WatchCallbackThread(__in PVOID StartContext)
> {
>                      if (watch->suspendcount !=XENBUS_SUSPEND(GetCount,
> &watch->fdoData->SuspendInterface)) {
>                          watch->suspendcount = XENBUS_SUSPEND(GetCount, &watch-
> >fdoData->SuspendInterface);
> 
> XenIfaceDebugPrint(WARNING,"SessionSuspendResumeUnwatch %p\n",
> watch->watchhandle);
> -
> +
>                          XENBUS_STORE(WatchRemove, &watch->fdoData-
> >StoreInterface, watch->watchhandle);
>                          StartWatch(watch->fdoData, watch);
>                      }
> @@ -886,13 +886,13 @@ VOID WatchCallbackThread(__in PVOID
> StartContext) {
>          }
>          else if ( status == STATUS_WAIT_0 + i) {
>              ExAcquireFastMutex(&session->WatchMapLock);
> -            KeClearEvent(&session->SessionChangedEvent);
> +            KeClearEvent(&session->SessionChangedEvent);
>              if (session->closing==TRUE) {
>                  XenIfaceDebugPrint(TRACE,"Trying to end session thread\n");
>                  if (session->watchcount != 0) {
>                      XenStoreWatch *watch;
> -                    for (watch = (XenStoreWatch *)session->watches.Flink;
> -                        watch!=(XenStoreWatch *)&session->watches;
> +                    for (watch = (XenStoreWatch *)session->watches.Flink;
> +                        watch!=(XenStoreWatch *)&session->watches;
>                          watch=(XenStoreWatch *)session->watches.Flink) {
>                              FreeUnicodeStringBuffer(&watch->path);
>                              RemoveEntryList((LIST_ENTRY*)watch);
> @@ -907,7 +907,7 @@ VOID WatchCallbackThread(__in PVOID StartContext)
> {
>                  //ExReleaseFastMutex(&session->WatchMapLock);
>              }
>              else {
> -
> +
>                  ExReleaseFastMutex(&session->WatchMapLock);
>              }
>          }
> @@ -916,12 +916,12 @@ VOID WatchCallbackThread(__in PVOID
> StartContext) {
>  }
> 
>  NTSTATUS
> -SessionAddWatchLocked(XenStoreSession *session,
> -                        XENIFACE_FDO* fdoData,
> +SessionAddWatchLocked(XenStoreSession *session,
> +                        XENIFACE_FDO* fdoData,
>                          UNICODE_STRING *path,
>                          XenStoreWatch **watch) {
> 
> -
> +
>      NTSTATUS status;
>      XenStoreWatch *pwatch;
> 
> @@ -934,18 +934,18 @@ SessionAddWatchLocked(XenStoreSession
> *session,
>          return STATUS_INSUFFICIENT_RESOURCES;
>      }
> 
> -    (*watch)->finished = FALSE;
> +    (*watch)->finished = FALSE;
>      (*watch)->fdoData = fdoData;
>      UnicodeShallowCopy(&(*watch)->path, path);
> 
> 
> -
> +
>      (*watch)->suspendcount = XENBUS_SUSPEND(GetCount, &fdoData-
> >SuspendInterface);
> -
> +
> 
>      KeInitializeEvent(&(*watch)->watchevent, NotificationEvent, FALSE);
> 
> -
> +
>      status = StartWatch(fdoData, *watch);
>      if ((!NT_SUCCESS(status)) || ((*watch)->watchhandle == NULL)) {
>          ExFreePool(*watch);
> @@ -1001,8 +1001,8 @@ void
> SessionRemoveWatchesLocked(XenStoreSession *session) {
> 
>      XenIfaceDebugPrint(TRACE, "wait remove mutex\n");
>      ExAcquireFastMutex(&session->WatchMapLock);
> -    for (watch = (XenStoreWatch *)session->watches.Flink;
> -         watch!=(XenStoreWatch *)&session->watches;
> +    for (watch = (XenStoreWatch *)session->watches.Flink;
> +         watch!=(XenStoreWatch *)&session->watches;
>           watch=(XenStoreWatch *)watch->listentry.Flink) {
> 
>          XenIfaceDebugPrint(TRACE, "try remove %p\n",session->watches.Flink
> );
> @@ -1017,7 +1017,7 @@ XenStoreSession*
>  FindSessionByInstanceLocked(XENIFACE_FDO *fdoData,
>                              UNICODE_STRING *instance) {
>      XenStoreSession *session;
> -
> +
>      session = (XenStoreSession *)fdoData->SessionHead.Flink;
>      while (session != (XenStoreSession *)&fdoData->SessionHead) {
>          if (CompareUnicodeStrings(instance, &session->instancename)==0) {
> @@ -1059,7 +1059,7 @@ PSTR Xmasprintf(const char *fmt, ...) {
>          out =  ExAllocatePoolWithTag(NonPagedPool, basesize, 'XenP');
>          if (out == NULL)
>              return NULL;
> -
> +
>          status = RtlStringCbVPrintfExA(out, basesize, NULL, &unused,0, fmt,
> argv);
> 
>          ExFreePool(out);
> @@ -1075,9 +1075,9 @@ PSTR Xmasprintf(const char *fmt, ...) {
>      return out;
>  }
> 
> -NTSTATUS
> -CreateNewSession(XENIFACE_FDO *fdoData,
> -                    UNICODE_STRING *stringid,
> +NTSTATUS
> +CreateNewSession(XENIFACE_FDO *fdoData,
> +                    UNICODE_STRING *stringid,
>                      ULONG *sessionid) {
>      XenStoreSession *session;
>      PSTR iname;
> @@ -1093,7 +1093,7 @@ CreateNewSession(XENIFACE_FDO *fdoData,
>      if (session == NULL)
>          return STATUS_INSUFFICIENT_RESOURCES;
>      RtlZeroMemory(session, sizeof(XenStoreSession));
> -
> +
>      ExInitializeFastMutex(&session->WatchMapLock);
>      session->mapchanged = TRUE;
>      status = RtlUnicodeStringToAnsiString(&ansi, stringid, TRUE);
> @@ -1109,7 +1109,7 @@ CreateNewSession(XENIFACE_FDO *fdoData,
>          status = STATUS_NO_MEMORY;
>          if (iname == NULL) {
>              UnlockSessions(fdoData);
> -            RtlFreeAnsiString(&ansi);
> +            RtlFreeAnsiString(&ansi);
>              ExFreePool(session);
>              return status;
>          }
> @@ -1118,18 +1118,18 @@ CreateNewSession(XENIFACE_FDO *fdoData,
>          ExFreePool(iname);
>          if (!NT_SUCCESS(status)) {
>              UnlockSessions(fdoData);
> -            RtlFreeAnsiString(&ansi);
> +            RtlFreeAnsiString(&ansi);
>              ExFreePool(session);
>              return status;
>          }
>          count++;
> -
> +
>      } while (FindSessionByInstanceLocked(fdoData, &session->instancename)
> != NULL);
> 
> -
> -
> -
> -
> +
> +
> +
> +
>      if (fdoData->SessionHead.Flink==&fdoData->SessionHead) {
>          session->id=0;
>      }
> @@ -1142,12 +1142,12 @@ CreateNewSession(XENIFACE_FDO *fdoData,
>      InsertHeadList((PLIST_ENTRY)&fdoData->SessionHead,
> (PLIST_ENTRY)session);
>      *sessionid = session->id;
>      UnicodeShallowCopy(&session->stringid, stringid);
> -
> +
>      InitializeListHead((PLIST_ENTRY)&session->watches);
> -
> +
>      KeInitializeEvent(&session->SessionChangedEvent, NotificationEvent,
> FALSE);
>      session->closing = FALSE;
> -    if (fdoData->InterfacesAcquired){
> +    if (fdoData->InterfacesAcquired){
>          XenIfaceDebugPrint(TRACE,"Add session unsuspended\n");
>          session->suspended=FALSE;
>      }
> @@ -1161,7 +1161,7 @@ CreateNewSession(XENIFACE_FDO *fdoData,
> 
>      status = PsCreateSystemThread(&hthread, THREAD_ALL_ACCESS, &oa,
> NULL, NULL, WatchCallbackThread, session);
>      if (!NT_SUCCESS(status)) {
> -            RtlFreeAnsiString(&ansi);
> +            RtlFreeAnsiString(&ansi);
>              ExFreePool(session);
>              return status;
>      }
> @@ -1170,17 +1170,17 @@ CreateNewSession(XENIFACE_FDO *fdoData,
>      return STATUS_SUCCESS;
>  }
> 
> -void
> -RemoveSessionLocked(XENIFACE_FDO *fdoData,
> +void
> +RemoveSessionLocked(XENIFACE_FDO *fdoData,
>                      XenStoreSession *session) {
> -
> +
>      XenIfaceDebugPrint(TRACE,"RemoveSessionLocked\n");
>      RemoveEntryList((LIST_ENTRY*)session);
>      fdoData->Sessions--;
>      SessionRemoveWatchesLocked(session);
>      if (session->transaction != NULL) {
> -        XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface, session-
> >transaction, FALSE);
> -    }
> +        XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface, session-
> >transaction, FALSE);
> +    }
>      session->closing = TRUE;
>      KeSetEvent(&session->SessionChangedEvent, IO_NO_INCREMENT,
> FALSE);
>      KeWaitForSingleObject(session->WatchThread, Executive, KernelMode,
> FALSE, NULL);
> @@ -1191,7 +1191,7 @@ RemoveSessionLocked(XENIFACE_FDO *fdoData,
>  }
> 
>  void
> -RemoveSession(XENIFACE_FDO *fdoData,
> +RemoveSession(XENIFACE_FDO *fdoData,
>                      XenStoreSession *session) {
>      XenIfaceDebugPrint(TRACE,"RemoveSession\n");
>      LockSessions(fdoData);
> @@ -1200,15 +1200,15 @@ RemoveSession(XENIFACE_FDO *fdoData,
>  }
> 
>  void SessionsRemoveAll(XENIFACE_FDO *fdoData) {
> -	XenIfaceDebugPrint(TRACE,"lock");
> +    XenIfaceDebugPrint(TRACE,"lock");
>      LockSessions(fdoData);
> -	XenIfaceDebugPrint(TRACE,"in lock");
> +    XenIfaceDebugPrint(TRACE,"in lock");
>      while (fdoData->SessionHead.Flink != &fdoData->SessionHead) {
>          RemoveSessionLocked(fdoData, (XenStoreSession *)fdoData-
> >SessionHead.Flink);
>      }
> -	XenIfaceDebugPrint(TRACE,"unlock");
> +    XenIfaceDebugPrint(TRACE,"unlock");
>      UnlockSessions(fdoData);
> -	XenIfaceDebugPrint(TRACE,"unlocked");
> +    XenIfaceDebugPrint(TRACE,"unlocked");
>  }
> 
> 
> @@ -1237,15 +1237,15 @@ void
> SessionUnwatchWatchesLocked(XenStoreSession *session)
>      ExReleaseFastMutex(&session->WatchMapLock);
>  }
> 
> -void SuspendSessionLocked(XENIFACE_FDO *fdoData,
> +void SuspendSessionLocked(XENIFACE_FDO *fdoData,
>                           XenStoreSession *session) {
>      SessionUnwatchWatchesLocked(session);
>      if (session->transaction != NULL) {
>          XenIfaceDebugPrint(TRACE, "End transaction %p\n",session-
> >transaction);
> -
> -        XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface, session-
> >transaction, FALSE);
> +
> +        XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface, session-
> >transaction, FALSE);
>          session->transaction = NULL;
> -    }
> +    }
>  }
> 
> 
> @@ -1288,7 +1288,7 @@ void
> SessionRenewWatchesLocked(XenStoreSession *session) {
>      ExReleaseFastMutex(&session->WatchMapLock);
>  }
> 
> -void ResumeSessionLocked(XENIFACE_FDO *fdoData,
> +void ResumeSessionLocked(XENIFACE_FDO *fdoData,
>                           XenStoreSession *session) {
>      SessionRenewWatchesLocked(session);
>  }
> @@ -1310,40 +1310,40 @@ void SessionsResumeAll(XENIFACE_FDO
> *fdoData) {
>  NTSTATUS
>  WmiInit(
>          PXENIFACE_FDO FdoData
> -    )
> +    )
>  {
>      NTSTATUS status = STATUS_SUCCESS;
>      XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__);
>      XenIfaceDebugPrint(INFO,"DRV: XenIface WMI Initialisation\n");
> -
> -
> 
> 
> -	IoWMISuggestInstanceName(FdoData->PhysicalDeviceObject, NULL,
> FALSE,
> -                                &FdoData->SuggestedInstanceName);
> +
> +
> +    IoWMISuggestInstanceName(FdoData->PhysicalDeviceObject, NULL,
> FALSE,
> +                             &FdoData->SuggestedInstanceName);
>      InitializeListHead(&FdoData->SessionHead);
>      FdoData->Sessions = 0;
>      ExInitializeFastMutex(&FdoData->SessionLock);
> -
> +
>      status = IoWMIRegistrationControl(FdoData->Dx->DeviceObject,
> WMIREG_ACTION_REGISTER);
>      FdoData->WmiReady = 1;
>      return status;
>  }
> 
>  NTSTATUS
> -WmiFinalise(
> +WmiFinalise(
>      PXENIFACE_FDO FdoData
> -    )
> +    )
>  {
>      NTSTATUS status = STATUS_SUCCESS;
> -    if (FdoData->WmiReady) {
> +    if (FdoData->WmiReady) {
>          XenIfaceDebugPrint(INFO,"DRV: XenIface WMI Finalisation\n");
>          XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__);
>          SessionsRemoveAll(FdoData);
> 
>          status =IoWMIRegistrationControl(FdoData->Dx->DeviceObject,
> WMIREG_ACTION_DEREGISTER);
> -		RtlFreeUnicodeString(&FdoData->SuggestedInstanceName);
> -		RtlZeroBytes(&FdoData->SuggestedInstanceName,
> sizeof(UNICODE_STRING));
> +        RtlFreeUnicodeString(&FdoData->SuggestedInstanceName);
> +        RtlZeroBytes(&FdoData->SuggestedInstanceName,
> sizeof(UNICODE_STRING));
> 
>          FdoData->WmiReady = 0;
>      }
> @@ -1468,7 +1468,7 @@ SessionExecuteRemoveValue(UCHAR *InBuffer,
>      }
> 
>      status = GetCountedUTF8String(&pathname, upathname);
> -    if (!NT_SUCCESS(status))
> +    if (!NT_SUCCESS(status))
>          return status;
> 
>      status = STATUS_INSUFFICIENT_RESOURCES;
> @@ -1478,7 +1478,7 @@ SessionExecuteRemoveValue(UCHAR *InBuffer,
>      }
>      RtlZeroMemory(tmpbuffer, pathname->Length+1);
>      RtlCopyBytes(tmpbuffer,pathname->Buffer, pathname->Length);
> -
> +
>      status = STATUS_WMI_INSTANCE_NOT_FOUND;
>      if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
>              NULL){
> @@ -1524,7 +1524,7 @@ SessionExecuteRemoveWatch(UCHAR *InBuffer,
>      }
> 
> 
> -    XenIfaceDebugPrint(TRACE, "Find Watch\n");
> +    XenIfaceDebugPrint(TRACE, "Find Watch\n");
> 
>      watch = SessionFindWatchLocked(session, &unicpath_notbacked);
> 
> @@ -1533,7 +1533,7 @@ SessionExecuteRemoveWatch(UCHAR *InBuffer,
>          SessionRemoveWatchLocked(session, watch);
>      }
>      else {
> -        XenIfaceDebugPrint(WARNING, "No Watch\n");
> +        XenIfaceDebugPrint(WARNING, "No Watch\n");
>      }
>  #pragma prefast (suppress:26110)
>      ExReleaseFastMutex(&session->WatchMapLock);
> @@ -1541,7 +1541,7 @@ SessionExecuteRemoveWatch(UCHAR *InBuffer,
> 
>      *byteswritten=0;
> 
> -
> +
> 
>      return STATUS_SUCCESS;
> 
> @@ -1586,11 +1586,11 @@ SessionExecuteSetWatch(UCHAR *InBuffer,
>          FreeUnicodeStringBuffer(&unicpath_backed);
>          return status;
>      }
> -
> +
> 
>      *byteswritten=0;
> 
> -
> +
> 
>      return STATUS_SUCCESS;
> 
> @@ -1604,7 +1604,7 @@ SessionExecuteEndSession(UCHAR *InBuffer,
>                              UNICODE_STRING *instance,
>                              OUT ULONG_PTR *byteswritten) {
>      XenStoreSession *session;
> -    XenIfaceDebugPrint(TRACE, "ExecuteEndSession\n");
> +    XenIfaceDebugPrint(TRACE, "ExecuteEndSession\n");
>      *byteswritten = 0;
>      if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
>              NULL){
> @@ -1633,7 +1633,7 @@ SessionExecuteSetValue(UCHAR *InBuffer,
>      char *tmppath;
>      char* tmpvalue;
> 
> -    XenIfaceDebugPrint(TRACE, " Try to write\n");
> +    XenIfaceDebugPrint(TRACE, " Try to write\n");
>      if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
>                              WMI_STRING, &upathname,
>                              WMI_STRING, &uvalue,
> @@ -1643,10 +1643,10 @@ SessionExecuteSetValue(UCHAR *InBuffer,
>          return STATUS_INSUFFICIENT_RESOURCES;
>      }
>      status = GetCountedUTF8String(&pathname, upathname);
> -    if (!NT_SUCCESS(status))
> +    if (!NT_SUCCESS(status))
>          return status;
> 
> -	status = STATUS_INSUFFICIENT_RESOURCES;
> +    status = STATUS_INSUFFICIENT_RESOURCES;
>      tmppath = ExAllocatePoolWithTag(NonPagedPool, pathname->Length+1,
> 'XenP');
>      if (!tmppath) {
>          goto fail1;
> @@ -1654,7 +1654,7 @@ SessionExecuteSetValue(UCHAR *InBuffer,
>      RtlZeroMemory(tmppath, pathname->Length+1);
>      RtlCopyBytes(tmppath,pathname->Buffer, pathname->Length);
>      status = GetCountedUTF8String(&value, uvalue);
> -    if (!NT_SUCCESS(status)){
> +    if (!NT_SUCCESS(status)){
>          goto fail2;
>      }
>      status = STATUS_INSUFFICIENT_RESOURCES;
> @@ -1664,14 +1664,14 @@ SessionExecuteSetValue(UCHAR *InBuffer,
>      }
>      RtlZeroMemory(tmpvalue, value->Length+1);
>      RtlCopyBytes(tmpvalue,value->Buffer, value->Length);
> -
> +
>      status = STATUS_WMI_INSTANCE_NOT_FOUND;
>      if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
>              NULL){
>          goto fail4;
>      }
>      status = XENBUS_STORE(Printf, &fdoData->StoreInterface, session-
> >transaction, NULL, tmppath, tmpvalue);
> -    XenIfaceDebugPrint(TRACE, " Write %s to %s (%p)\n", tmpvalue,
> tmppath, status);
> +    XenIfaceDebugPrint(TRACE, " Write %s to %s (%p)\n", tmpvalue,
> tmppath, status);
>      UnlockSessions(fdoData);
> 
>  fail4:
> @@ -1685,10 +1685,10 @@ fail2:
> 
>  fail1:
>      FreeUTF8String(pathname);
> -
> +
>      *byteswritten = 0;
>      return status;
> -
> +
>  }
>  NTSTATUS
>  SessionExecuteGetFirstChild(UCHAR *InBuffer,
> @@ -1708,16 +1708,16 @@ SessionExecuteGetFirstChild(UCHAR *InBuffer,
>      XenStoreSession *session;
>      char *tmppath;
>      if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
> -                            WMI_STRING, &uloc,
> +                            WMI_STRING, &uloc,
>                              WMI_DONE)){
>          return  STATUS_INVALID_DEVICE_REQUEST;
>      }
>      if (!fdoData->InterfacesAcquired) {
>          return STATUS_INSUFFICIENT_RESOURCES;
>      }
> -
> +
>      status = GetCountedUTF8String(&path, uloc);
> -
> +
>      if (!NT_SUCCESS(status)) {
>          return status;
>      }
> @@ -1737,7 +1737,7 @@ SessionExecuteGetFirstChild(UCHAR *InBuffer,
>      }
>      status = XENBUS_STORE(Directory,&fdoData->StoreInterface, session-
> >transaction, NULL, tmppath, &listresults);
>      UnlockSessions(fdoData);
> -
> +
>      if (!NT_SUCCESS(status)) {
>          goto fail2;
>      }
> @@ -1755,14 +1755,14 @@ SessionExecuteGetFirstChild(UCHAR *InBuffer,
>      else {
>          stringarraysize+=GetCountedUtf8Size("");
>      }
> -
> +
>      status = STATUS_BUFFER_TOO_SMALL;
>      if (!AccessWmiBuffer(InBuffer, FALSE, &RequiredSize, OutBufferSize,
>                              WMI_STRING, stringarraysize, &valuepos,
>                              WMI_DONE)){
>          goto fail3;
>      }
> -
> +
>      status = STATUS_SUCCESS;
>      if ((listresults != NULL) && (listresults[0] != 0)) {
>          PSTR fullpath;
> @@ -1770,8 +1770,8 @@ SessionExecuteGetFirstChild(UCHAR *InBuffer,
>              fullpath = Xmasprintf("/%s", listresults);
>          }
>          else {
> -            fullpath = Xmasprintf("%s/%s",
> -                                    path->Buffer, listresults);
> +            fullpath = Xmasprintf("%s/%s",
> +                                    path->Buffer, listresults);
>          }
> 
>          if (fullpath == NULL) {
> @@ -1826,16 +1826,16 @@ SessionExecuteGetNextSibling(UCHAR
> *InBuffer,
>      int leafoffset;
>      char *attemptstring;
>      if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
> -                            WMI_STRING, &uloc,
> +                            WMI_STRING, &uloc,
>                              WMI_DONE)){
>          return  STATUS_INVALID_DEVICE_REQUEST;
>      }
>      if (!fdoData->InterfacesAcquired) {
>          return STATUS_INSUFFICIENT_RESOURCES;
>      }
> -
> +
>      status = GetCountedUTF8String(&path, uloc);
> -
> +
>      if (!NT_SUCCESS(status)) {
>          return status;
>      }
> @@ -1858,7 +1858,7 @@ SessionExecuteGetNextSibling(UCHAR *InBuffer,
>              NULL){
>          goto fail3;
>      }
> -
> +
>      leafoffset = 0;
>      if (path->Length>1) {
>          leafoffset = path->Length;
> @@ -1884,14 +1884,14 @@ SessionExecuteGetNextSibling(UCHAR
> *InBuffer,
> 
>      status = XENBUS_STORE(Directory,&fdoData->StoreInterface, session-
> >transaction, NULL, tmppath, &listresults);
>      UnlockSessions(fdoData);
> -
> +
>      if (!NT_SUCCESS(status)) {
>          goto fail3;
>      }
> 
>      stringarraysize = 0;
>      RtlInitAnsiString(&checkleaf, tmpleaf);
> -
> +
>      nextresult = listresults;
> 
>      while (*nextresult != 0) {
> @@ -1928,14 +1928,14 @@ SessionExecuteGetNextSibling(UCHAR
> *InBuffer,
>      else {
>          stringarraysize+=GetCountedUtf8Size("");
>      }
> -
> +
>      status = STATUS_BUFFER_TOO_SMALL;
>      if (!AccessWmiBuffer(InBuffer, FALSE, &RequiredSize, OutBufferSize,
>                              WMI_STRING, stringarraysize, &valuepos,
>                              WMI_DONE)){
>          goto fail4;
>      }
> -
> +
>      status = STATUS_SUCCESS;
>      if (attemptstring != NULL) {
>          PSTR fullpath;
> @@ -1943,8 +1943,8 @@ SessionExecuteGetNextSibling(UCHAR *InBuffer,
>              fullpath = Xmasprintf("/%s", attemptstring);
>          }
>          else {
> -            fullpath = Xmasprintf("%s/%s",
> -                                    tmppath, attemptstring);
> +            fullpath = Xmasprintf("%s/%s",
> +                                    tmppath, attemptstring);
>          }
> 
>          if (fullpath == NULL) {
> @@ -1969,7 +1969,7 @@ fail3:
>      ExFreePool(tmpleaf);
> 
>  fail2:
> -	ExFreePool(tmppath);
> +    ExFreePool(tmppath);
> 
>  fail1:
>      FreeUTF8String(path);
> @@ -1999,16 +1999,16 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
>      XenStoreSession *session;
>      char *tmppath;
>      if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
> -                            WMI_STRING, &uloc,
> +                            WMI_STRING, &uloc,
>                              WMI_DONE)){
>          return  STATUS_INVALID_DEVICE_REQUEST;
>      }
>      if (!fdoData->InterfacesAcquired) {
>          return STATUS_INSUFFICIENT_RESOURCES;
>      }
> -
> +
>      status = GetCountedUTF8String(&path, uloc);
> -
> +
>      if (!NT_SUCCESS(status)) {
>          return status;
>      }
> @@ -2028,7 +2028,7 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
>      }
>      status = XENBUS_STORE(Directory,&fdoData->StoreInterface,session-
> >transaction,NULL, tmppath, &listresults);
>      UnlockSessions(fdoData);
> -
> +
>      if (!NT_SUCCESS(status)) {
>          goto fail2;
>      }
> @@ -2046,8 +2046,8 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
>          stringarraysize+=GetCountedUtf8Size(nextresults);
>          for (;*nextresults!=0;nextresults++);
>          nextresults++;
> -    }
> -
> +    }
> +
>      status = STATUS_BUFFER_TOO_SMALL;
>      if (!AccessWmiBuffer(InBuffer, FALSE, &RequiredSize, OutBufferSize,
>                              WMI_UINT32, &noofnodes,
> @@ -2065,8 +2065,8 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
>              fullpath = Xmasprintf("/%s", nextresults);
>          }
>          else {
> -            fullpath = Xmasprintf("%s/%s",
> -                                    path->Buffer, nextresults);
> +            fullpath = Xmasprintf("%s/%s",
> +                                    path->Buffer, nextresults);
>          }
> 
>          if (fullpath == NULL) {
> @@ -2113,13 +2113,13 @@ SessionExecuteLog(UCHAR *InBuffer,
>      NTSTATUS status;
>      ANSI_STRING message;
>      if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
> -                                            WMI_STRING, &uloc,
> +                                            WMI_STRING, &uloc,
>                                              WMI_DONE))
>          return STATUS_INVALID_DEVICE_REQUEST;
> 
>      status = GetCountedAnsiString(&message, uloc);
> 
> -    if (!NT_SUCCESS(status))
> +    if (!NT_SUCCESS(status))
>          return status;
> 
>      XenIfaceDebugPrint(INFO,"USER: %s\n", message.Buffer);
> @@ -2141,7 +2141,7 @@ SessionExecuteStartTransaction(UCHAR *InBuffer,
> 
>      NTSTATUS status = STATUS_SUCCESS;
>      XenStoreSession *session;
> -
> +
>      if (!fdoData->InterfacesAcquired) {
>          status= STATUS_INSUFFICIENT_RESOURCES;
>          goto failnotinitialised;
> @@ -2158,7 +2158,7 @@ SessionExecuteStartTransaction(UCHAR *InBuffer,
>      }
> 
>      XENBUS_STORE(TransactionStart, &fdoData->StoreInterface, &session-
> >transaction);
> -
> +
> 
>  failtransactionactive:
>      UnlockSessions(fdoData);
> @@ -2180,7 +2180,7 @@ SessionExecuteCommitTransaction(UCHAR
> *InBuffer,
> 
>      NTSTATUS status = STATUS_SUCCESS;
>      XenStoreSession *session;
> -
> +
>      if (!fdoData->InterfacesAcquired) {
>          status= STATUS_INSUFFICIENT_RESOURCES;
>          goto failnotinitialised;
> @@ -2197,7 +2197,7 @@ SessionExecuteCommitTransaction(UCHAR
> *InBuffer,
>      }
> 
>      status = XENBUS_STORE(TransactionEnd,&fdoData->StoreInterface,
> session->transaction, TRUE);
> -
> +
>      session->transaction = NULL;
> 
>  failtransactionnotactive:
> @@ -2220,7 +2220,7 @@ SessionExecuteAbortTransaction(UCHAR *InBuffer,
> 
>      NTSTATUS status = STATUS_SUCCESS;
>      XenStoreSession *session;
> -
> +
>      if (!fdoData->InterfacesAcquired) {
>          status= STATUS_INSUFFICIENT_RESOURCES;
>          goto failnotinitialised;
> @@ -2237,7 +2237,7 @@ SessionExecuteAbortTransaction(UCHAR *InBuffer,
>      }
> 
>      status = XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface,
> session->transaction, FALSE);
> -
> +
>      session->transaction = NULL;
> 
>  failtransactionnotactive:
> @@ -2269,18 +2269,18 @@ SessionExecuteGetValue(UCHAR *InBuffer,
> 
>      *byteswritten = 0;
>      if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
> -                                            WMI_STRING, &uloc,
> +                                            WMI_STRING, &uloc,
>                                              WMI_DONE))
>          return STATUS_INVALID_DEVICE_REQUEST;
>      if (!fdoData->InterfacesAcquired) {
>          return STATUS_INSUFFICIENT_RESOURCES;
>      }
> -
> +
>      status = GetCountedUTF8String(&path, uloc);
> -
> -    if (!NT_SUCCESS(status))
> +
> +    if (!NT_SUCCESS(status))
>          return status;;
> -
> +
>      status = STATUS_INSUFFICIENT_RESOURCES;
>      tmppath = ExAllocatePoolWithTag(NonPagedPool,path-
> >Length+1,'XenP');
>      if (!tmppath) {
> @@ -2288,7 +2288,7 @@ SessionExecuteGetValue(UCHAR *InBuffer,
>      }
>      RtlZeroMemory(tmppath, path->Length+1);
>      RtlCopyBytes(tmppath,path->Buffer, path->Length);
> -
> +
> 
>      status = STATUS_WMI_INSTANCE_NOT_FOUND;
>      if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
> @@ -2297,10 +2297,10 @@ SessionExecuteGetValue(UCHAR *InBuffer,
>      }
>      status = XENBUS_STORE(Read, &fdoData->StoreInterface, session-
> >transaction, NULL, tmppath, &value);
>      UnlockSessions(fdoData);
> -
> -    if (!NT_SUCCESS(status))
> +
> +    if (!NT_SUCCESS(status))
>          goto fail2;
> -
> +
>      status = STATUS_BUFFER_TOO_SMALL;
>      if (!AccessWmiBuffer(OutBuffer, FALSE, &RequiredSize, OutBufferSize,
>                              WMI_STRING, GetCountedUtf8Size(value), &valuepos,
> @@ -2335,7 +2335,7 @@ BaseExecuteAddSession(UCHAR *InBuffer,
>      NTSTATUS status;
>      *byteswritten = 0;
>      if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
> -                            WMI_STRING, &stringid,
> +                            WMI_STRING, &stringid,
>                              WMI_DONE)){
>          return STATUS_INVALID_DEVICE_REQUEST;
>      }
> @@ -2345,12 +2345,12 @@ BaseExecuteAddSession(UCHAR *InBuffer,
>          *byteswritten = RequiredSize;
>          return STATUS_BUFFER_TOO_SMALL;
>      }
> -
> +
>      AllocUnicodeStringBuffer(&ustring, *(USHORT*)(stringid));
>      if (ustring.Buffer == NULL)
>          return STATUS_INSUFFICIENT_RESOURCES;
>      status = RtlUnicodeStringCbCopyStringN(&ustring,
> -                                            (LPCWSTR)(stringid+sizeof(USHORT)),
> +                                            (LPCWSTR)(stringid+sizeof(USHORT)),
>                                              *(USHORT*)(stringid));
>      if (!NT_SUCCESS(status)) {
>          FreeUnicodeStringBuffer(&ustring);
> @@ -2368,7 +2368,7 @@ BaseExecuteAddSession(UCHAR *InBuffer,
>  }
> 
> 
> -NTSTATUS
> +NTSTATUS
>  SessionExecuteMethod(UCHAR *Buffer,
>                      ULONG BufferSize,
>                      XENIFACE_FDO* fdoData,
> @@ -2397,115 +2397,115 @@ SessionExecuteMethod(UCHAR *Buffer,
>          return STATUS_INVALID_DEVICE_REQUEST;
>      }
> 
> -    InBuffer = Buffer + Method->DataBlockOffset;
> +    InBuffer = Buffer + Method->DataBlockOffset;
> 
>      GetCountedUnicodeString(&instance, InstStr);
> 
> -
> +
>      XenIfaceDebugPrint(TRACE,"Method Id %d\n", Method->MethodId);
>      switch (Method->MethodId) {
> -        case GetValue:
> -            status = SessionExecuteGetValue(InBuffer, Method->SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +        case GetValue:
> +            status = SessionExecuteGetValue(InBuffer, Method->SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
> -        case SetValue:
> -            status = SessionExecuteSetValue(InBuffer, Method->SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +        case SetValue:
> +            status = SessionExecuteSetValue(InBuffer, Method->SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
> -        case GetChildren:
> -            status = SessionExecuteGetChildren(InBuffer, Method-
> >SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +        case GetChildren:
> +            status = SessionExecuteGetChildren(InBuffer, Method-
> >SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
> -        case SetWatch:
> -            status = SessionExecuteSetWatch(InBuffer, Method->SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +        case SetWatch:
> +            status = SessionExecuteSetWatch(InBuffer, Method->SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
>          case EndSession:
> -            status = SessionExecuteEndSession(InBuffer, Method->SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +            status = SessionExecuteEndSession(InBuffer, Method-
> >SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
> -        case RemoveWatch:
> -            status = SessionExecuteRemoveWatch(InBuffer, Method-
> >SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +        case RemoveWatch:
> +            status = SessionExecuteRemoveWatch(InBuffer, Method-
> >SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
> -        case RemoveValue:
> -            status = SessionExecuteRemoveValue(InBuffer, Method-
> >SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +        case RemoveValue:
> +            status = SessionExecuteRemoveValue(InBuffer, Method-
> >SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
>          case Log:
> -            status = SessionExecuteLog(InBuffer,  Method->SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +            status = SessionExecuteLog(InBuffer,  Method->SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
> -        case StartTransaction:
> -            status = SessionExecuteStartTransaction(InBuffer,  Method-
> >SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +        case StartTransaction:
> +            status = SessionExecuteStartTransaction(InBuffer,  Method-
> >SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
>          case CommitTransaction:
> -            status = SessionExecuteCommitTransaction(InBuffer,  Method-
> >SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +            status = SessionExecuteCommitTransaction(InBuffer,  Method-
> >SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
>          case AbortTransaction:
> -            status = SessionExecuteAbortTransaction(InBuffer,  Method-
> >SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +            status = SessionExecuteAbortTransaction(InBuffer,  Method-
> >SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
>          case GetFirstChild:
> -            status = SessionExecuteGetFirstChild(InBuffer,  Method-
> >SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +            status = SessionExecuteGetFirstChild(InBuffer,  Method-
> >SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
>          case GetNextSibling:
> -            status = SessionExecuteGetNextSibling(InBuffer,  Method-
> >SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +            status = SessionExecuteGetNextSibling(InBuffer,  Method-
> >SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
> 
> @@ -2519,11 +2519,11 @@ SessionExecuteMethod(UCHAR *Buffer,
>      if (status == STATUS_BUFFER_TOO_SMALL) {
>          return NodeTooSmall(Buffer, BufferSize, (ULONG)*byteswritten,
> byteswritten);
>      }
> -
> +
>      Method->WnodeHeader.BufferSize = (ULONG)*byteswritten;
>       return status;
>  }
> -NTSTATUS
> +NTSTATUS
>  BaseExecuteMethod(UCHAR *Buffer,
>                      ULONG BufferSize,
>                      XENIFACE_FDO* fdoData,
> @@ -2540,14 +2540,14 @@ BaseExecuteMethod(UCHAR *Buffer,
>          return STATUS_INVALID_DEVICE_REQUEST;
>      }
> 
> -    InBuffer = Buffer + Method->DataBlockOffset;
> +    InBuffer = Buffer + Method->DataBlockOffset;
> 
>      switch (Method->MethodId) {
> -        case AddSession:
> -            status = BaseExecuteAddSession(InBuffer, Method->SizeDataBlock,
> -                                             Buffer+Method->DataBlockOffset,
> -                                             BufferSize-Method->DataBlockOffset,
> -                                             fdoData,
> +        case AddSession:
> +            status = BaseExecuteAddSession(InBuffer, Method->SizeDataBlock,
> +                                             Buffer+Method->DataBlockOffset,
> +                                             BufferSize-Method->DataBlockOffset,
> +                                             fdoData,
>                                               byteswritten);
>              Method->SizeDataBlock = (ULONG)*byteswritten;
>              *byteswritten+=Method->DataBlockOffset;
> @@ -2569,16 +2569,16 @@ WmiExecuteMethod(
>      if (IsEqualGUID(stack->Parameters.WMI.DataPath,
>                      &OBJECT_GUID(XenStoreBase))) {
>          return BaseExecuteMethod(stack->Parameters.WMI.Buffer,
> -                                    stack->Parameters.WMI.BufferSize,
> +                                    stack->Parameters.WMI.BufferSize,
>                                      fdoData,  byteswritten);
>      }
>      else if (IsEqualGUID(stack->Parameters.WMI.DataPath,
>                           &OBJECT_GUID(XenStoreSession))) {
>          return SessionExecuteMethod(stack->Parameters.WMI.Buffer,
> -                                    stack->Parameters.WMI.BufferSize,
> +                                    stack->Parameters.WMI.BufferSize,
>                                      fdoData,  byteswritten);
>      }
> -
> +
>      else
>          return STATUS_NOT_SUPPORTED;
>  }
> @@ -2598,7 +2598,7 @@ GenerateSessionBlock(UCHAR *Buffer,
>      ULONG* nameoffsets;
>      UCHAR *data;
>      UCHAR *names;
> -
> +
> 
>      LockSessions(fdoData);
> 
> @@ -2615,14 +2615,14 @@ GenerateSessionBlock(UCHAR *Buffer,
> 
>          AccessWmiBuffer((PUCHAR)nodesizerequired, FALSE, &RequiredSize, 0,
>                          WMI_UINT32, &id,
> -                        WMI_STRING,
> -                            GetCountedUnicodeStringSize(&session->stringid),
> +                        WMI_STRING,
> +                            GetCountedUnicodeStringSize(&session->stringid),
>                              &sesbuf,
>                          WMI_DONE);
>          nodesizerequired += RequiredSize;
> -
> +
>          AccessWmiBuffer((PUCHAR)namesizerequired, FALSE, &RequiredSize,
> 0,
> -                        WMI_STRING,
> +                        WMI_STRING,
>                              GetCountedUnicodeStringSize(&session->instancename),
>                              &inamebuf,
>                          WMI_DONE);
> @@ -2630,7 +2630,7 @@ GenerateSessionBlock(UCHAR *Buffer,
>          entries++;
>          session = (XenStoreSession *)session->listentry.Flink;
>      }
> -
> +
>      //perform the access check
>      if (!AccessWmiBuffer(Buffer, FALSE, &RequiredSize, BufferSize,
>                              WMI_BUFFER, sizeof(WNODE_ALL_DATA), &node,
> @@ -2665,21 +2665,21 @@ GenerateSessionBlock(UCHAR *Buffer,
> 
>              AccessWmiBuffer(datapos, FALSE, &RequiredSize, BufferSize+Buffer-
> datapos,
>                              WMI_UINT32, &id,
> -                            WMI_STRING,
> -                                GetCountedUnicodeStringSize(&session->stringid),
> +                            WMI_STRING,
> +                                GetCountedUnicodeStringSize(&session->stringid),
>                                  &sesbuf,
>                              WMI_DONE);
> 
> -            node->OffsetInstanceDataAndLength[entrynum].OffsetInstanceData
> =
> +            node->OffsetInstanceDataAndLength[entrynum].OffsetInstanceData
> =
>                  (ULONG)((UCHAR *)id - Buffer);
> -            node->OffsetInstanceDataAndLength[entrynum].LengthInstanceData
> =
> +            node-
> >OffsetInstanceDataAndLength[entrynum].LengthInstanceData =
>                  RequiredSize;
>              *id = session->id;
>              WriteCountedUnicodeString(&session->stringid, sesbuf);
>              datapos+=RequiredSize;
> 
>              AccessWmiBuffer(namepos, FALSE, &RequiredSize,
> BufferSize+Buffer-namepos,
> -                            WMI_STRING,
> +                            WMI_STRING,
>                                  GetCountedUnicodeStringSize(&session->instancename),
>                                  &inamebuf,
>                              WMI_DONE);
> @@ -2773,8 +2773,8 @@ GenerateBaseInstance(
>      else {
>          *time = 0;
>      }
> -
> -
> +
> +
>      node->WnodeHeader.BufferSize = node->DataBlockOffset+RequiredSize;
>      node->SizeDataBlock = RequiredSize;
> 
> @@ -2796,7 +2796,7 @@ GenerateSessionInstance(UCHAR *Buffer,
>      ULONG* id;
>      XenStoreSession *session;
>      UCHAR *sesbuf;
> -
> +
>      if (!AccessWmiBuffer(Buffer, TRUE, &RequiredSize, BufferSize,
>                              WMI_BUFFER, sizeof(WNODE_SINGLE_INSTANCE), &node,
>                              WMI_DONE))
> @@ -2805,7 +2805,7 @@ GenerateSessionInstance(UCHAR *Buffer,
>      }
>      if (!AccessWmiBuffer(Buffer, TRUE, &RequiredSize, BufferSize,
>                              WMI_BUFFER, sizeof(WNODE_SINGLE_INSTANCE), &node,
> -                            WMI_STRINGOFFSET, node->OffsetInstanceName, &InstStr,
> +                            WMI_STRINGOFFSET, node->OffsetInstanceName, &InstStr,
>                              WMI_OFFSET, node->DataBlockOffset, 0, &dbo,
>                              WMI_DONE))
>      {
> @@ -2818,10 +2818,10 @@ GenerateSessionInstance(UCHAR *Buffer,
>          UnlockSessions(fdoData);
>          return STATUS_WMI_INSTANCE_NOT_FOUND;
>      }
> -
> +
>      if (!AccessWmiBuffer(dbo, FALSE, &RequiredSize, BufferSize-node-
> >DataBlockOffset,
>                              WMI_UINT32, &id,
> -                            WMI_STRING,
> +                            WMI_STRING,
>                                  GetCountedUnicodeStringSize(&session->stringid),
>                                  &sesbuf,
>                              WMI_DONE)) {
> @@ -2837,7 +2837,7 @@ GenerateSessionInstance(UCHAR *Buffer,
>      node->WnodeHeader.BufferSize = node->DataBlockOffset +
> RequiredSize;
>      *byteswritten = node->DataBlockOffset + RequiredSize;
> 
> -
> +
> 
> 
>      return STATUS_SUCCESS;
> @@ -2851,17 +2851,17 @@ WmiQueryAllData(
>      OUT ULONG_PTR *byteswritten
>     )
>  {
> -
> -    if (IsEqualGUID(stack->Parameters.WMI.DataPath,
> +
> +    if (IsEqualGUID(stack->Parameters.WMI.DataPath,
>                      &OBJECT_GUID(XenStoreBase))) {
>          return GenerateBaseBlock(   fdoData,
> -                                    stack->Parameters.WMI.Buffer,
> +                                    stack->Parameters.WMI.Buffer,
>                                      stack->Parameters.WMI.BufferSize,
>                                      byteswritten);
>      }
> -    else if (IsEqualGUID(stack->Parameters.WMI.DataPath,
> +    else if (IsEqualGUID(stack->Parameters.WMI.DataPath,
>                           &OBJECT_GUID(XenStoreSession))) {
> -        return GenerateSessionBlock(stack->Parameters.WMI.Buffer,
> +        return GenerateSessionBlock(stack->Parameters.WMI.Buffer,
>                                      stack->Parameters.WMI.BufferSize,
>                                      fdoData,
>                                      byteswritten);
> @@ -2882,13 +2882,13 @@ WmiQuerySingleInstance(
>      if (IsEqualGUID(stack->Parameters.WMI.DataPath,
>                      &OBJECT_GUID(XenStoreBase))) {
>          return GenerateBaseInstance(fdoData,
> -                                    stack->Parameters.WMI.Buffer,
> +                                    stack->Parameters.WMI.Buffer,
>                                      stack->Parameters.WMI.BufferSize,
>                                      byteswritten);
>      }
>      else if (IsEqualGUID(stack->Parameters.WMI.DataPath,
>                           &OBJECT_GUID(XenStoreSession))) {
> -        return GenerateSessionInstance(stack->Parameters.WMI.Buffer,
> +        return GenerateSessionInstance(stack->Parameters.WMI.Buffer,
>                                      stack->Parameters.WMI.BufferSize,
>                                      fdoData,
>                                      byteswritten);
> @@ -2913,7 +2913,7 @@ WmiRegInfo(
>      ULONG RequiredSize;
>      int entries = 4;
>      const static UNICODE_STRING mofname =
> RTL_CONSTANT_STRING(L"XENIFACEMOF");
> -
> +
>      size_t mofnamesz;
> 
> 
> @@ -2927,12 +2927,12 @@ WmiRegInfo(
>          mofnamesz = 0;
>      }
>      if(!AccessWmiBuffer(stack->Parameters.WMI.Buffer, FALSE,
> -                        &RequiredSize,
> +                        &RequiredSize,
>                          stack->Parameters.WMI.BufferSize,
>                          WMI_BUFFER, sizeof(WMIREGINFO), (UCHAR **)&reginfo,
>                          WMI_BUFFER, entries * sizeof(WMIREGGUID), (UCHAR
> **)&guiddata,
>                          WMI_STRING, mofnamesz, &mofnameptr,
> -                        WMI_STRING,
> DriverParameters.RegistryPath.Length+sizeof(USHORT),
> +                        WMI_STRING,
> DriverParameters.RegistryPath.Length+sizeof(USHORT),
>                                      &regpath,
>                          WMI_DONE)){
>          reginfo->BufferSize = RequiredSize;
> @@ -2940,7 +2940,7 @@ WmiRegInfo(
>          return STATUS_BUFFER_TOO_SMALL;
> 
>      }
> -    if (stack->Parameters.WMI.DataPath == WMIREGISTER) {
> +    if (stack->Parameters.WMI.DataPath == WMIREGISTER) {
>          reginfo->MofResourceName = (ULONG)((ULONG_PTR)mofnameptr -
> (ULONG_PTR)reginfo);
>          WriteCountedUnicodeString(&mofname, mofnameptr);
>          reginfo->RegistryPath = (ULONG)((ULONG_PTR)regpath -
> (ULONG_PTR)reginfo);
> @@ -2955,28 +2955,28 @@ WmiRegInfo(
>      guid->InstanceCount = 1;
>      guid->Guid = OBJECT_GUID(XenStoreBase);
>      guid->Flags = WMIREG_FLAG_INSTANCE_PDO;
> -    guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject;
> -	ObReferenceObject(fdoData->PhysicalDeviceObject);
> -
> +    guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject;
> +    ObReferenceObject(fdoData->PhysicalDeviceObject);
> +
>      guid = &reginfo->WmiRegGuid[1];
>      guid->Guid = OBJECT_GUID(XenStoreSession);
>      guid->Flags =0;
> -
> +
>      guid = &reginfo->WmiRegGuid[2];
>      guid->InstanceCount = 1;
>      guid->Guid = OBJECT_GUID(XenStoreWatchEvent);
>      guid->Flags = WMIREG_FLAG_INSTANCE_PDO |
>                  WMIREG_FLAG_EVENT_ONLY_GUID ;
> -    guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject;
> -	ObReferenceObject(fdoData->PhysicalDeviceObject);
> +    guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject;
> +    ObReferenceObject(fdoData->PhysicalDeviceObject);
> 
>      guid = &reginfo->WmiRegGuid[3];
>      guid->InstanceCount = 1;
>      guid->Guid = OBJECT_GUID(XenStoreUnsuspendedEvent);
>      guid->Flags = WMIREG_FLAG_INSTANCE_PDO |
>                  WMIREG_FLAG_EVENT_ONLY_GUID ;
> -	guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject;
> -	ObReferenceObject(fdoData->PhysicalDeviceObject);
> +    guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject;
> +    ObReferenceObject(fdoData->PhysicalDeviceObject);
> 
> 
>      *byteswritten = RequiredSize;
> @@ -2990,7 +2990,7 @@ WmiRegInfoEx(
>      OUT ULONG_PTR *byteswritten
>     )
>  {
> -
> +
>      XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__);
>      return WmiRegInfo(fdoData, stack, byteswritten);
>  }
> @@ -3006,17 +3006,17 @@ WmiProcessMinorFunction(
>      PIO_STACK_LOCATION stack;
>      UCHAR MinorFunction;
> 
> -
> +
> 
>      stack = IoGetCurrentIrpStackLocation(Irp);
> 
> -	if (stack->Parameters.WMI.ProviderId != (ULONG_PTR)fdoData->Dx-
> >DeviceObject) {
> -		XenIfaceDebugPrint(TRACE,"ProviderID %p %p", stack-
> >Parameters.WMI.ProviderId, fdoData->PhysicalDeviceObject);
> -		return STATUS_NOT_SUPPORTED;
> -	}
> -	else {
> -		XenIfaceDebugPrint(TRACE,"ProviderID Match %p %p",
> stack->Parameters.WMI.ProviderId, fdoData->PhysicalDeviceObject);
> -	}
> +    if (stack->Parameters.WMI.ProviderId != (ULONG_PTR)fdoData->Dx-
> >DeviceObject) {
> +        XenIfaceDebugPrint(TRACE,"ProviderID %p %p", stack-
> >Parameters.WMI.ProviderId, fdoData->PhysicalDeviceObject);
> +        return STATUS_NOT_SUPPORTED;
> +    }
> +    else {
> +        XenIfaceDebugPrint(TRACE,"ProviderID Match %p %p", stack-
> >Parameters.WMI.ProviderId, fdoData->PhysicalDeviceObject);
> +    }
>      MinorFunction = stack->MinorFunction;
> 
>      switch (MinorFunction)
> @@ -3060,9 +3060,9 @@ NTSTATUS XenIfaceSystemControl(
>      status = WmiProcessMinorFunction(fdoData, Irp);
> 
>      if (status != STATUS_NOT_SUPPORTED) {
> -		Irp->IoStatus.Status = status;
> +        Irp->IoStatus.Status = status;
>          IoCompleteRequest(Irp, IO_NO_INCREMENT);
> -
> +
>      }
>      else {
>          IoSkipCurrentIrpStackLocation(Irp);
> diff --git a/src/xeniface/wmi.h b/src/xeniface/wmi.h
> index ed77af7..a49f1b3 100644
> --- a/src/xeniface/wmi.h
> +++ b/src/xeniface/wmi.h
> @@ -60,15 +60,15 @@ NTSTATUS XenIfaceSystemControl(
>      );
> 
>  void FireSuspendEvent(
> -	IN OUT PXENIFACE_FDO fdoData
> -	);
> +    IN OUT PXENIFACE_FDO fdoData
> +    );
> 
>  void SessionsResumeAll(
> -	XENIFACE_FDO *fdoData
> +    XENIFACE_FDO *fdoData
>  );
> 
>  void SessionsSuspendAll(
> -	XENIFACE_FDO *fdoData
> +    XENIFACE_FDO *fdoData
>  );
> 
>  #endif
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Fri Oct 23 13:40:32 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 13:40: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 1Zpca7-0004oW-Qt; Fri, 23 Oct 2015 13:40:31 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7314647ef=Paul.Durrant@citrix.com>)
	id 1Zpca6-0004nv-IT
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 13:40:31 +0000
Received: from [85.158.139.211] by server-17.bemta-5.messagelabs.com id
	5A/10-18107-DC83A265; Fri, 23 Oct 2015 13:40:29 +0000
X-Env-Sender: prvs=7314647ef=Paul.Durrant@citrix.com
X-Msg-Ref: server-14.tower-206.messagelabs.com!1445607626!39212485!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16175 invoked from network); 23 Oct 2015 13:40:26 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-14.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 13:40:26 -0000
X-IronPort-AV: E=Sophos;i="5.20,186,1444694400"; 
   d="scan'208";a="5998779"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 3/6] Untabify the whole XENIFACE project
Thread-Index: AQHRC8ELFaul0EcQD0yK0RCjO2Wem555GTJg
Date: Fri, 23 Oct 2015 13:40:25 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F622FCE@AMSPEX01CL01.citrite.net>
References: <562721EE.6090909@invisiblethingslab.com>
In-Reply-To: <562721EE.6090909@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] [PATCH 3/6] Untabify the whole XENIFACE project
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 Rafal Wojdyla
> Sent: 21 October 2015 06:26
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 3/6] Untabify the whole XENIFACE project
> 
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  include/util.h        |   8 +-
>  src/xeniface/driver.c |  32 +--
>  src/xeniface/driver.h |   2 +-
>  src/xeniface/fdo.c    | 268 +++++++++++-----------
>  src/xeniface/fdo.h    |  14 +-
>  src/xeniface/ioctls.c |   4 +-
>  src/xeniface/log.h    |   4 +-
>  src/xeniface/thread.c |   2 +-
>  src/xeniface/wmi.c    | 604 +++++++++++++++++++++++++--------------------
> -----
>  src/xeniface/wmi.h    |   8 +-
>  10 files changed, 473 insertions(+), 473 deletions(-)
> 
> diff --git a/include/util.h b/include/util.h
> index a05fb34..10e5414 100644
> --- a/include/util.h
> +++ b/include/util.h
> @@ -232,10 +232,10 @@ __AllocatePage(
> 
>      MdlMappedSystemVa = MmMapLockedPagesSpecifyCache(Mdl,
>                                                       KernelMode,
> -						                             MmCached,
> -						                             NULL,
> -						                             FALSE,
> -
> NormalPagePriority);
> +                                                     MmCached,
> +                                                     NULL,
> +                                                     FALSE,
> +                                                     NormalPagePriority);
> 
>      status = STATUS_UNSUCCESSFUL;
>      if (MdlMappedSystemVa == NULL)
> diff --git a/src/xeniface/driver.c b/src/xeniface/driver.c
> index 1c84467..40b1669 100644
> --- a/src/xeniface/driver.c
> +++ b/src/xeniface/driver.c
> @@ -58,9 +58,9 @@ DriverUnload(
>          goto done;
> 
> 
> -	if (DriverParameters.RegistryPath.Buffer != NULL) {
> -		ExFreePool(DriverParameters.RegistryPath.Buffer);
> -	}
> +    if (DriverParameters.RegistryPath.Buffer != NULL) {
> +        ExFreePool(DriverParameters.RegistryPath.Buffer);
> +    }
> 
>  done:
>      DriverObject = NULL;
> @@ -145,7 +145,7 @@ DriverEntry(
>      )
>  {
>      ULONG               Index;
> -	NTSTATUS status = STATUS_UNSUCCESSFUL;
> +    NTSTATUS status = STATUS_UNSUCCESSFUL;
>      ASSERT3P(DriverObject, ==, NULL);
> 
>      ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
> @@ -156,16 +156,16 @@ DriverEntry(
>           MAJOR_VERSION_STR "." MINOR_VERSION_STR "."
> MICRO_VERSION_STR "." BUILD_NUMBER_STR,
>           DAY_STR "/" MONTH_STR "/" YEAR_STR);
> 
> -	DriverParameters.RegistryPath.MaximumLength = RegistryPath-
> >Length + sizeof(UNICODE_NULL);
> -	DriverParameters.RegistryPath.Length = RegistryPath->Length;
> -	DriverParameters.RegistryPath.Buffer = ExAllocatePoolWithTag
> (PagedPool,
> -
> 			DriverParameters.RegistryPath.MaximumLength,
> -
> 			XENIFACE_POOL_TAG);
> -	if (NULL == DriverParameters.RegistryPath.Buffer) {
> -		status = STATUS_INSUFFICIENT_RESOURCES;
> -		goto fail1;
> -	}
> -	RtlCopyUnicodeString(&DriverParameters.RegistryPath,
> RegistryPath);
> +    DriverParameters.RegistryPath.MaximumLength = RegistryPath->Length
> + sizeof(UNICODE_NULL);
> +    DriverParameters.RegistryPath.Length = RegistryPath->Length;
> +    DriverParameters.RegistryPath.Buffer = ExAllocatePoolWithTag
> (PagedPool,
> +                                                DriverParameters.RegistryPath.MaximumLength,
> +                                                XENIFACE_POOL_TAG);
> +    if (NULL == DriverParameters.RegistryPath.Buffer) {
> +        status = STATUS_INSUFFICIENT_RESOURCES;
> +        goto fail1;
> +    }
> +    RtlCopyUnicodeString(&DriverParameters.RegistryPath, RegistryPath);
> 
> 
>      DriverObject = _DriverObject;
> @@ -187,6 +187,6 @@ done:
> 
>      return STATUS_SUCCESS;
>  fail1:
> -	Error("fail1 (%08x)\n", status);
> -	return status;
> +    Error("fail1 (%08x)\n", status);
> +    return status;
>  }
> diff --git a/src/xeniface/driver.h b/src/xeniface/driver.h
> index 00f2d8f..f3c86e8 100644
> --- a/src/xeniface/driver.h
> +++ b/src/xeniface/driver.h
> @@ -51,7 +51,7 @@ extern PDRIVER_OBJECT   DriverObject;
>  #define MAX_DEVICE_ID_LEN   200
> 
>  typedef struct _XENIFACE_PARAMETERS {
> -	UNICODE_STRING RegistryPath;
> +    UNICODE_STRING RegistryPath;
> 
>  } XENIFACE_PARAMETERS, *PXENIFACE_PARAMETERS;
> 
> diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
> index 51bda24..b73dee1 100644
> --- a/src/xeniface/fdo.c
> +++ b/src/xeniface/fdo.c
> @@ -1,31 +1,31 @@
>  /* Copyright (c) Citrix Systems Inc.
>   * All rights reserved.
> - *
> - * Redistribution and use in source and binary forms,
> - * with or without modification, are permitted provided
> + *
> + * 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
> + *
> + * *   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
> + * *   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
> + *
> + * 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.
>   */
> 
> @@ -70,7 +70,7 @@ FdoInitialiseXSRegistryEntries(
>      ANSI_STRING AnsiValue;
>      char *value;
>      NTSTATUS status;
> -	NT_ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
> +    NT_ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
>      status = XENBUS_STORE(Read,
>                            &Fdo->StoreInterface,
>                            NULL,
> @@ -113,7 +113,7 @@ FdoInitialiseXSRegistryEntries(
>      }
> 
>      ZwClose(RegHandle);
> -
> +
>      RtlFreeUnicodeString(&UnicodeValue);
>      XENBUS_STORE(Free, &Fdo->StoreInterface, value);
> 
> @@ -140,40 +140,40 @@ failXS:
>  #define REGISTRY_THREAD_END_EVENT 1
>  #define REGISTRY_EVENTS 2
> 
> -static NTSTATUS FdoRegistryThreadHandler(IN  PXENIFACE_THREAD  Self,
> -								  IN PVOID
> StartContext) {
> -	KEVENT* threadevents[REGISTRY_EVENTS];
> -	PXENIFACE_FDO Fdo = (PXENIFACE_FDO)StartContext;
> -	NTSTATUS status;
> +static NTSTATUS FdoRegistryThreadHandler(IN  PXENIFACE_THREAD  Self,
> +                                         IN  PVOID StartContext) {
> +    KEVENT* threadevents[REGISTRY_EVENTS];
> +    PXENIFACE_FDO Fdo = (PXENIFACE_FDO)StartContext;
> +    NTSTATUS status;
> 
> -	PKEVENT             Event;
> +    PKEVENT             Event;
> 
>      Event = ThreadGetEvent(Self);
> 
> -	threadevents[REGISTRY_WRITE_EVENT] = &Fdo-
> >registryWriteEvent;
> -	threadevents[REGISTRY_THREAD_END_EVENT] = Event;
> +    threadevents[REGISTRY_WRITE_EVENT] = &Fdo->registryWriteEvent;
> +    threadevents[REGISTRY_THREAD_END_EVENT] = Event;
> 
> -	for(;;) {
> -
> -		status = KeWaitForMultipleObjects(REGISTRY_EVENTS,
> (PVOID *)threadevents, WaitAny, Executive, KernelMode, TRUE, NULL,
> NULL);
> -		if ((status>=STATUS_WAIT_0) && (status <
> STATUS_WAIT_0+REGISTRY_EVENTS)) {
> -			if (status ==
> STATUS_WAIT_0+REGISTRY_WRITE_EVENT) {
> +    for(;;) {
> +
> +        status = KeWaitForMultipleObjects(REGISTRY_EVENTS, (PVOID
> *)threadevents, WaitAny, Executive, KernelMode, TRUE, NULL, NULL);
> +        if ((status>=STATUS_WAIT_0) && (status <
> STATUS_WAIT_0+REGISTRY_EVENTS)) {
> +            if (status == STATUS_WAIT_0+REGISTRY_WRITE_EVENT) {
>                  XenIfaceDebugPrint(ERROR,"WriteRegistry\n");
>                  FdoInitialiseXSRegistryEntries(Fdo);
>                  KeClearEvent(threadevents[REGISTRY_WRITE_EVENT]);
> -			}
> -			if (status ==
> STATUS_WAIT_0+REGISTRY_THREAD_END_EVENT) {
> -				if (ThreadIsAlerted(Self))
> -					return STATUS_SUCCESS;
> -
> 	KeClearEvent(threadevents[REGISTRY_THREAD_END_EVENT]);
> -			}
> -
> -		}
> -		else if (!NT_SUCCESS(status)) {
> -			XenIfaceDebugPrint(ERROR, "Registry handler thread
> failed %x\n", status);
> -			return status;
> -		}
> -	}
> +            }
> +            if (status == STATUS_WAIT_0+REGISTRY_THREAD_END_EVENT) {
> +                if (ThreadIsAlerted(Self))
> +                    return STATUS_SUCCESS;
> +                KeClearEvent(threadevents[REGISTRY_THREAD_END_EVENT]);
> +            }
> +
> +        }
> +        else if (!NT_SUCCESS(status)) {
> +            XenIfaceDebugPrint(ERROR, "Registry handler thread failed %x\n",
> status);
> +            return status;
> +        }
> +    }
> 
>  }
> 
> @@ -311,7 +311,7 @@ __FdoSetName(
>      status = RtlUnicodeStringToAnsiString(&Ansi, &Unicode, FALSE);
>      if (!NT_SUCCESS(status))
>          goto fail1;
> -
> +
>      for (Index = 0; Dx->Name[Index] != '\0'; Index++) {
>          if (!isalnum((UCHAR)Dx->Name[Index]))
>              Dx->Name[Index] = '_';
> @@ -437,7 +437,7 @@ __FdoForwardIrpSynchronously(
>      IN  PVOID           Context
>      )
>  {
> -	PKEVENT             Event = (PKEVENT)Context;
> +    PKEVENT             Event = (PKEVENT)Context;
> 
>      UNREFERENCED_PARAMETER(DeviceObject);
>      UNREFERENCED_PARAMETER(Irp);
> @@ -595,7 +595,7 @@ __FdoFreeAnsi(
> 
>      for (Index = 0; Ansi[Index].Buffer != NULL; Index++)
>          __FdoFree(Ansi[Index].Buffer);
> -
> +
>      __FdoFree(Ansi);
>  }
> 
> @@ -752,7 +752,7 @@ FdoD3ToD0(
>      if (!NT_SUCCESS(status))
>          goto fail4;
> 
> -	Fdo->InterfacesAcquired = TRUE;
> +    Fdo->InterfacesAcquired = TRUE;
>      KeLowerIrql(Irql);
> 
>      return STATUS_SUCCESS;
> @@ -760,7 +760,7 @@ FdoD3ToD0(
>  fail4:
>      Error("fail4\n");
> 
> -	XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
> +    XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
> 
>  fail3:
>      Error("fail3\n");
> @@ -788,7 +788,7 @@ FdoD0ToD3(
>      KIRQL           Irql;
> 
>      ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
> -	Fdo->InterfacesAcquired = FALSE;
> +    Fdo->InterfacesAcquired = FALSE;
>      KeRaiseIrql(DISPATCH_LEVEL, &Irql);
> 
>      XENBUS_SUSPEND(Deregister,
> @@ -796,12 +796,12 @@ FdoD0ToD3(
>                     Fdo->SuspendCallbackLate);
>      Fdo->SuspendCallbackLate = NULL;
> 
> -	XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
> +    XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
> 
>      XENBUS_SUSPEND(Release, &Fdo->SuspendInterface);
> 
>      __FdoD0ToD3(Fdo);
> -
> +
>      KeLowerIrql(Irql);
>  }
> 
> @@ -854,16 +854,16 @@ FdoStartDevice(
>      if (!NT_SUCCESS(status))
>          goto fail3;
> 
> -	status =  IoSetDeviceInterfaceState(&Fdo->InterfaceName, TRUE);
> -	if (!NT_SUCCESS(status))
> -		goto fail4;
> +    status =  IoSetDeviceInterfaceState(&Fdo->InterfaceName, TRUE);
> +    if (!NT_SUCCESS(status))
> +        goto fail4;
> 
> 
> -	if (__FdoGetDevicePnpState(Fdo) != Stopped) {
> -		status = WmiInit(Fdo);
> -		if (!NT_SUCCESS(status))
> -			goto fail5;
> -	}
> +    if (__FdoGetDevicePnpState(Fdo) != Stopped) {
> +        status = WmiInit(Fdo);
> +        if (!NT_SUCCESS(status))
> +            goto fail5;
> +    }
> 
>      __FdoSetDevicePnpState(Fdo, Started);
> 
> @@ -874,13 +874,13 @@ FdoStartDevice(
>      return status;
> 
>  fail5:
> -	Error("fail5\n");
> +    Error("fail5\n");
>  #pragma warning(suppress : 6031)
> -	IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
> +    IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
> 
>  fail4:
> -	Error("fail4\n");
> -	FdoD0ToD3(Fdo);
> +    Error("fail4\n");
> +    FdoD0ToD3(Fdo);
> 
>  fail3:
>      Error("fail3\n");
> @@ -1008,7 +1008,7 @@ FdoSurpriseRemoval(
>      __FdoSetDevicePnpState(Fdo, SurpriseRemovePending);
> 
>      Irp->IoStatus.Status = STATUS_SUCCESS;
> -#pragma warning(suppress : 6031)
> +#pragma warning(suppress : 6031)
>      IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
>      WmiFinalise(Fdo);
> 
> @@ -1031,7 +1031,7 @@ FdoRemoveDevice(
>      if (__FdoGetDevicePowerState(Fdo) != PowerDeviceD0)
>          goto done;
> 
> -	FdoD0ToD3(Fdo);
> +    FdoD0ToD3(Fdo);
> 
>      __FdoSetSystemPowerState(Fdo, PowerSystemSleeping3);
>      FdoS3ToS4(Fdo);
> @@ -1043,7 +1043,7 @@ done:
>      __FdoSetDevicePnpState(Fdo, Deleted);
> 
>      Irp->IoStatus.Status = STATUS_SUCCESS;
> -#pragma warning(suppress : 6031)
> +#pragma warning(suppress : 6031)
>      IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
>      WmiFinalise(Fdo);
> 
> @@ -1139,7 +1139,7 @@ FdoDeviceUsageNotification(
>      if (!NT_SUCCESS(status))
>          goto fail1;
> 
> -    NotDisableable = FALSE;
> +    NotDisableable = FALSE;
>      for (Type = (DEVICE_USAGE_NOTIFICATION_TYPE)0; Type <=
> DeviceUsageTypeDumpFile; Type++) {
>          if (Fdo->Usage[Type] != 0) {
>              NotDisableable = TRUE;
> @@ -1151,7 +1151,7 @@ FdoDeviceUsageNotification(
> 
>      if (Fdo->NotDisableable != NotDisableable) {
>          Fdo->NotDisableable = NotDisableable;
> -
> +
>          IoInvalidateDeviceState(__FdoGetPhysicalDeviceObject(Fdo));
>      }
> 
> @@ -1210,8 +1210,8 @@ FdoDispatchPnp(
>      MinorFunction = StackLocation->MinorFunction;
> 
>      Trace("====> (%02x:%s)\n",
> -          MinorFunction,
> -          PnpMinorFunctionName(MinorFunction));
> +          MinorFunction,
> +          PnpMinorFunctionName(MinorFunction));
> 
>      switch (StackLocation->MinorFunction) {
>      case IRP_MN_START_DEVICE:
> @@ -1265,9 +1265,9 @@ FdoDispatchPnp(
>      }
> 
>      Trace("<==== (%02x:%s)(%08x)\n",
> -          MinorFunction,
> +          MinorFunction,
>            PnpMinorFunctionName(MinorFunction),
> -          status);
> +          status);
> 
>      return status;
>  }
> @@ -1299,7 +1299,7 @@ __FdoSetDevicePowerUp(
> 
>      ASSERT3U(DeviceState, ==, PowerDeviceD0);
>      status = FdoD3ToD0(Fdo);
> -	SessionsResumeAll(Fdo);
> +    SessionsResumeAll(Fdo);
>      ASSERT(NT_SUCCESS(status));
> 
>  done:
> @@ -1332,9 +1332,9 @@ __FdoSetDevicePowerDown(
>      ASSERT3U(DeviceState, ==, PowerDeviceD3);
> 
>      if (__FdoGetDevicePowerState(Fdo) == PowerDeviceD0){
> -		SessionsSuspendAll(Fdo);
> +        SessionsSuspendAll(Fdo);
>          FdoD0ToD3(Fdo);
> -	}
> +    }
> 
>      IoSkipCurrentIrpStackLocation(Irp);
>      status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
> @@ -1358,7 +1358,7 @@ __FdoSetDevicePower(
>      PowerAction = StackLocation->Parameters.Power.ShutdownType;
> 
>      Trace("====> (%s:%s)\n",
> -          PowerDeviceStateName(DeviceState),
> +          PowerDeviceStateName(DeviceState),
>            PowerActionName(PowerAction));
> 
>      ASSERT3U(PowerAction, <, PowerActionShutdown);
> @@ -1376,7 +1376,7 @@ __FdoSetDevicePower(
> 
>  done:
>      Trace("<==== (%s:%s)(%08x)\n",
> -          PowerDeviceStateName(DeviceState),
> +          PowerDeviceStateName(DeviceState),
>            PowerActionName(PowerAction),
>            status);
>      return status;
> @@ -1532,7 +1532,7 @@ __FdoSetSystemPower(
>      PowerAction = StackLocation->Parameters.Power.ShutdownType;
> 
>      Trace("====> (%s:%s)\n",
> -          PowerSystemStateName(SystemState),
> +          PowerSystemStateName(SystemState),
>            PowerActionName(PowerAction));
> 
>      ASSERT3U(PowerAction, <, PowerActionShutdown);
> @@ -1550,7 +1550,7 @@ __FdoSetSystemPower(
> 
>  done:
>      Trace("<==== (%s:%s)(%08x)\n",
> -          PowerSystemStateName(SystemState),
> +          PowerSystemStateName(SystemState),
>            PowerActionName(PowerAction),
>            status);
>      return status;
> @@ -1616,7 +1616,7 @@ __FdoQueryDevicePower(
>      PowerAction = StackLocation->Parameters.Power.ShutdownType;
> 
>      Trace("====> (%s:%s)\n",
> -          PowerDeviceStateName(DeviceState),
> +          PowerDeviceStateName(DeviceState),
>            PowerActionName(PowerAction));
> 
>      ASSERT3U(PowerAction, <, PowerActionShutdown);
> @@ -1634,7 +1634,7 @@ __FdoQueryDevicePower(
> 
>  done:
>      Trace("<==== (%s:%s)(%08x)\n",
> -          PowerDeviceStateName(DeviceState),
> +          PowerDeviceStateName(DeviceState),
>            PowerActionName(PowerAction),
>            status);
>      return status;
> @@ -1768,7 +1768,7 @@ __FdoQuerySystemPower(
>      PowerAction = StackLocation->Parameters.Power.ShutdownType;
> 
>      Trace("====> (%s:%s)\n",
> -          PowerSystemStateName(SystemState),
> +          PowerSystemStateName(SystemState),
>            PowerActionName(PowerAction));
> 
>      ASSERT3U(PowerAction, <, PowerActionShutdown);
> @@ -1786,7 +1786,7 @@ __FdoQuerySystemPower(
> 
>  done:
>      Trace("<==== (%s:%s)(%08x)\n",
> -          PowerSystemStateName(SystemState),
> +          PowerSystemStateName(SystemState),
>            PowerActionName(PowerAction),
>            status);
> 
> @@ -2080,26 +2080,26 @@ FdoDispatch(
>          status = FdoDispatchPower(Fdo, Irp);
>          break;
> 
> -	case IRP_MJ_DEVICE_CONTROL:
> -		status = XenIFaceIoctl(Fdo, Irp);
> -		break;
> +    case IRP_MJ_DEVICE_CONTROL:
> +        status = XenIFaceIoctl(Fdo, Irp);
> +        break;
> 
> -	case IRP_MJ_SYSTEM_CONTROL:
> -		status = XenIfaceSystemControl(Fdo, Irp);
> -		break;
> +    case IRP_MJ_SYSTEM_CONTROL:
> +        status = XenIfaceSystemControl(Fdo, Irp);
> +        break;
> 
> -	case IRP_MJ_READ:
> -	case IRP_MJ_WRITE:
> -		status = FdoReadWrite(Fdo, Irp);
> -		break;
> +    case IRP_MJ_READ:
> +    case IRP_MJ_WRITE:
> +        status = FdoReadWrite(Fdo, Irp);
> +        break;
> 
> -	case IRP_MJ_CREATE:
> -		status = FdoCreateFile(Fdo, Irp);
> -		break;
> +    case IRP_MJ_CREATE:
> +        status = FdoCreateFile(Fdo, Irp);
> +        break;
> 
> -	case IRP_MJ_CLOSE:
> -		status = FdoClose(Fdo, Irp);
> -		break;
> +    case IRP_MJ_CLOSE:
> +        status = FdoClose(Fdo, Irp);
> +        break;
> 
>      default:
>          status = FdoDispatchDefault(Fdo, Irp);
> @@ -2149,7 +2149,7 @@ FdoQueryInterface(
>      StackLocation->Parameters.QueryInterface.Size = (USHORT)Size;
>      StackLocation->Parameters.QueryInterface.Version = (USHORT)Version;
>      StackLocation->Parameters.QueryInterface.Interface = Interface;
> -
> +
>      Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
> 
>      status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
> @@ -2227,7 +2227,7 @@ FdoCreate(
>      Dx->SystemPowerState = PowerSystemShutdown;
>      Dx->DevicePowerState = PowerDeviceD3;
> 
> -	FunctionDeviceObject->Flags |= DO_POWER_PAGABLE;
> +    FunctionDeviceObject->Flags |= DO_POWER_PAGABLE;
>      FunctionDeviceObject->Flags |= DO_BUFFERED_IO;
> 
>      Fdo = (PXENIFACE_FDO)__FdoAllocate(sizeof (XENIFACE_FDO));
> @@ -2258,12 +2258,12 @@ FdoCreate(
>          goto fail5;
> 
>  #pragma prefast(suppress:6014) // Possibly leaking Fdo->InterfaceName
> -	status = IoRegisterDeviceInterface(PhysicalDeviceObject,
> -
> 	(LPGUID)&GUID_INTERFACE_XENIFACE,
> -
> 	NULL,
> -
> 	&Fdo->InterfaceName);
> -	if (!NT_SUCCESS(status))
> -		goto fail6;
> +    status = IoRegisterDeviceInterface(PhysicalDeviceObject,
> +                                       (LPGUID)&GUID_INTERFACE_XENIFACE,
> +                                       NULL,
> +                                       &Fdo->InterfaceName);
> +    if (!NT_SUCCESS(status))
> +        goto fail6;
> 
>      status = __FdoSetName(Fdo, Name);
>      if (!NT_SUCCESS(status))
> @@ -2300,13 +2300,13 @@ FdoCreate(
>      InitializeListHead(&Dx->ListEntry);
>      Fdo->References = 1;
> 
> -	FdoInitialiseXSRegistryEntries(Fdo);
> +    FdoInitialiseXSRegistryEntries(Fdo);
> 
> -	KeInitializeEvent(&Fdo->registryWriteEvent, NotificationEvent,
> FALSE);
> +    KeInitializeEvent(&Fdo->registryWriteEvent, NotificationEvent, FALSE);
> 
> -	status = ThreadCreate(FdoRegistryThreadHandler, Fdo, &Fdo-
> >registryThread);
> -	if (!NT_SUCCESS(status))
> -		goto fail11;
> +    status = ThreadCreate(FdoRegistryThreadHandler, Fdo, &Fdo-
> >registryThread);
> +    if (!NT_SUCCESS(status))
> +        goto fail11;
> 
>      Info("%p (%s)\n",
>           FunctionDeviceObject,
> @@ -2317,15 +2317,15 @@ FdoCreate(
> 
>      return STATUS_SUCCESS;
> 
> -
> +
>  fail11:
> -	Error("fail11\n");
> +    Error("fail11\n");
> 
>      RtlZeroMemory(&Fdo->StoreInterface,
>                    sizeof (XENBUS_STORE_INTERFACE));
> 
>  fail10:
> -	Error("fail10\n");
> +    Error("fail10\n");
> 
>      RtlZeroMemory(&Fdo->SharedInfoInterface,
>                    sizeof (XENBUS_SHARED_INFO_INTERFACE));
> @@ -2341,8 +2341,8 @@ fail8:
> 
>  fail7:
>      Error("fail7\n");
> -	RtlFreeUnicodeString(&Fdo->InterfaceName);
> -	RtlZeroMemory(&Fdo->InterfaceName,sizeof(UNICODE_STRING));
> +    RtlFreeUnicodeString(&Fdo->InterfaceName);
> +    RtlZeroMemory(&Fdo->InterfaceName,sizeof(UNICODE_STRING));
> 
>  fail6:
>      Error("fail6\n");
> @@ -2353,14 +2353,14 @@ fail5:
>      ThreadAlert(Fdo->DevicePowerThread);
>      ThreadJoin(Fdo->DevicePowerThread);
>      Fdo->DevicePowerThread = NULL;
> -
> +
>  fail4:
>      Error("fail4\n");
> 
>      ThreadAlert(Fdo->SystemPowerThread);
>      ThreadJoin(Fdo->SystemPowerThread);
>      Fdo->SystemPowerThread = NULL;
> -
> +
>  fail3:
>      Error("fail3\n");
> 
> @@ -2410,7 +2410,7 @@ FdoDestroy(
> 
>      RtlZeroMemory(&Fdo->Mutex, sizeof (XENIFACE_MUTEX));
> 
> -	Fdo->InterfacesAcquired = FALSE;
> +    Fdo->InterfacesAcquired = FALSE;
> 
>      RtlZeroMemory(&Fdo->StoreInterface,
>                    sizeof (XENBUS_STORE_INTERFACE));
> @@ -2421,7 +2421,7 @@ FdoDestroy(
>      RtlZeroMemory(&Fdo->SuspendInterface,
>                    sizeof (XENBUS_SUSPEND_INTERFACE));
> 
> -	ThreadAlert(Fdo->registryThread);
> +    ThreadAlert(Fdo->registryThread);
>      ThreadJoin(Fdo->registryThread);
>      Fdo->registryThread = NULL;
> 
> @@ -2440,12 +2440,12 @@ FdoDestroy(
>      Fdo->PhysicalDeviceObject = NULL;
>      Fdo->Dx = NULL;
> 
> -	RtlZeroMemory(&Fdo->SessionLock, sizeof(FAST_MUTEX));
> -	RtlZeroMemory(&Fdo->SessionHead, sizeof(LIST_ENTRY));
> -	RtlZeroMemory(&Fdo->registryWriteEvent, sizeof(KEVENT));
> +    RtlZeroMemory(&Fdo->SessionLock, sizeof(FAST_MUTEX));
> +    RtlZeroMemory(&Fdo->SessionHead, sizeof(LIST_ENTRY));
> +    RtlZeroMemory(&Fdo->registryWriteEvent, sizeof(KEVENT));
> 
> -	RtlFreeUnicodeString(&Fdo->InterfaceName);
> -	RtlZeroMemory(&Fdo->InterfaceName,sizeof(UNICODE_STRING));
> +    RtlFreeUnicodeString(&Fdo->InterfaceName);
> +    RtlZeroMemory(&Fdo->InterfaceName,sizeof(UNICODE_STRING));
> 
>      ASSERT(IsZeroMemory(Fdo, sizeof (XENIFACE_FDO)));
>      __FdoFree(Fdo);
> diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
> index 4416064..c859338 100644
> --- a/src/xeniface/fdo.h
> +++ b/src/xeniface/fdo.h
> @@ -78,13 +78,13 @@ typedef struct _XENIFACE_FDO {
> 
>      XENBUS_SUSPEND_INTERFACE        SuspendInterface;
> 
> -	XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
> +    XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
> 
>      PXENBUS_SUSPEND_CALLBACK        SuspendCallbackLate;
> 
> -	BOOLEAN
> InterfacesAcquired;
> +    BOOLEAN						    InterfacesAcquired;
> 
> -	#define MAX_SESSIONS    (65536)
> +    #define MAX_SESSIONS    (65536)
> 
>      int							    WmiReady;
> 
> @@ -92,13 +92,13 @@ typedef struct _XENIFACE_FDO {
>      FAST_MUTEX					    SessionLock;
>      LIST_ENTRY					    SessionHead;
> 
> -	PXENIFACE_THREAD			    registryThread;
> -	KEVENT
> registryWriteEvent;
> +    PXENIFACE_THREAD			    registryThread;
> +    KEVENT						    registryWriteEvent;
> 
> 
> -	UNICODE_STRING
> SuggestedInstanceName;
> +    UNICODE_STRING				    SuggestedInstanceName;
> 
> -	UNICODE_STRING				    InterfaceName;
> +    UNICODE_STRING				    InterfaceName;
> 
>  } XENIFACE_FDO, *PXENIFACE_FDO;
> 
> diff --git a/src/xeniface/ioctls.c b/src/xeniface/ioctls.c
> index 3bef9ea..ead7f9b 100644
> --- a/src/xeniface/ioctls.c
> +++ b/src/xeniface/ioctls.c
> @@ -325,9 +325,9 @@ XenIFaceIoctl(
> 
>  done:
> 
> -	Irp->IoStatus.Status = status;
> +    Irp->IoStatus.Status = status;
> 
> -	IoCompleteRequest(Irp, IO_NO_INCREMENT);
> +    IoCompleteRequest(Irp, IO_NO_INCREMENT);
> 
>      return status;
>  }
> diff --git a/src/xeniface/log.h b/src/xeniface/log.h
> index 375a61f..5524f05 100644
> --- a/src/xeniface/log.h
> +++ b/src/xeniface/log.h
> @@ -142,11 +142,11 @@ __Info(
> 
> 
>  #define XenIfaceDebugPrint(LEVEL, ...) \
> -	__XenIfaceDebugPrint(__MODULE__ "|" __FUNCTION__ ": ",LEVEL,
> __VA_ARGS__)
> +    __XenIfaceDebugPrint(__MODULE__ "|" __FUNCTION__ ": ",LEVEL,
> __VA_ARGS__)
> 
>  static __inline VOID
>  __XenIfaceDebugPrint    (
> -	__in const CHAR *Prefix,
> +    __in const CHAR *Prefix,
>      __in ULONG   DebugPrintLevel,
>      __in PCCHAR  DebugMessage,
>      ...
> diff --git a/src/xeniface/thread.c b/src/xeniface/thread.c
> index 51967ed..f008834 100644
> --- a/src/xeniface/thread.c
> +++ b/src/xeniface/thread.c
> @@ -129,7 +129,7 @@ ThreadCreate(
> 
>      (*Thread) = __ThreadAllocate(sizeof (XENIFACE_THREAD));
> 
> -	Warning("Create thread %p %p\n", Function, Thread);
> +    Warning("Create thread %p %p\n", Function, Thread);
> 
>      status = STATUS_NO_MEMORY;
>      if (*Thread == NULL)
> diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
> index 1bdb834..82592e3 100644
> --- a/src/xeniface/wmi.c
> +++ b/src/xeniface/wmi.c
> @@ -1,31 +1,31 @@
>  /* Copyright (c) Citrix Systems Inc.
>   * All rights reserved.
>   *
> - * Redistribution and use in source and binary forms,
> - * with or without modification, are permitted provided
> + * 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
> + * *   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
> + * *   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
> + * 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.
>   */
> 
> @@ -47,7 +47,7 @@
>  #include <version.h>
> 
>  __drv_raisesIRQL(APC_LEVEL)
> -__drv_savesIRQLGlobal(OldIrql, fdoData->SessionLock)
> +__drv_savesIRQLGlobal(OldIrql, fdoData->SessionLock)
>  void LockSessions(
>          XENIFACE_FDO* fdoData)
>  {
> @@ -93,7 +93,7 @@ NTSTATUS GetAnsiString(ANSI_STRING *ansi, USHORT
> maxlength, LPWSTR location) {
> 
>  // Rather inconveniently, xenstore needs UTF8 data, WMI works in UTF16
>  // and windows doesn't provide conversion functions in any version
> -// prior to Windows 7.
> +// prior to Windows 7.
> 
>  USHORT Utf32FromUtf16(ULONG *utf32, const WCHAR* utf16) {
>      ULONG w;
> @@ -132,22 +132,22 @@ USHORT Utf32FromUtf8(ULONG *utf32, const
> CHAR *utf8) {
>      else if ((utf8[0] & 0xE0) == 0xC0) {
>          y = utf8[0] & 0x1F;
>          x = utf8[1] & 0x3F;
> -        *utf32 = (y<<6) | x;
> +        *utf32 = (y<<6) | x;
>          return 2;
>      }
>      else if ((utf8[0] & 0xF0) == 0xE0) {
>          z = utf8[0] & 0x0F;
>          y = utf8[1] & 0x3F;
>          x = utf8[2] & 0x3F;
> -       *utf32 = (z <<12) | (y<<6) | x;
> +       *utf32 = (z <<12) | (y<<6) | x;
>         return 3;
> -    }
> +    }
>      else {
>          ua = utf8[0] & 0x7;
>          ub = (utf8[1] & 0x30) >> 4;
>          u = (ua << 2) | ub;
>          z = utf8[1] & 0x0f;
> -        y = utf8[2] & 0x3f;
> +        y = utf8[2] & 0x3f;
>          x = utf8[3] & 0x3f;
>          *utf32 = (u<<16) | (z <<12) | (y <<6) | x;
>          return 4;
> @@ -277,7 +277,7 @@ NTSTATUS GetUTF8String(UTF8_STRING** utf8,
> USHORT bufsize, LPWSTR ustring)
> 
>      (*utf8)->Length = bytecount;
>      (*utf8)->Buffer[bytecount]=0;
> -
> +
>      bytecount = 0;
>      i=0;
>      while (i < bufsize/sizeof(WCHAR)) {
> @@ -305,7 +305,7 @@ void GetCountedUnicodeString(UNICODE_STRING
> *unicode, UCHAR *location)
>      USHORT bufsize = *(USHORT*)location;
>      LPWSTR ustring = (LPWSTR)(location+sizeof(USHORT));
>      GetUnicodeString(unicode, bufsize, ustring);
> -}
> +}
> 
>  NTSTATUS GetCountedAnsiString(ANSI_STRING *ansi, UCHAR *location)
>  {
> @@ -332,7 +332,7 @@ typedef enum {
>      WMI_STRINGOFFSET
>  } WMI_TYPE;
> 
> -int AccessWmiBuffer(PUCHAR Buffer, int readbuffer, ULONG *
> RequiredSize,
> +int AccessWmiBuffer(PUCHAR Buffer, int readbuffer, ULONG *
> RequiredSize,
>                      size_t BufferSize, ...) {
>      va_list vl;
>      ULONG_PTR offset;
> @@ -405,7 +405,7 @@ int AccessWmiBuffer(PUCHAR Buffer, int readbuffer,
> ULONG * RequiredSize,
>                          UCHAR *bufferpos = Buffer + inpos;
>                          ULONG insize = va_arg(vl, ULONG);
>                          UCHAR **writebuf = va_arg(vl, UCHAR**);
> -                        *writebuf = NULL;
> +                        *writebuf = NULL;
>                          if (bufferpos+ insize > endbuffer) {;
>                              overflow = TRUE;
>                          }
> @@ -460,12 +460,12 @@ int AccessWmiBuffer(PUCHAR Buffer, int
> readbuffer, ULONG * RequiredSize,
>                          LPWSTR *val;
>                          offset = (2-((ULONG_PTR)position%2))%2;
>                          position += offset;
> -                        if (position + sizeof(WCHAR)*25 > endbuffer)
> +                        if (position + sizeof(WCHAR)*25 > endbuffer)
>                              overflow = TRUE;
> -                        val = va_arg(vl, LPWSTR*);
> -                        *val = NULL;
> -                        if (!overflow)
> -                            *val = (LPWSTR )position;
> +                        val = va_arg(vl, LPWSTR*);
> +                        *val = NULL;
> +                        if (!overflow)
> +                            *val = (LPWSTR )position;
>                          position += sizeof(WCHAR)*25;
>                      }
>                      break;
> @@ -477,7 +477,7 @@ int AccessWmiBuffer(PUCHAR Buffer, int readbuffer,
> ULONG * RequiredSize,
>              break;
>          }
>      }
> -    *RequiredSize = (ULONG)(position - Buffer);
> +    *RequiredSize = (ULONG)(position - Buffer);
>      va_end(vl);
>      if (overflow)
>          return FALSE;
> @@ -485,9 +485,9 @@ int AccessWmiBuffer(PUCHAR Buffer, int readbuffer,
> ULONG * RequiredSize,
>  }
> 
> 
> -NTSTATUS
> +NTSTATUS
>  WriteCountedUnicodeString(
> -    const UNICODE_STRING *ustr,
> +    const UNICODE_STRING *ustr,
>      UCHAR *location
>      )
>  {
> @@ -516,7 +516,7 @@ WriteCountedUTF8String(const char * string, UCHAR
> *location) {
>      }
>      buffer[bytesize/sizeof(WCHAR)] = 0;
> 
> -    i=0;
> +    i=0;
>      b=0;
>      while (string[i] != 0) {
>          i += Utf32FromUtf8(&utf32, &string[i]);
> @@ -533,7 +533,7 @@ NTSTATUS
>  WriteCountedString(
>      const char * string,
>      UCHAR * location
> -    )
> +    )
>  {
>      ANSI_STRING ansi;
>      UNICODE_STRING unicode;
> @@ -542,7 +542,7 @@ WriteCountedString(
>      RtlInitAnsiString(&ansi, string);
> 
>      status = RtlAnsiStringToUnicodeString(&unicode, &ansi, TRUE);
> -    if (NT_SUCCESS(status)) {
> +    if (NT_SUCCESS(status)) {
> 
>          status = WriteCountedUnicodeString(&unicode, location);
>          RtlFreeUnicodeString(&unicode);
> @@ -583,7 +583,7 @@ CloneUnicodeString(UNICODE_STRING *dest,
> UNICODE_STRING *src) {
>      return status;
>  }
> 
> -NTSTATUS
> +NTSTATUS
>  StringToUnicode(UNICODE_STRING *ustr, const char * str) {
>      ANSI_STRING ansi;
>      RtlInitAnsiString(&ansi, str);
> @@ -632,7 +632,7 @@ GetInstanceName(UNICODE_STRING *dest,
> XENIFACE_FDO* FdoData, const char *string)
>          return status;
>      }
>      destsz = FdoData->SuggestedInstanceName.Length +
> -                sizeof(WCHAR) +
> +                sizeof(WCHAR) +
>                  unicode.Length;
> 
>      AllocUnicodeStringBuffer(dest, (USHORT)destsz);
> @@ -640,8 +640,8 @@ GetInstanceName(UNICODE_STRING *dest,
> XENIFACE_FDO* FdoData, const char *string)
>          RtlFreeUnicodeString(&unicode);
>          return STATUS_INSUFFICIENT_RESOURCES;
>      }
> -    status = RtlUnicodeStringPrintf(dest, L"%s\\%s",
> -                FdoData->SuggestedInstanceName.Buffer,
> +    status = RtlUnicodeStringPrintf(dest, L"%s\\%s",
> +                FdoData->SuggestedInstanceName.Buffer,
>                  unicode.Buffer);
>      if (!NT_SUCCESS(status)) {
>          RtlFreeUnicodeString(&unicode);
> @@ -701,14 +701,14 @@ void UnicodeShallowCopy(UNICODE_STRING
> *dest, UNICODE_STRING *src) {
>      dest->Buffer = src->Buffer;
>      dest->Length = src->Length;
>      dest->MaximumLength = src->MaximumLength;
> -}
> +}
> 
> 
>  XenStoreSession*
> -FindSessionLocked(XENIFACE_FDO *fdoData,
> +FindSessionLocked(XENIFACE_FDO *fdoData,
>                                  LONG id) {
>      XenStoreSession *session;
> -
> +
>      session = (XenStoreSession *)fdoData->SessionHead.Flink;
>      while (session != (XenStoreSession *)&fdoData->SessionHead){
>          if (session->id == id) {
> @@ -735,7 +735,7 @@ XenStoreWatch *
>  SessionFindWatchLocked(XenStoreSession *session,
>                          UNICODE_STRING *path) {
>      XenStoreWatch * watch;
> -
> +
>      XenIfaceDebugPrint(TRACE,"Wait for session watch lock\n");
>      ExAcquireFastMutex(&session->WatchMapLock);
>      XenIfaceDebugPrint(TRACE,"got session watch lock\n");
> @@ -751,11 +751,11 @@ SessionFindWatchLocked(XenStoreSession
> *session,
>      XenIfaceDebugPrint(WARNING,"couldn't find watch\n");
>      return NULL;
> 
> -}
> +}
> 
>  void FireSuspendEvent(PXENIFACE_FDO fdoData) {
> -	XenIfaceDebugPrint(ERROR,"Ready to unsuspend Event\n");
> -	KeSetEvent(&fdoData->registryWriteEvent, IO_NO_INCREMENT,
> FALSE);
> +    XenIfaceDebugPrint(ERROR,"Ready to unsuspend Event\n");
> +    KeSetEvent(&fdoData->registryWriteEvent, IO_NO_INCREMENT, FALSE);
>      if (fdoData->WmiReady) {
>          XenIfaceDebugPrint(TRACE,"Fire Suspend Event\n");
>          WmiFireEvent(fdoData->Dx->DeviceObject,
> @@ -764,7 +764,7 @@ void FireSuspendEvent(PXENIFACE_FDO fdoData) {
>                       0,
>                       NULL);
>      }
> -}
> +}
>  void FireWatch(XenStoreWatch* watch) {
>      UCHAR * eventdata;
>      ULONG RequiredSize;
> @@ -774,7 +774,7 @@ void FireWatch(XenStoreWatch* watch) {
>              WMI_STRING, GetCountedUnicodeStringSize(&watch->path),
>                  &sesbuf,
>              WMI_DONE);
> -
> +
>      eventdata = ExAllocatePoolWithTag(NonPagedPool, RequiredSize,'XIEV');
>      if (eventdata!=NULL) {
>          AccessWmiBuffer(eventdata, FALSE, &RequiredSize, RequiredSize,
> @@ -782,17 +782,17 @@ void FireWatch(XenStoreWatch* watch) {
>                  &sesbuf,
>              WMI_DONE);
> 
> -        WriteCountedUnicodeString(&watch->path, sesbuf);
> +        WriteCountedUnicodeString(&watch->path, sesbuf);
>      }
> 
>      if (eventdata !=NULL) {
>          XenIfaceDebugPrint(TRACE,"Fire Watch Event\n");
> -        WmiFireEvent(watch->fdoData->Dx->DeviceObject,
> +        WmiFireEvent(watch->fdoData->Dx->DeviceObject,
>                       (LPGUID)&OBJECT_GUID(XenStoreWatchEvent),
>                       0,
> -                     RequiredSize,
> +                     RequiredSize,
>                       eventdata);
> -    }
> +    }
>  }
> 
> 
> @@ -800,7 +800,7 @@ KSTART_ROUTINE WatchCallbackThread;
>  NTSTATUS
>  StartWatch(XENIFACE_FDO *fdoData, XenStoreWatch *watch)
>  {
> -    char *tmppath;
> +    char *tmppath;
>      ANSI_STRING ansipath;
>      NTSTATUS status;
>      status = RtlUnicodeStringToAnsiString(&ansipath, &watch->path, TRUE);
> @@ -814,7 +814,7 @@ StartWatch(XENIFACE_FDO *fdoData,
> XenStoreWatch *watch)
>      }
>      RtlZeroMemory(tmppath, ansipath.Length+1);
>      RtlCopyBytes(tmppath,ansipath.Buffer, ansipath.Length);
> -
> +
>      status = XENBUS_STORE(WatchAdd, &fdoData->StoreInterface, NULL,
> tmppath, &watch->watchevent, &watch->watchhandle );
>      if (!NT_SUCCESS(status)) {
>          ExFreePool(tmppath);
> @@ -848,7 +848,7 @@ VOID WatchCallbackThread(__in PVOID StartContext)
> {
>                  watch = (XenStoreWatch *)watch->listentry.Flink;
>              }
>              session->mapchanged = FALSE;
> -            session->watchevents[i] = &session->SessionChangedEvent;
> +            session->watchevents[i] = &session->SessionChangedEvent;
>          }
>          ExReleaseFastMutex(&session->WatchMapLock);
>          XenIfaceDebugPrint(TRACE,"Wait for new event\n");
> @@ -875,7 +875,7 @@ VOID WatchCallbackThread(__in PVOID StartContext)
> {
>                      if (watch->suspendcount !=XENBUS_SUSPEND(GetCount,
> &watch->fdoData->SuspendInterface)) {
>                          watch->suspendcount = XENBUS_SUSPEND(GetCount, &watch-
> >fdoData->SuspendInterface);
> 
> XenIfaceDebugPrint(WARNING,"SessionSuspendResumeUnwatch %p\n",
> watch->watchhandle);
> -
> +
>                          XENBUS_STORE(WatchRemove, &watch->fdoData-
> >StoreInterface, watch->watchhandle);
>                          StartWatch(watch->fdoData, watch);
>                      }
> @@ -886,13 +886,13 @@ VOID WatchCallbackThread(__in PVOID
> StartContext) {
>          }
>          else if ( status == STATUS_WAIT_0 + i) {
>              ExAcquireFastMutex(&session->WatchMapLock);
> -            KeClearEvent(&session->SessionChangedEvent);
> +            KeClearEvent(&session->SessionChangedEvent);
>              if (session->closing==TRUE) {
>                  XenIfaceDebugPrint(TRACE,"Trying to end session thread\n");
>                  if (session->watchcount != 0) {
>                      XenStoreWatch *watch;
> -                    for (watch = (XenStoreWatch *)session->watches.Flink;
> -                        watch!=(XenStoreWatch *)&session->watches;
> +                    for (watch = (XenStoreWatch *)session->watches.Flink;
> +                        watch!=(XenStoreWatch *)&session->watches;
>                          watch=(XenStoreWatch *)session->watches.Flink) {
>                              FreeUnicodeStringBuffer(&watch->path);
>                              RemoveEntryList((LIST_ENTRY*)watch);
> @@ -907,7 +907,7 @@ VOID WatchCallbackThread(__in PVOID StartContext)
> {
>                  //ExReleaseFastMutex(&session->WatchMapLock);
>              }
>              else {
> -
> +
>                  ExReleaseFastMutex(&session->WatchMapLock);
>              }
>          }
> @@ -916,12 +916,12 @@ VOID WatchCallbackThread(__in PVOID
> StartContext) {
>  }
> 
>  NTSTATUS
> -SessionAddWatchLocked(XenStoreSession *session,
> -                        XENIFACE_FDO* fdoData,
> +SessionAddWatchLocked(XenStoreSession *session,
> +                        XENIFACE_FDO* fdoData,
>                          UNICODE_STRING *path,
>                          XenStoreWatch **watch) {
> 
> -
> +
>      NTSTATUS status;
>      XenStoreWatch *pwatch;
> 
> @@ -934,18 +934,18 @@ SessionAddWatchLocked(XenStoreSession
> *session,
>          return STATUS_INSUFFICIENT_RESOURCES;
>      }
> 
> -    (*watch)->finished = FALSE;
> +    (*watch)->finished = FALSE;
>      (*watch)->fdoData = fdoData;
>      UnicodeShallowCopy(&(*watch)->path, path);
> 
> 
> -
> +
>      (*watch)->suspendcount = XENBUS_SUSPEND(GetCount, &fdoData-
> >SuspendInterface);
> -
> +
> 
>      KeInitializeEvent(&(*watch)->watchevent, NotificationEvent, FALSE);
> 
> -
> +
>      status = StartWatch(fdoData, *watch);
>      if ((!NT_SUCCESS(status)) || ((*watch)->watchhandle == NULL)) {
>          ExFreePool(*watch);
> @@ -1001,8 +1001,8 @@ void
> SessionRemoveWatchesLocked(XenStoreSession *session) {
> 
>      XenIfaceDebugPrint(TRACE, "wait remove mutex\n");
>      ExAcquireFastMutex(&session->WatchMapLock);
> -    for (watch = (XenStoreWatch *)session->watches.Flink;
> -         watch!=(XenStoreWatch *)&session->watches;
> +    for (watch = (XenStoreWatch *)session->watches.Flink;
> +         watch!=(XenStoreWatch *)&session->watches;
>           watch=(XenStoreWatch *)watch->listentry.Flink) {
> 
>          XenIfaceDebugPrint(TRACE, "try remove %p\n",session->watches.Flink
> );
> @@ -1017,7 +1017,7 @@ XenStoreSession*
>  FindSessionByInstanceLocked(XENIFACE_FDO *fdoData,
>                              UNICODE_STRING *instance) {
>      XenStoreSession *session;
> -
> +
>      session = (XenStoreSession *)fdoData->SessionHead.Flink;
>      while (session != (XenStoreSession *)&fdoData->SessionHead) {
>          if (CompareUnicodeStrings(instance, &session->instancename)==0) {
> @@ -1059,7 +1059,7 @@ PSTR Xmasprintf(const char *fmt, ...) {
>          out =  ExAllocatePoolWithTag(NonPagedPool, basesize, 'XenP');
>          if (out == NULL)
>              return NULL;
> -
> +
>          status = RtlStringCbVPrintfExA(out, basesize, NULL, &unused,0, fmt,
> argv);
> 
>          ExFreePool(out);
> @@ -1075,9 +1075,9 @@ PSTR Xmasprintf(const char *fmt, ...) {
>      return out;
>  }
> 
> -NTSTATUS
> -CreateNewSession(XENIFACE_FDO *fdoData,
> -                    UNICODE_STRING *stringid,
> +NTSTATUS
> +CreateNewSession(XENIFACE_FDO *fdoData,
> +                    UNICODE_STRING *stringid,
>                      ULONG *sessionid) {
>      XenStoreSession *session;
>      PSTR iname;
> @@ -1093,7 +1093,7 @@ CreateNewSession(XENIFACE_FDO *fdoData,
>      if (session == NULL)
>          return STATUS_INSUFFICIENT_RESOURCES;
>      RtlZeroMemory(session, sizeof(XenStoreSession));
> -
> +
>      ExInitializeFastMutex(&session->WatchMapLock);
>      session->mapchanged = TRUE;
>      status = RtlUnicodeStringToAnsiString(&ansi, stringid, TRUE);
> @@ -1109,7 +1109,7 @@ CreateNewSession(XENIFACE_FDO *fdoData,
>          status = STATUS_NO_MEMORY;
>          if (iname == NULL) {
>              UnlockSessions(fdoData);
> -            RtlFreeAnsiString(&ansi);
> +            RtlFreeAnsiString(&ansi);
>              ExFreePool(session);
>              return status;
>          }
> @@ -1118,18 +1118,18 @@ CreateNewSession(XENIFACE_FDO *fdoData,
>          ExFreePool(iname);
>          if (!NT_SUCCESS(status)) {
>              UnlockSessions(fdoData);
> -            RtlFreeAnsiString(&ansi);
> +            RtlFreeAnsiString(&ansi);
>              ExFreePool(session);
>              return status;
>          }
>          count++;
> -
> +
>      } while (FindSessionByInstanceLocked(fdoData, &session->instancename)
> != NULL);
> 
> -
> -
> -
> -
> +
> +
> +
> +
>      if (fdoData->SessionHead.Flink==&fdoData->SessionHead) {
>          session->id=0;
>      }
> @@ -1142,12 +1142,12 @@ CreateNewSession(XENIFACE_FDO *fdoData,
>      InsertHeadList((PLIST_ENTRY)&fdoData->SessionHead,
> (PLIST_ENTRY)session);
>      *sessionid = session->id;
>      UnicodeShallowCopy(&session->stringid, stringid);
> -
> +
>      InitializeListHead((PLIST_ENTRY)&session->watches);
> -
> +
>      KeInitializeEvent(&session->SessionChangedEvent, NotificationEvent,
> FALSE);
>      session->closing = FALSE;
> -    if (fdoData->InterfacesAcquired){
> +    if (fdoData->InterfacesAcquired){
>          XenIfaceDebugPrint(TRACE,"Add session unsuspended\n");
>          session->suspended=FALSE;
>      }
> @@ -1161,7 +1161,7 @@ CreateNewSession(XENIFACE_FDO *fdoData,
> 
>      status = PsCreateSystemThread(&hthread, THREAD_ALL_ACCESS, &oa,
> NULL, NULL, WatchCallbackThread, session);
>      if (!NT_SUCCESS(status)) {
> -            RtlFreeAnsiString(&ansi);
> +            RtlFreeAnsiString(&ansi);
>              ExFreePool(session);
>              return status;
>      }
> @@ -1170,17 +1170,17 @@ CreateNewSession(XENIFACE_FDO *fdoData,
>      return STATUS_SUCCESS;
>  }
> 
> -void
> -RemoveSessionLocked(XENIFACE_FDO *fdoData,
> +void
> +RemoveSessionLocked(XENIFACE_FDO *fdoData,
>                      XenStoreSession *session) {
> -
> +
>      XenIfaceDebugPrint(TRACE,"RemoveSessionLocked\n");
>      RemoveEntryList((LIST_ENTRY*)session);
>      fdoData->Sessions--;
>      SessionRemoveWatchesLocked(session);
>      if (session->transaction != NULL) {
> -        XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface, session-
> >transaction, FALSE);
> -    }
> +        XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface, session-
> >transaction, FALSE);
> +    }
>      session->closing = TRUE;
>      KeSetEvent(&session->SessionChangedEvent, IO_NO_INCREMENT,
> FALSE);
>      KeWaitForSingleObject(session->WatchThread, Executive, KernelMode,
> FALSE, NULL);
> @@ -1191,7 +1191,7 @@ RemoveSessionLocked(XENIFACE_FDO *fdoData,
>  }
> 
>  void
> -RemoveSession(XENIFACE_FDO *fdoData,
> +RemoveSession(XENIFACE_FDO *fdoData,
>                      XenStoreSession *session) {
>      XenIfaceDebugPrint(TRACE,"RemoveSession\n");
>      LockSessions(fdoData);
> @@ -1200,15 +1200,15 @@ RemoveSession(XENIFACE_FDO *fdoData,
>  }
> 
>  void SessionsRemoveAll(XENIFACE_FDO *fdoData) {
> -	XenIfaceDebugPrint(TRACE,"lock");
> +    XenIfaceDebugPrint(TRACE,"lock");
>      LockSessions(fdoData);
> -	XenIfaceDebugPrint(TRACE,"in lock");
> +    XenIfaceDebugPrint(TRACE,"in lock");
>      while (fdoData->SessionHead.Flink != &fdoData->SessionHead) {
>          RemoveSessionLocked(fdoData, (XenStoreSession *)fdoData-
> >SessionHead.Flink);
>      }
> -	XenIfaceDebugPrint(TRACE,"unlock");
> +    XenIfaceDebugPrint(TRACE,"unlock");
>      UnlockSessions(fdoData);
> -	XenIfaceDebugPrint(TRACE,"unlocked");
> +    XenIfaceDebugPrint(TRACE,"unlocked");
>  }
> 
> 
> @@ -1237,15 +1237,15 @@ void
> SessionUnwatchWatchesLocked(XenStoreSession *session)
>      ExReleaseFastMutex(&session->WatchMapLock);
>  }
> 
> -void SuspendSessionLocked(XENIFACE_FDO *fdoData,
> +void SuspendSessionLocked(XENIFACE_FDO *fdoData,
>                           XenStoreSession *session) {
>      SessionUnwatchWatchesLocked(session);
>      if (session->transaction != NULL) {
>          XenIfaceDebugPrint(TRACE, "End transaction %p\n",session-
> >transaction);
> -
> -        XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface, session-
> >transaction, FALSE);
> +
> +        XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface, session-
> >transaction, FALSE);
>          session->transaction = NULL;
> -    }
> +    }
>  }
> 
> 
> @@ -1288,7 +1288,7 @@ void
> SessionRenewWatchesLocked(XenStoreSession *session) {
>      ExReleaseFastMutex(&session->WatchMapLock);
>  }
> 
> -void ResumeSessionLocked(XENIFACE_FDO *fdoData,
> +void ResumeSessionLocked(XENIFACE_FDO *fdoData,
>                           XenStoreSession *session) {
>      SessionRenewWatchesLocked(session);
>  }
> @@ -1310,40 +1310,40 @@ void SessionsResumeAll(XENIFACE_FDO
> *fdoData) {
>  NTSTATUS
>  WmiInit(
>          PXENIFACE_FDO FdoData
> -    )
> +    )
>  {
>      NTSTATUS status = STATUS_SUCCESS;
>      XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__);
>      XenIfaceDebugPrint(INFO,"DRV: XenIface WMI Initialisation\n");
> -
> -
> 
> 
> -	IoWMISuggestInstanceName(FdoData->PhysicalDeviceObject, NULL,
> FALSE,
> -                                &FdoData->SuggestedInstanceName);
> +
> +
> +    IoWMISuggestInstanceName(FdoData->PhysicalDeviceObject, NULL,
> FALSE,
> +                             &FdoData->SuggestedInstanceName);
>      InitializeListHead(&FdoData->SessionHead);
>      FdoData->Sessions = 0;
>      ExInitializeFastMutex(&FdoData->SessionLock);
> -
> +
>      status = IoWMIRegistrationControl(FdoData->Dx->DeviceObject,
> WMIREG_ACTION_REGISTER);
>      FdoData->WmiReady = 1;
>      return status;
>  }
> 
>  NTSTATUS
> -WmiFinalise(
> +WmiFinalise(
>      PXENIFACE_FDO FdoData
> -    )
> +    )
>  {
>      NTSTATUS status = STATUS_SUCCESS;
> -    if (FdoData->WmiReady) {
> +    if (FdoData->WmiReady) {
>          XenIfaceDebugPrint(INFO,"DRV: XenIface WMI Finalisation\n");
>          XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__);
>          SessionsRemoveAll(FdoData);
> 
>          status =IoWMIRegistrationControl(FdoData->Dx->DeviceObject,
> WMIREG_ACTION_DEREGISTER);
> -		RtlFreeUnicodeString(&FdoData->SuggestedInstanceName);
> -		RtlZeroBytes(&FdoData->SuggestedInstanceName,
> sizeof(UNICODE_STRING));
> +        RtlFreeUnicodeString(&FdoData->SuggestedInstanceName);
> +        RtlZeroBytes(&FdoData->SuggestedInstanceName,
> sizeof(UNICODE_STRING));
> 
>          FdoData->WmiReady = 0;
>      }
> @@ -1468,7 +1468,7 @@ SessionExecuteRemoveValue(UCHAR *InBuffer,
>      }
> 
>      status = GetCountedUTF8String(&pathname, upathname);
> -    if (!NT_SUCCESS(status))
> +    if (!NT_SUCCESS(status))
>          return status;
> 
>      status = STATUS_INSUFFICIENT_RESOURCES;
> @@ -1478,7 +1478,7 @@ SessionExecuteRemoveValue(UCHAR *InBuffer,
>      }
>      RtlZeroMemory(tmpbuffer, pathname->Length+1);
>      RtlCopyBytes(tmpbuffer,pathname->Buffer, pathname->Length);
> -
> +
>      status = STATUS_WMI_INSTANCE_NOT_FOUND;
>      if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
>              NULL){
> @@ -1524,7 +1524,7 @@ SessionExecuteRemoveWatch(UCHAR *InBuffer,
>      }
> 
> 
> -    XenIfaceDebugPrint(TRACE, "Find Watch\n");
> +    XenIfaceDebugPrint(TRACE, "Find Watch\n");
> 
>      watch = SessionFindWatchLocked(session, &unicpath_notbacked);
> 
> @@ -1533,7 +1533,7 @@ SessionExecuteRemoveWatch(UCHAR *InBuffer,
>          SessionRemoveWatchLocked(session, watch);
>      }
>      else {
> -        XenIfaceDebugPrint(WARNING, "No Watch\n");
> +        XenIfaceDebugPrint(WARNING, "No Watch\n");
>      }
>  #pragma prefast (suppress:26110)
>      ExReleaseFastMutex(&session->WatchMapLock);
> @@ -1541,7 +1541,7 @@ SessionExecuteRemoveWatch(UCHAR *InBuffer,
> 
>      *byteswritten=0;
> 
> -
> +
> 
>      return STATUS_SUCCESS;
> 
> @@ -1586,11 +1586,11 @@ SessionExecuteSetWatch(UCHAR *InBuffer,
>          FreeUnicodeStringBuffer(&unicpath_backed);
>          return status;
>      }
> -
> +
> 
>      *byteswritten=0;
> 
> -
> +
> 
>      return STATUS_SUCCESS;
> 
> @@ -1604,7 +1604,7 @@ SessionExecuteEndSession(UCHAR *InBuffer,
>                              UNICODE_STRING *instance,
>                              OUT ULONG_PTR *byteswritten) {
>      XenStoreSession *session;
> -    XenIfaceDebugPrint(TRACE, "ExecuteEndSession\n");
> +    XenIfaceDebugPrint(TRACE, "ExecuteEndSession\n");
>      *byteswritten = 0;
>      if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
>              NULL){
> @@ -1633,7 +1633,7 @@ SessionExecuteSetValue(UCHAR *InBuffer,
>      char *tmppath;
>      char* tmpvalue;
> 
> -    XenIfaceDebugPrint(TRACE, " Try to write\n");
> +    XenIfaceDebugPrint(TRACE, " Try to write\n");
>      if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
>                              WMI_STRING, &upathname,
>                              WMI_STRING, &uvalue,
> @@ -1643,10 +1643,10 @@ SessionExecuteSetValue(UCHAR *InBuffer,
>          return STATUS_INSUFFICIENT_RESOURCES;
>      }
>      status = GetCountedUTF8String(&pathname, upathname);
> -    if (!NT_SUCCESS(status))
> +    if (!NT_SUCCESS(status))
>          return status;
> 
> -	status = STATUS_INSUFFICIENT_RESOURCES;
> +    status = STATUS_INSUFFICIENT_RESOURCES;
>      tmppath = ExAllocatePoolWithTag(NonPagedPool, pathname->Length+1,
> 'XenP');
>      if (!tmppath) {
>          goto fail1;
> @@ -1654,7 +1654,7 @@ SessionExecuteSetValue(UCHAR *InBuffer,
>      RtlZeroMemory(tmppath, pathname->Length+1);
>      RtlCopyBytes(tmppath,pathname->Buffer, pathname->Length);
>      status = GetCountedUTF8String(&value, uvalue);
> -    if (!NT_SUCCESS(status)){
> +    if (!NT_SUCCESS(status)){
>          goto fail2;
>      }
>      status = STATUS_INSUFFICIENT_RESOURCES;
> @@ -1664,14 +1664,14 @@ SessionExecuteSetValue(UCHAR *InBuffer,
>      }
>      RtlZeroMemory(tmpvalue, value->Length+1);
>      RtlCopyBytes(tmpvalue,value->Buffer, value->Length);
> -
> +
>      status = STATUS_WMI_INSTANCE_NOT_FOUND;
>      if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
>              NULL){
>          goto fail4;
>      }
>      status = XENBUS_STORE(Printf, &fdoData->StoreInterface, session-
> >transaction, NULL, tmppath, tmpvalue);
> -    XenIfaceDebugPrint(TRACE, " Write %s to %s (%p)\n", tmpvalue,
> tmppath, status);
> +    XenIfaceDebugPrint(TRACE, " Write %s to %s (%p)\n", tmpvalue,
> tmppath, status);
>      UnlockSessions(fdoData);
> 
>  fail4:
> @@ -1685,10 +1685,10 @@ fail2:
> 
>  fail1:
>      FreeUTF8String(pathname);
> -
> +
>      *byteswritten = 0;
>      return status;
> -
> +
>  }
>  NTSTATUS
>  SessionExecuteGetFirstChild(UCHAR *InBuffer,
> @@ -1708,16 +1708,16 @@ SessionExecuteGetFirstChild(UCHAR *InBuffer,
>      XenStoreSession *session;
>      char *tmppath;
>      if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
> -                            WMI_STRING, &uloc,
> +                            WMI_STRING, &uloc,
>                              WMI_DONE)){
>          return  STATUS_INVALID_DEVICE_REQUEST;
>      }
>      if (!fdoData->InterfacesAcquired) {
>          return STATUS_INSUFFICIENT_RESOURCES;
>      }
> -
> +
>      status = GetCountedUTF8String(&path, uloc);
> -
> +
>      if (!NT_SUCCESS(status)) {
>          return status;
>      }
> @@ -1737,7 +1737,7 @@ SessionExecuteGetFirstChild(UCHAR *InBuffer,
>      }
>      status = XENBUS_STORE(Directory,&fdoData->StoreInterface, session-
> >transaction, NULL, tmppath, &listresults);
>      UnlockSessions(fdoData);
> -
> +
>      if (!NT_SUCCESS(status)) {
>          goto fail2;
>      }
> @@ -1755,14 +1755,14 @@ SessionExecuteGetFirstChild(UCHAR *InBuffer,
>      else {
>          stringarraysize+=GetCountedUtf8Size("");
>      }
> -
> +
>      status = STATUS_BUFFER_TOO_SMALL;
>      if (!AccessWmiBuffer(InBuffer, FALSE, &RequiredSize, OutBufferSize,
>                              WMI_STRING, stringarraysize, &valuepos,
>                              WMI_DONE)){
>          goto fail3;
>      }
> -
> +
>      status = STATUS_SUCCESS;
>      if ((listresults != NULL) && (listresults[0] != 0)) {
>          PSTR fullpath;
> @@ -1770,8 +1770,8 @@ SessionExecuteGetFirstChild(UCHAR *InBuffer,
>              fullpath = Xmasprintf("/%s", listresults);
>          }
>          else {
> -            fullpath = Xmasprintf("%s/%s",
> -                                    path->Buffer, listresults);
> +            fullpath = Xmasprintf("%s/%s",
> +                                    path->Buffer, listresults);
>          }
> 
>          if (fullpath == NULL) {
> @@ -1826,16 +1826,16 @@ SessionExecuteGetNextSibling(UCHAR
> *InBuffer,
>      int leafoffset;
>      char *attemptstring;
>      if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
> -                            WMI_STRING, &uloc,
> +                            WMI_STRING, &uloc,
>                              WMI_DONE)){
>          return  STATUS_INVALID_DEVICE_REQUEST;
>      }
>      if (!fdoData->InterfacesAcquired) {
>          return STATUS_INSUFFICIENT_RESOURCES;
>      }
> -
> +
>      status = GetCountedUTF8String(&path, uloc);
> -
> +
>      if (!NT_SUCCESS(status)) {
>          return status;
>      }
> @@ -1858,7 +1858,7 @@ SessionExecuteGetNextSibling(UCHAR *InBuffer,
>              NULL){
>          goto fail3;
>      }
> -
> +
>      leafoffset = 0;
>      if (path->Length>1) {
>          leafoffset = path->Length;
> @@ -1884,14 +1884,14 @@ SessionExecuteGetNextSibling(UCHAR
> *InBuffer,
> 
>      status = XENBUS_STORE(Directory,&fdoData->StoreInterface, session-
> >transaction, NULL, tmppath, &listresults);
>      UnlockSessions(fdoData);
> -
> +
>      if (!NT_SUCCESS(status)) {
>          goto fail3;
>      }
> 
>      stringarraysize = 0;
>      RtlInitAnsiString(&checkleaf, tmpleaf);
> -
> +
>      nextresult = listresults;
> 
>      while (*nextresult != 0) {
> @@ -1928,14 +1928,14 @@ SessionExecuteGetNextSibling(UCHAR
> *InBuffer,
>      else {
>          stringarraysize+=GetCountedUtf8Size("");
>      }
> -
> +
>      status = STATUS_BUFFER_TOO_SMALL;
>      if (!AccessWmiBuffer(InBuffer, FALSE, &RequiredSize, OutBufferSize,
>                              WMI_STRING, stringarraysize, &valuepos,
>                              WMI_DONE)){
>          goto fail4;
>      }
> -
> +
>      status = STATUS_SUCCESS;
>      if (attemptstring != NULL) {
>          PSTR fullpath;
> @@ -1943,8 +1943,8 @@ SessionExecuteGetNextSibling(UCHAR *InBuffer,
>              fullpath = Xmasprintf("/%s", attemptstring);
>          }
>          else {
> -            fullpath = Xmasprintf("%s/%s",
> -                                    tmppath, attemptstring);
> +            fullpath = Xmasprintf("%s/%s",
> +                                    tmppath, attemptstring);
>          }
> 
>          if (fullpath == NULL) {
> @@ -1969,7 +1969,7 @@ fail3:
>      ExFreePool(tmpleaf);
> 
>  fail2:
> -	ExFreePool(tmppath);
> +    ExFreePool(tmppath);
> 
>  fail1:
>      FreeUTF8String(path);
> @@ -1999,16 +1999,16 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
>      XenStoreSession *session;
>      char *tmppath;
>      if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
> -                            WMI_STRING, &uloc,
> +                            WMI_STRING, &uloc,
>                              WMI_DONE)){
>          return  STATUS_INVALID_DEVICE_REQUEST;
>      }
>      if (!fdoData->InterfacesAcquired) {
>          return STATUS_INSUFFICIENT_RESOURCES;
>      }
> -
> +
>      status = GetCountedUTF8String(&path, uloc);
> -
> +
>      if (!NT_SUCCESS(status)) {
>          return status;
>      }
> @@ -2028,7 +2028,7 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
>      }
>      status = XENBUS_STORE(Directory,&fdoData->StoreInterface,session-
> >transaction,NULL, tmppath, &listresults);
>      UnlockSessions(fdoData);
> -
> +
>      if (!NT_SUCCESS(status)) {
>          goto fail2;
>      }
> @@ -2046,8 +2046,8 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
>          stringarraysize+=GetCountedUtf8Size(nextresults);
>          for (;*nextresults!=0;nextresults++);
>          nextresults++;
> -    }
> -
> +    }
> +
>      status = STATUS_BUFFER_TOO_SMALL;
>      if (!AccessWmiBuffer(InBuffer, FALSE, &RequiredSize, OutBufferSize,
>                              WMI_UINT32, &noofnodes,
> @@ -2065,8 +2065,8 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
>              fullpath = Xmasprintf("/%s", nextresults);
>          }
>          else {
> -            fullpath = Xmasprintf("%s/%s",
> -                                    path->Buffer, nextresults);
> +            fullpath = Xmasprintf("%s/%s",
> +                                    path->Buffer, nextresults);
>          }
> 
>          if (fullpath == NULL) {
> @@ -2113,13 +2113,13 @@ SessionExecuteLog(UCHAR *InBuffer,
>      NTSTATUS status;
>      ANSI_STRING message;
>      if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
> -                                            WMI_STRING, &uloc,
> +                                            WMI_STRING, &uloc,
>                                              WMI_DONE))
>          return STATUS_INVALID_DEVICE_REQUEST;
> 
>      status = GetCountedAnsiString(&message, uloc);
> 
> -    if (!NT_SUCCESS(status))
> +    if (!NT_SUCCESS(status))
>          return status;
> 
>      XenIfaceDebugPrint(INFO,"USER: %s\n", message.Buffer);
> @@ -2141,7 +2141,7 @@ SessionExecuteStartTransaction(UCHAR *InBuffer,
> 
>      NTSTATUS status = STATUS_SUCCESS;
>      XenStoreSession *session;
> -
> +
>      if (!fdoData->InterfacesAcquired) {
>          status= STATUS_INSUFFICIENT_RESOURCES;
>          goto failnotinitialised;
> @@ -2158,7 +2158,7 @@ SessionExecuteStartTransaction(UCHAR *InBuffer,
>      }
> 
>      XENBUS_STORE(TransactionStart, &fdoData->StoreInterface, &session-
> >transaction);
> -
> +
> 
>  failtransactionactive:
>      UnlockSessions(fdoData);
> @@ -2180,7 +2180,7 @@ SessionExecuteCommitTransaction(UCHAR
> *InBuffer,
> 
>      NTSTATUS status = STATUS_SUCCESS;
>      XenStoreSession *session;
> -
> +
>      if (!fdoData->InterfacesAcquired) {
>          status= STATUS_INSUFFICIENT_RESOURCES;
>          goto failnotinitialised;
> @@ -2197,7 +2197,7 @@ SessionExecuteCommitTransaction(UCHAR
> *InBuffer,
>      }
> 
>      status = XENBUS_STORE(TransactionEnd,&fdoData->StoreInterface,
> session->transaction, TRUE);
> -
> +
>      session->transaction = NULL;
> 
>  failtransactionnotactive:
> @@ -2220,7 +2220,7 @@ SessionExecuteAbortTransaction(UCHAR *InBuffer,
> 
>      NTSTATUS status = STATUS_SUCCESS;
>      XenStoreSession *session;
> -
> +
>      if (!fdoData->InterfacesAcquired) {
>          status= STATUS_INSUFFICIENT_RESOURCES;
>          goto failnotinitialised;
> @@ -2237,7 +2237,7 @@ SessionExecuteAbortTransaction(UCHAR *InBuffer,
>      }
> 
>      status = XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface,
> session->transaction, FALSE);
> -
> +
>      session->transaction = NULL;
> 
>  failtransactionnotactive:
> @@ -2269,18 +2269,18 @@ SessionExecuteGetValue(UCHAR *InBuffer,
> 
>      *byteswritten = 0;
>      if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
> -                                            WMI_STRING, &uloc,
> +                                            WMI_STRING, &uloc,
>                                              WMI_DONE))
>          return STATUS_INVALID_DEVICE_REQUEST;
>      if (!fdoData->InterfacesAcquired) {
>          return STATUS_INSUFFICIENT_RESOURCES;
>      }
> -
> +
>      status = GetCountedUTF8String(&path, uloc);
> -
> -    if (!NT_SUCCESS(status))
> +
> +    if (!NT_SUCCESS(status))
>          return status;;
> -
> +
>      status = STATUS_INSUFFICIENT_RESOURCES;
>      tmppath = ExAllocatePoolWithTag(NonPagedPool,path-
> >Length+1,'XenP');
>      if (!tmppath) {
> @@ -2288,7 +2288,7 @@ SessionExecuteGetValue(UCHAR *InBuffer,
>      }
>      RtlZeroMemory(tmppath, path->Length+1);
>      RtlCopyBytes(tmppath,path->Buffer, path->Length);
> -
> +
> 
>      status = STATUS_WMI_INSTANCE_NOT_FOUND;
>      if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
> @@ -2297,10 +2297,10 @@ SessionExecuteGetValue(UCHAR *InBuffer,
>      }
>      status = XENBUS_STORE(Read, &fdoData->StoreInterface, session-
> >transaction, NULL, tmppath, &value);
>      UnlockSessions(fdoData);
> -
> -    if (!NT_SUCCESS(status))
> +
> +    if (!NT_SUCCESS(status))
>          goto fail2;
> -
> +
>      status = STATUS_BUFFER_TOO_SMALL;
>      if (!AccessWmiBuffer(OutBuffer, FALSE, &RequiredSize, OutBufferSize,
>                              WMI_STRING, GetCountedUtf8Size(value), &valuepos,
> @@ -2335,7 +2335,7 @@ BaseExecuteAddSession(UCHAR *InBuffer,
>      NTSTATUS status;
>      *byteswritten = 0;
>      if (!AccessWmiBuffer(InBuffer, TRUE, &RequiredSize, InBufferSize,
> -                            WMI_STRING, &stringid,
> +                            WMI_STRING, &stringid,
>                              WMI_DONE)){
>          return STATUS_INVALID_DEVICE_REQUEST;
>      }
> @@ -2345,12 +2345,12 @@ BaseExecuteAddSession(UCHAR *InBuffer,
>          *byteswritten = RequiredSize;
>          return STATUS_BUFFER_TOO_SMALL;
>      }
> -
> +
>      AllocUnicodeStringBuffer(&ustring, *(USHORT*)(stringid));
>      if (ustring.Buffer == NULL)
>          return STATUS_INSUFFICIENT_RESOURCES;
>      status = RtlUnicodeStringCbCopyStringN(&ustring,
> -                                            (LPCWSTR)(stringid+sizeof(USHORT)),
> +                                            (LPCWSTR)(stringid+sizeof(USHORT)),
>                                              *(USHORT*)(stringid));
>      if (!NT_SUCCESS(status)) {
>          FreeUnicodeStringBuffer(&ustring);
> @@ -2368,7 +2368,7 @@ BaseExecuteAddSession(UCHAR *InBuffer,
>  }
> 
> 
> -NTSTATUS
> +NTSTATUS
>  SessionExecuteMethod(UCHAR *Buffer,
>                      ULONG BufferSize,
>                      XENIFACE_FDO* fdoData,
> @@ -2397,115 +2397,115 @@ SessionExecuteMethod(UCHAR *Buffer,
>          return STATUS_INVALID_DEVICE_REQUEST;
>      }
> 
> -    InBuffer = Buffer + Method->DataBlockOffset;
> +    InBuffer = Buffer + Method->DataBlockOffset;
> 
>      GetCountedUnicodeString(&instance, InstStr);
> 
> -
> +
>      XenIfaceDebugPrint(TRACE,"Method Id %d\n", Method->MethodId);
>      switch (Method->MethodId) {
> -        case GetValue:
> -            status = SessionExecuteGetValue(InBuffer, Method->SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +        case GetValue:
> +            status = SessionExecuteGetValue(InBuffer, Method->SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
> -        case SetValue:
> -            status = SessionExecuteSetValue(InBuffer, Method->SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +        case SetValue:
> +            status = SessionExecuteSetValue(InBuffer, Method->SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
> -        case GetChildren:
> -            status = SessionExecuteGetChildren(InBuffer, Method-
> >SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +        case GetChildren:
> +            status = SessionExecuteGetChildren(InBuffer, Method-
> >SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
> -        case SetWatch:
> -            status = SessionExecuteSetWatch(InBuffer, Method->SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +        case SetWatch:
> +            status = SessionExecuteSetWatch(InBuffer, Method->SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
>          case EndSession:
> -            status = SessionExecuteEndSession(InBuffer, Method->SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +            status = SessionExecuteEndSession(InBuffer, Method-
> >SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
> -        case RemoveWatch:
> -            status = SessionExecuteRemoveWatch(InBuffer, Method-
> >SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +        case RemoveWatch:
> +            status = SessionExecuteRemoveWatch(InBuffer, Method-
> >SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
> -        case RemoveValue:
> -            status = SessionExecuteRemoveValue(InBuffer, Method-
> >SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +        case RemoveValue:
> +            status = SessionExecuteRemoveValue(InBuffer, Method-
> >SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
>          case Log:
> -            status = SessionExecuteLog(InBuffer,  Method->SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +            status = SessionExecuteLog(InBuffer,  Method->SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
> -        case StartTransaction:
> -            status = SessionExecuteStartTransaction(InBuffer,  Method-
> >SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +        case StartTransaction:
> +            status = SessionExecuteStartTransaction(InBuffer,  Method-
> >SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
>          case CommitTransaction:
> -            status = SessionExecuteCommitTransaction(InBuffer,  Method-
> >SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +            status = SessionExecuteCommitTransaction(InBuffer,  Method-
> >SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
>          case AbortTransaction:
> -            status = SessionExecuteAbortTransaction(InBuffer,  Method-
> >SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +            status = SessionExecuteAbortTransaction(InBuffer,  Method-
> >SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
>          case GetFirstChild:
> -            status = SessionExecuteGetFirstChild(InBuffer,  Method-
> >SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +            status = SessionExecuteGetFirstChild(InBuffer,  Method-
> >SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
>          case GetNextSibling:
> -            status = SessionExecuteGetNextSibling(InBuffer,  Method-
> >SizeDataBlock,
> -                                              Buffer+Method->DataBlockOffset,
> -                                              BufferSize-Method->DataBlockOffset,
> +            status = SessionExecuteGetNextSibling(InBuffer,  Method-
> >SizeDataBlock,
> +                                              Buffer+Method->DataBlockOffset,
> +                                              BufferSize-Method->DataBlockOffset,
>                                                fdoData,
> -                                              &instance,
> +                                              &instance,
>                                                byteswritten);
>              break;
> 
> @@ -2519,11 +2519,11 @@ SessionExecuteMethod(UCHAR *Buffer,
>      if (status == STATUS_BUFFER_TOO_SMALL) {
>          return NodeTooSmall(Buffer, BufferSize, (ULONG)*byteswritten,
> byteswritten);
>      }
> -
> +
>      Method->WnodeHeader.BufferSize = (ULONG)*byteswritten;
>       return status;
>  }
> -NTSTATUS
> +NTSTATUS
>  BaseExecuteMethod(UCHAR *Buffer,
>                      ULONG BufferSize,
>                      XENIFACE_FDO* fdoData,
> @@ -2540,14 +2540,14 @@ BaseExecuteMethod(UCHAR *Buffer,
>          return STATUS_INVALID_DEVICE_REQUEST;
>      }
> 
> -    InBuffer = Buffer + Method->DataBlockOffset;
> +    InBuffer = Buffer + Method->DataBlockOffset;
> 
>      switch (Method->MethodId) {
> -        case AddSession:
> -            status = BaseExecuteAddSession(InBuffer, Method->SizeDataBlock,
> -                                             Buffer+Method->DataBlockOffset,
> -                                             BufferSize-Method->DataBlockOffset,
> -                                             fdoData,
> +        case AddSession:
> +            status = BaseExecuteAddSession(InBuffer, Method->SizeDataBlock,
> +                                             Buffer+Method->DataBlockOffset,
> +                                             BufferSize-Method->DataBlockOffset,
> +                                             fdoData,
>                                               byteswritten);
>              Method->SizeDataBlock = (ULONG)*byteswritten;
>              *byteswritten+=Method->DataBlockOffset;
> @@ -2569,16 +2569,16 @@ WmiExecuteMethod(
>      if (IsEqualGUID(stack->Parameters.WMI.DataPath,
>                      &OBJECT_GUID(XenStoreBase))) {
>          return BaseExecuteMethod(stack->Parameters.WMI.Buffer,
> -                                    stack->Parameters.WMI.BufferSize,
> +                                    stack->Parameters.WMI.BufferSize,
>                                      fdoData,  byteswritten);
>      }
>      else if (IsEqualGUID(stack->Parameters.WMI.DataPath,
>                           &OBJECT_GUID(XenStoreSession))) {
>          return SessionExecuteMethod(stack->Parameters.WMI.Buffer,
> -                                    stack->Parameters.WMI.BufferSize,
> +                                    stack->Parameters.WMI.BufferSize,
>                                      fdoData,  byteswritten);
>      }
> -
> +
>      else
>          return STATUS_NOT_SUPPORTED;
>  }
> @@ -2598,7 +2598,7 @@ GenerateSessionBlock(UCHAR *Buffer,
>      ULONG* nameoffsets;
>      UCHAR *data;
>      UCHAR *names;
> -
> +
> 
>      LockSessions(fdoData);
> 
> @@ -2615,14 +2615,14 @@ GenerateSessionBlock(UCHAR *Buffer,
> 
>          AccessWmiBuffer((PUCHAR)nodesizerequired, FALSE, &RequiredSize, 0,
>                          WMI_UINT32, &id,
> -                        WMI_STRING,
> -                            GetCountedUnicodeStringSize(&session->stringid),
> +                        WMI_STRING,
> +                            GetCountedUnicodeStringSize(&session->stringid),
>                              &sesbuf,
>                          WMI_DONE);
>          nodesizerequired += RequiredSize;
> -
> +
>          AccessWmiBuffer((PUCHAR)namesizerequired, FALSE, &RequiredSize,
> 0,
> -                        WMI_STRING,
> +                        WMI_STRING,
>                              GetCountedUnicodeStringSize(&session->instancename),
>                              &inamebuf,
>                          WMI_DONE);
> @@ -2630,7 +2630,7 @@ GenerateSessionBlock(UCHAR *Buffer,
>          entries++;
>          session = (XenStoreSession *)session->listentry.Flink;
>      }
> -
> +
>      //perform the access check
>      if (!AccessWmiBuffer(Buffer, FALSE, &RequiredSize, BufferSize,
>                              WMI_BUFFER, sizeof(WNODE_ALL_DATA), &node,
> @@ -2665,21 +2665,21 @@ GenerateSessionBlock(UCHAR *Buffer,
> 
>              AccessWmiBuffer(datapos, FALSE, &RequiredSize, BufferSize+Buffer-
> datapos,
>                              WMI_UINT32, &id,
> -                            WMI_STRING,
> -                                GetCountedUnicodeStringSize(&session->stringid),
> +                            WMI_STRING,
> +                                GetCountedUnicodeStringSize(&session->stringid),
>                                  &sesbuf,
>                              WMI_DONE);
> 
> -            node->OffsetInstanceDataAndLength[entrynum].OffsetInstanceData
> =
> +            node->OffsetInstanceDataAndLength[entrynum].OffsetInstanceData
> =
>                  (ULONG)((UCHAR *)id - Buffer);
> -            node->OffsetInstanceDataAndLength[entrynum].LengthInstanceData
> =
> +            node-
> >OffsetInstanceDataAndLength[entrynum].LengthInstanceData =
>                  RequiredSize;
>              *id = session->id;
>              WriteCountedUnicodeString(&session->stringid, sesbuf);
>              datapos+=RequiredSize;
> 
>              AccessWmiBuffer(namepos, FALSE, &RequiredSize,
> BufferSize+Buffer-namepos,
> -                            WMI_STRING,
> +                            WMI_STRING,
>                                  GetCountedUnicodeStringSize(&session->instancename),
>                                  &inamebuf,
>                              WMI_DONE);
> @@ -2773,8 +2773,8 @@ GenerateBaseInstance(
>      else {
>          *time = 0;
>      }
> -
> -
> +
> +
>      node->WnodeHeader.BufferSize = node->DataBlockOffset+RequiredSize;
>      node->SizeDataBlock = RequiredSize;
> 
> @@ -2796,7 +2796,7 @@ GenerateSessionInstance(UCHAR *Buffer,
>      ULONG* id;
>      XenStoreSession *session;
>      UCHAR *sesbuf;
> -
> +
>      if (!AccessWmiBuffer(Buffer, TRUE, &RequiredSize, BufferSize,
>                              WMI_BUFFER, sizeof(WNODE_SINGLE_INSTANCE), &node,
>                              WMI_DONE))
> @@ -2805,7 +2805,7 @@ GenerateSessionInstance(UCHAR *Buffer,
>      }
>      if (!AccessWmiBuffer(Buffer, TRUE, &RequiredSize, BufferSize,
>                              WMI_BUFFER, sizeof(WNODE_SINGLE_INSTANCE), &node,
> -                            WMI_STRINGOFFSET, node->OffsetInstanceName, &InstStr,
> +                            WMI_STRINGOFFSET, node->OffsetInstanceName, &InstStr,
>                              WMI_OFFSET, node->DataBlockOffset, 0, &dbo,
>                              WMI_DONE))
>      {
> @@ -2818,10 +2818,10 @@ GenerateSessionInstance(UCHAR *Buffer,
>          UnlockSessions(fdoData);
>          return STATUS_WMI_INSTANCE_NOT_FOUND;
>      }
> -
> +
>      if (!AccessWmiBuffer(dbo, FALSE, &RequiredSize, BufferSize-node-
> >DataBlockOffset,
>                              WMI_UINT32, &id,
> -                            WMI_STRING,
> +                            WMI_STRING,
>                                  GetCountedUnicodeStringSize(&session->stringid),
>                                  &sesbuf,
>                              WMI_DONE)) {
> @@ -2837,7 +2837,7 @@ GenerateSessionInstance(UCHAR *Buffer,
>      node->WnodeHeader.BufferSize = node->DataBlockOffset +
> RequiredSize;
>      *byteswritten = node->DataBlockOffset + RequiredSize;
> 
> -
> +
> 
> 
>      return STATUS_SUCCESS;
> @@ -2851,17 +2851,17 @@ WmiQueryAllData(
>      OUT ULONG_PTR *byteswritten
>     )
>  {
> -
> -    if (IsEqualGUID(stack->Parameters.WMI.DataPath,
> +
> +    if (IsEqualGUID(stack->Parameters.WMI.DataPath,
>                      &OBJECT_GUID(XenStoreBase))) {
>          return GenerateBaseBlock(   fdoData,
> -                                    stack->Parameters.WMI.Buffer,
> +                                    stack->Parameters.WMI.Buffer,
>                                      stack->Parameters.WMI.BufferSize,
>                                      byteswritten);
>      }
> -    else if (IsEqualGUID(stack->Parameters.WMI.DataPath,
> +    else if (IsEqualGUID(stack->Parameters.WMI.DataPath,
>                           &OBJECT_GUID(XenStoreSession))) {
> -        return GenerateSessionBlock(stack->Parameters.WMI.Buffer,
> +        return GenerateSessionBlock(stack->Parameters.WMI.Buffer,
>                                      stack->Parameters.WMI.BufferSize,
>                                      fdoData,
>                                      byteswritten);
> @@ -2882,13 +2882,13 @@ WmiQuerySingleInstance(
>      if (IsEqualGUID(stack->Parameters.WMI.DataPath,
>                      &OBJECT_GUID(XenStoreBase))) {
>          return GenerateBaseInstance(fdoData,
> -                                    stack->Parameters.WMI.Buffer,
> +                                    stack->Parameters.WMI.Buffer,
>                                      stack->Parameters.WMI.BufferSize,
>                                      byteswritten);
>      }
>      else if (IsEqualGUID(stack->Parameters.WMI.DataPath,
>                           &OBJECT_GUID(XenStoreSession))) {
> -        return GenerateSessionInstance(stack->Parameters.WMI.Buffer,
> +        return GenerateSessionInstance(stack->Parameters.WMI.Buffer,
>                                      stack->Parameters.WMI.BufferSize,
>                                      fdoData,
>                                      byteswritten);
> @@ -2913,7 +2913,7 @@ WmiRegInfo(
>      ULONG RequiredSize;
>      int entries = 4;
>      const static UNICODE_STRING mofname =
> RTL_CONSTANT_STRING(L"XENIFACEMOF");
> -
> +
>      size_t mofnamesz;
> 
> 
> @@ -2927,12 +2927,12 @@ WmiRegInfo(
>          mofnamesz = 0;
>      }
>      if(!AccessWmiBuffer(stack->Parameters.WMI.Buffer, FALSE,
> -                        &RequiredSize,
> +                        &RequiredSize,
>                          stack->Parameters.WMI.BufferSize,
>                          WMI_BUFFER, sizeof(WMIREGINFO), (UCHAR **)&reginfo,
>                          WMI_BUFFER, entries * sizeof(WMIREGGUID), (UCHAR
> **)&guiddata,
>                          WMI_STRING, mofnamesz, &mofnameptr,
> -                        WMI_STRING,
> DriverParameters.RegistryPath.Length+sizeof(USHORT),
> +                        WMI_STRING,
> DriverParameters.RegistryPath.Length+sizeof(USHORT),
>                                      &regpath,
>                          WMI_DONE)){
>          reginfo->BufferSize = RequiredSize;
> @@ -2940,7 +2940,7 @@ WmiRegInfo(
>          return STATUS_BUFFER_TOO_SMALL;
> 
>      }
> -    if (stack->Parameters.WMI.DataPath == WMIREGISTER) {
> +    if (stack->Parameters.WMI.DataPath == WMIREGISTER) {
>          reginfo->MofResourceName = (ULONG)((ULONG_PTR)mofnameptr -
> (ULONG_PTR)reginfo);
>          WriteCountedUnicodeString(&mofname, mofnameptr);
>          reginfo->RegistryPath = (ULONG)((ULONG_PTR)regpath -
> (ULONG_PTR)reginfo);
> @@ -2955,28 +2955,28 @@ WmiRegInfo(
>      guid->InstanceCount = 1;
>      guid->Guid = OBJECT_GUID(XenStoreBase);
>      guid->Flags = WMIREG_FLAG_INSTANCE_PDO;
> -    guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject;
> -	ObReferenceObject(fdoData->PhysicalDeviceObject);
> -
> +    guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject;
> +    ObReferenceObject(fdoData->PhysicalDeviceObject);
> +
>      guid = &reginfo->WmiRegGuid[1];
>      guid->Guid = OBJECT_GUID(XenStoreSession);
>      guid->Flags =0;
> -
> +
>      guid = &reginfo->WmiRegGuid[2];
>      guid->InstanceCount = 1;
>      guid->Guid = OBJECT_GUID(XenStoreWatchEvent);
>      guid->Flags = WMIREG_FLAG_INSTANCE_PDO |
>                  WMIREG_FLAG_EVENT_ONLY_GUID ;
> -    guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject;
> -	ObReferenceObject(fdoData->PhysicalDeviceObject);
> +    guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject;
> +    ObReferenceObject(fdoData->PhysicalDeviceObject);
> 
>      guid = &reginfo->WmiRegGuid[3];
>      guid->InstanceCount = 1;
>      guid->Guid = OBJECT_GUID(XenStoreUnsuspendedEvent);
>      guid->Flags = WMIREG_FLAG_INSTANCE_PDO |
>                  WMIREG_FLAG_EVENT_ONLY_GUID ;
> -	guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject;
> -	ObReferenceObject(fdoData->PhysicalDeviceObject);
> +    guid->Pdo = (ULONG_PTR)fdoData->PhysicalDeviceObject;
> +    ObReferenceObject(fdoData->PhysicalDeviceObject);
> 
> 
>      *byteswritten = RequiredSize;
> @@ -2990,7 +2990,7 @@ WmiRegInfoEx(
>      OUT ULONG_PTR *byteswritten
>     )
>  {
> -
> +
>      XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__);
>      return WmiRegInfo(fdoData, stack, byteswritten);
>  }
> @@ -3006,17 +3006,17 @@ WmiProcessMinorFunction(
>      PIO_STACK_LOCATION stack;
>      UCHAR MinorFunction;
> 
> -
> +
> 
>      stack = IoGetCurrentIrpStackLocation(Irp);
> 
> -	if (stack->Parameters.WMI.ProviderId != (ULONG_PTR)fdoData->Dx-
> >DeviceObject) {
> -		XenIfaceDebugPrint(TRACE,"ProviderID %p %p", stack-
> >Parameters.WMI.ProviderId, fdoData->PhysicalDeviceObject);
> -		return STATUS_NOT_SUPPORTED;
> -	}
> -	else {
> -		XenIfaceDebugPrint(TRACE,"ProviderID Match %p %p",
> stack->Parameters.WMI.ProviderId, fdoData->PhysicalDeviceObject);
> -	}
> +    if (stack->Parameters.WMI.ProviderId != (ULONG_PTR)fdoData->Dx-
> >DeviceObject) {
> +        XenIfaceDebugPrint(TRACE,"ProviderID %p %p", stack-
> >Parameters.WMI.ProviderId, fdoData->PhysicalDeviceObject);
> +        return STATUS_NOT_SUPPORTED;
> +    }
> +    else {
> +        XenIfaceDebugPrint(TRACE,"ProviderID Match %p %p", stack-
> >Parameters.WMI.ProviderId, fdoData->PhysicalDeviceObject);
> +    }
>      MinorFunction = stack->MinorFunction;
> 
>      switch (MinorFunction)
> @@ -3060,9 +3060,9 @@ NTSTATUS XenIfaceSystemControl(
>      status = WmiProcessMinorFunction(fdoData, Irp);
> 
>      if (status != STATUS_NOT_SUPPORTED) {
> -		Irp->IoStatus.Status = status;
> +        Irp->IoStatus.Status = status;
>          IoCompleteRequest(Irp, IO_NO_INCREMENT);
> -
> +
>      }
>      else {
>          IoSkipCurrentIrpStackLocation(Irp);
> diff --git a/src/xeniface/wmi.h b/src/xeniface/wmi.h
> index ed77af7..a49f1b3 100644
> --- a/src/xeniface/wmi.h
> +++ b/src/xeniface/wmi.h
> @@ -60,15 +60,15 @@ NTSTATUS XenIfaceSystemControl(
>      );
> 
>  void FireSuspendEvent(
> -	IN OUT PXENIFACE_FDO fdoData
> -	);
> +    IN OUT PXENIFACE_FDO fdoData
> +    );
> 
>  void SessionsResumeAll(
> -	XENIFACE_FDO *fdoData
> +    XENIFACE_FDO *fdoData
>  );
> 
>  void SessionsSuspendAll(
> -	XENIFACE_FDO *fdoData
> +    XENIFACE_FDO *fdoData
>  );
> 
>  #endif
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Fri Oct 23 14:08:09 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 14:08: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 1Zpd0q-0000Ff-7S; Fri, 23 Oct 2015 14:08:08 +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 1Zpd0p-0000FS-6U
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 14:08:07 +0000
Received: from [193.109.254.147] by server-4.bemta-14.messagelabs.com id
	B5/7A-10715-64F3A265; Fri, 23 Oct 2015 14:08:06 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-11.tower-27.messagelabs.com!1445609284!54873716!1
X-Originating-IP: [209.85.212.170]
X-SpamReason: No, hits=2.2 required=7.0 tests=BIZ_TLD,BODY_RANDOM_LONG
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3214 invoked from network); 23 Oct 2015 14:08:04 -0000
Received: from mail-wi0-f170.google.com (HELO mail-wi0-f170.google.com)
	(209.85.212.170)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 14:08:04 -0000
Received: by wikq8 with SMTP id q8so78668947wik.1
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 23 Oct 2015 07:08:04 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=m2r_biz.20150623.gappssmtp.com; s=20150623;
	h=subject:to:references:from:message-id:date:user-agent:mime-version
	:in-reply-to:content-type;
	bh=vD8Ht7K2751xaV4emRbvTSkRUldyZIlDICpAr/r4qi8=;
	b=0qL/7q2T77jyjrxogiVy1y2TPG/xotmWvsgxFikA9jEcScmXfWKjpZKHhH426GzlIX
	c4/BiDOPw4ugaQFF+cFIjOzm7jsRWd8RyYOb63iRu69vh5ItPWLGitIIShaYjYwW0zvl
	NTumt4mZQwK1cS1MkGoVP72F0jX2WWecGdhqIBCO9lGFYQbBiT2hc5c7VGyrDzPGV+1P
	jgcCT5BDRGGZjYl86cL0q2vOlYW+nhm+BknoVUNbh0kV50gbcUdp4jBog44KacPsSqUG
	ZQ/ZK2lXoeECAjlJmtX1lHcw6h348CO/xk53vh6ls9SakxdFUwqriYwjaq06nrrIkQV/
	Si0A==
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;
	bh=vD8Ht7K2751xaV4emRbvTSkRUldyZIlDICpAr/r4qi8=;
	b=lpYcMuGUVGGRg3H14X1J9Y0MX9GI14pxSDuooViQFPCVoFQsptbMEe5Me+mZUY3mEC
	7Vms9lG8dQKLYRvGRcjTvM13PHiUSQyRL8MOcksRC5Jw6T6ooNw32CMB9DH7gTt6ev8e
	rlXxLDjhAvKmtcR6+tUakI0o8cwYjbiYj6/WvwL+0X1ZBq5ceNKeKsiL/pCqb0/JyXba
	rAHkhb3ST9RdQrEvD9xRIqTHbQ7RTF+cUOrXvpnvV9mXtbOIn46gG7zcq75DoIsk7uTC
	ebRNXvGybTE9PjS/55d6SbTFoauIH5+vsSU+fhVTAj1+vW/snulGnTAReLjeVc6Vb/17
	J+CQ==
X-Gm-Message-State: ALoCoQknpGDXuBKhRYnctIUA/eVvPNHL/QcTp6mAOOuTW9VruXhb75RQILoGUc2OKiiHyMimIhwn
X-Received: by 10.194.57.142 with SMTP id i14mr5682869wjq.24.1445609284234;
	Fri, 23 Oct 2015 07:08:04 -0700 (PDT)
Received: from [192.168.1.37] (ip-73-126.sn2.eutelia.it. [83.211.73.126])
	by smtp.googlemail.com with ESMTPSA id
	qq4sm22881301wjc.14.2015.10.23.07.08.02
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 23 Oct 2015 07:08:03 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <5629FAAE.8090700@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622531@AMSPEX01CL01.citrite.net>
	<562A0875.20008@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622850@AMSPEX01CL01.citrite.net>
	<562A0F44.6090403@m2r.biz>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <562A3F4D.6090808@m2r.biz>
Date: Fri, 23 Oct 2015 16:08:13 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <562A0F44.6090403@m2r.biz>
Content-Type: multipart/mixed; boundary="------------000806090602090802020106"
Subject: Re: [win-pv-devel] winpv drivers update still don't works correctly
 and domUs unable to boot on next reboot
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.
--------------000806090602090802020106
Content-Type: text/plain; charset=windows-1252; format=flowed
Content-Transfer-Encoding: 7bit

Il 23/10/2015 12:43, Fabio Fantoni ha scritto:
> Il 23/10/2015 12:25, 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: 23 October 2015 11:14
>>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
>>> Subject: Re: [win-pv-devel] winpv drivers update still don't works 
>>> correctly
>>> and domUs unable to boot on next reboot
>>>
>>> Il 23/10/2015 11:33, Paul Durrant ha scritto:
>>>>> -----Original Message-----
>>>>> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
>>>>> Sent: 23 October 2015 10:15
>>>>> To: win-pv-devel@lists.xenproject.org
>>>>> Cc: Paul Durrant
>>>>> Subject: winpv drivers update still don't works correctly and domUs
>>> unable to
>>>>> boot on next reboot
>>>>>
>>>>> In many months I have tried numerous times with numerous winpv builds
>>> on
>>>>> windows update 7/8/10 but most of the time still using earlier builds
>>>>> for one or more components, and often the next reboot fails to boot.
>>>> You have a driver incompatibility problem. You have a XENBUS 8.2.0 
>>>> from
>>> 22nd October, but a XENVBD 8.1.0 from 11th August. So, I think what's
>>> happing is that the old XENVBD is unable to bind to the PDO created 
>>> by the
>>> newer XENBUS, hence no FDO is being created, hence no disk PDOs are
>>> being created, hence you have no system disk and you get a 0x7B BSOD.
>>>>     Paul
>>> Even if I updated ALL the component (so all the same build), also in
>>> case of same "major version" ( for example 8.1.0 (1) -> 8.1.0 (2) ), 
>>> the
>>> domU uses one or more component at the older version.
>>> For what I remember happen mainly for disks and network components.
>>> In some case domU was still working even if it using old build of 
>>> one or
>>> more components, in many other cases network or disks was not working
>>> (for disks the domU was unable to boot like this latest).
>>> I already tried many tests for many hours in latest months trying to
>>> remove the drivers, also manually remove service, files, registry keys
>>> ecc... (after uninstall from windows control panel) but without found a
>>> secure update procedure because also in many remove cases windows was
>>> unable to boot.
>>> If I understand good I suppose the mainly problems are that uninstaller
>>> (in windows control panel) doesn't remove all effective related things,
>>> and removing them manually if very difficult. It seems that winpv
>>> components coinstaller have something wrong or missed which make unable
>>> to use correctly the latest  builds and/or uninstall/update the 
>>> drivers.
>>>
>>> Thanks for any reply and sorry for my bad english.
>> I tend to install using dpinst so when I remove I generally do it via 
>> the 'uninstall programs' pane in control panel. I then reboot to get 
>> back to emulated devices and only then do install newer PV drivers.
>>
>>    Paul
>
> I already tried the same (as I wrote) for a hundred times or more in 
> the last year but too many times the domU was unable to boot because 
> of winpv things still remains after uninstall (or for other window 
> problem that I not understand exactly).
> I spent tens of hours to found a solution to remove remaining service, 
> registry keys and files AFTER uninstall from windows control panel but 
> I was always unable to found a clean and safe procedure to full 
> removal that left windows still able to boot in any case.

I now retried with same domU when I had the latest problem reported (I 
returned to status before the winpv update with disk snapshot), I 
removed the winpv drivers from windows control panel (in this case I 
didn't try additional manual clean) and reboot.
Next boot windows fails to boot and from qemu log winpv things are still 
present and used but boot fails (I suppose because partial as uninstalled).
Full qemu log with trace in attachment.
Seems very strange that similar thing happen only to me and in 80-90% of 
my tests with winpv, as already wrote tested on many domUs, W7/8/10, 
different builds of winpv, different versions of dom0 kernel, xen, qemu 
ecc...

If you need more informations/tests tell me and I'll post them.

Thanks for any reply and sorry for my bad english.

>
>>
>>>>> In my latest test:
>>>>> Dom0:
>>>>> Wheezy (debian 7) 64 bit with xen 4.6.0 plus some small additional
>>> patches:
>>>>> https://github.com/Fantu/Xen/commits/rebase/m2r-testing-4.6
>>>>> kernel is custom build of 4.1.8 with .config in attachment
>>>>> Qemu 2.4 with some small additional patches:
>>>>> https://github.com/Fantu/qemu/commits/rebase/upstream
>>>>> Seabios 1.8.2
>>>>>
>>>>> DomU:
>>>>> windows 10 pro 64 bit
>>>>> xl cfg in attachment
>>>>>
>>>>> I updated all winpv components to latest build without saw errors 
>>>>> but on
>>>>> reboot windows fails to boot, in qemu log I saw a trace about and 
>>>>> also
>>>>> the still use older build of at least one component.
>>>>> Full qemu log with trace in attachment.
>>>>> I had similar problem many time with different versions of xen, qemu,
>>>>> seabios, winpv, windows ecc...
>>>>> I also already did at least one other report about time ago if I
>>>>> remember good.
>>>>>
>>>>>
>>>>> If you need more informations/tests tell me and I'll post them.
>>>>>
>>>>> Thanks for any reply and sorry for my bad english.
>>>>>
>>>


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

main_channel_link: add main channel client
main_channel_handle_parsed: net test: latency 9.272000 ms, bitrate 527835051 bps (503.382731 Mbps)
inputs_connect: inputs channel client create
red_dispatcher_set_cursor_peer: 
10383@1445607910.317226:xen_platform_log xen platform: XEN|DllInitialize: 8.1.0 (73) (07.08.2015)
10383@1445607910.317486:xen_platform_log xen platform: XEN|AcpiFindRsdp: 0x00000000000F65D0
10383@1445607910.317623:xen_platform_log xen platform: XEN|SystemGetStartOptions:  TESTSIGNING  FLIGHTSIGNING  NOEXECUTE=OPTIN
10383@1445607910.317735:xen_platform_log xen platform: XEN|SystemGetVersionInformation: KERNEL: 10.0 (BUILD 10565) PLATFORM WIN32_NT (x64)
10383@1445607910.317814:xen_platform_log xen platform: XEN|SystemGetVersionInformation: SUITES:
10383@1445607910.317893:xen_platform_log xen platform: XEN|SystemGetVersionInformation: - TERMINAL
10383@1445607910.317976:xen_platform_log xen platform: XEN|SystemGetVersionInformation: - SINGLEUSERTS
10383@1445607910.318059:xen_platform_log xen platform: XEN|SystemGetVersionInformation: TYPE: WORKSTATION
10383@1445607910.318166:xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[0] 00000000.00001000 - 00000000.0009efff
10383@1445607910.318274:xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[1] 00000000.00100000 - 00000000.00101fff
10383@1445607910.318380:xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[2] 00000000.00103000 - 00000000.efffefff
10383@1445607910.318487:xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[3] 00000001.00000000 - 00000001.07ffffff
10383@1445607910.318569:xen_platform_log xen platform: XEN|AcpiGetXsdt: 0x00000000FC00A000
10383@1445607910.319030:xen_platform_log xen platform: XEN|SystemProcessorInformation: ====> (0:0)
10383@1445607910.319127:xen_platform_log xen platform: XEN|SystemProcessorInformation: Manufacturer: GenuineIntel
10383@1445607910.319191:xen_platform_log xen platform: XEN|SystemProcessorInformation: APIC ID: 00
10383@1445607910.319255:xen_platform_log xen platform: XEN|SystemProcessorInformation: PROCESSOR ID: 00
10383@1445607910.319318:xen_platform_log xen platform: XEN|SystemProcessorInformation: <==== (0:0)
10383@1445607910.319416:xen_platform_log xen platform: XEN|SystemProcessorInformation: ====> (0:1)
10383@1445607910.319512:xen_platform_log xen platform: XEN|SystemProcessorInformation: Manufacturer: GenuineIntel
10383@1445607910.319591:xen_platform_log xen platform: XEN|SystemProcessorInformation: APIC ID: 02
10383@1445607910.319674:xen_platform_log xen platform: XEN|SystemProcessorInformation: PROCESSOR ID: 01
10383@1445607910.319761:xen_platform_log xen platform: XEN|SystemProcessorInformation: <==== (0:1)
10383@1445607910.320152:xen_platform_log xen platform: XEN: HYPERCALL PAGE 0 @ 00000001.048a6000
10383@1445607910.320330:xen_platform_log xen platform: XEN|UnplugSetRequest: DISKS
10383@1445607910.320404:xen_platform_log xen platform: XEN|UnplugSetRequest: NICS
10383@1445607910.322732:xen_platform_log xen platform: XENFILT|DriverEntry: 8.1.0 (73) (07.08.2015)
10383@1445607910.322817:xen_platform_log xen platform: XEN: 4.6.0 (__XEN_INTERFACE_VERSION__ = 00040600)
10383@1445607910.351785:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE00038DFEC60 (ACPI\PNP0A03\0)
10383@1445607910.727835:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038E84C60 (PCI\VEN_8086&DEV_1237&SUBSYS_11001AF4&REV_02\00)
10383@1445607910.728023:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038E84880 (PCI\VEN_8086&DEV_7000&SUBSYS_11001AF4&REV_00\08)
10383@1445607910.728183:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038DF4C60 (PCI\VEN_8086&DEV_7010&SUBSYS_11001AF4&REV_00\09)
10383@1445607910.728346:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038DF4880 (PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10)
10383@1445607910.736172:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038FD9B30 (PCI\VEN_8086&DEV_2668&SUBSYS_11001AF4&REV_01\18)
10383@1445607910.736337:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038DFDC60 (PCI\VEN_1AF4&DEV_1003&SUBSYS_00031AF4&REV_00\20)
10383@1445607910.736529:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038FDBC60 (PCI\VEN_1B36&DEV_0100&SUBSYS_11001AF4&REV_04\28)
10383@1445607910.736688:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038FDB880 (PCI\VEN_10EC&DEV_8139&SUBSYS_11001AF4&REV_20\30)
10383@1445607910.736854:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038E899F0 (PCI\VEN_8086&DEV_2934&SUBSYS_11001AF4&REV_03\E8)
10383@1445607910.737014:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038DF5B30 (PCI\VEN_8086&DEV_2935&SUBSYS_11001AF4&REV_03\E9)
10383@1445607910.737174:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038FDCC60 (PCI\VEN_8086&DEV_2936&SUBSYS_11001AF4&REV_03\EA)
10383@1445607910.737332:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038E88C60 (PCI\VEN_8086&DEV_293A&SUBSYS_11001AF4&REV_03\EF)
10383@1445607910.737486:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038FDDC60 (ACPI\PNP0103\0)
10383@1445607910.737580:xen_platform_log xen platform: XENFILT|DriverSetFilterState: ACTIVE DEVICE PRESENT
10383@1445607910.737759:xen_platform_log xen platform: UNPLUG: PRE-AMBLE (DRIVERS NOT BLACKLISTED)
10383@1445607910.756083:xen_platform_log xen platform: UNPLUG: DISKS
10383@1445607910.756177:xen_platform_log xen platform: XENFILT|DriverSetFilterState: PENDING
10383@1445607910.793846:xen_platform_log xen platform: XENFILT|DriverSetFilterState: DISABLED
10383@1445607910.834839:xen_platform_log xen platform: XENBUS|DriverEntry: 8.1.0 (73) (07.08.2015)
10383@1445607910.870869:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE00038FF4C60 (PCIIDE\IDEChannel\0)
10383@1445607910.871197:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE00038FF7C60 (PCIIDE\IDEChannel\1)
10383@1445607910.877446:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038FF9C60 (IDE\CdRomQEMU_QEMU_DVD-ROM_______________________2.4.____\0.1.0)
10383@1445607911.413226:xen_platform_log xen platform: XENVBD|DriverEntry:8.1.0.32 (11/8/2015)
10383@1445607911.417272:xen_platform_log xen platform: XENVBD|__DriverParseParameterKey:DriverParameters: 
10383@1445607911.417713:xen_platform_log xen platform: XENDISK|DriverEntry:XENDISK 8.1.0 (32) (11.08.2015)
10383@1445607964.901552:xen_platform_log xen platform: XEN|BUGCHECK: ====>
10383@1445607964.901755:xen_platform_log xen platform: XEN|BUGCHECK: INACCESSIBLE_BOOT_DEVICE: FFFFD001FB1AE940 FFFFFFFFC0000034 0000000000000000 0000000000000000
10383@1445607964.901869:xen_platform_log xen platform: XEN|BUGCHECK: \ArcName\multi(0)disk(0)rdisk(0)partition(2)
10383@1445607964.901962:xen_platform_log xen platform: XEN|BUGCHECK: CONTEXT (FFFFD001FB1ADC40):
10383@1445607964.902037:xen_platform_log xen platform: XEN|BUGCHECK: - GS = 002B
10383@1445607964.902112:xen_platform_log xen platform: XEN|BUGCHECK: - FS = 0053
10383@1445607964.902187:xen_platform_log xen platform: XEN|BUGCHECK: - ES = 002B
10383@1445607964.902262:xen_platform_log xen platform: XEN|BUGCHECK: - DS = 002B
10383@1445607964.902337:xen_platform_log xen platform: XEN|BUGCHECK: - SS = 0018
10383@1445607964.902412:xen_platform_log xen platform: XEN|BUGCHECK: - CS = 0010
10383@1445607964.902495:xen_platform_log xen platform: XEN|BUGCHECK: - EFLAGS = 00000086
10383@1445607964.902582:xen_platform_log xen platform: XEN|BUGCHECK: - RDI = 00000000FB1AE940
10383@1445607964.902670:xen_platform_log xen platform: XEN|BUGCHECK: - RSI = 00000000C0000034
10383@1445607964.902758:xen_platform_log xen platform: XEN|BUGCHECK: - RBX = 00000000A1140A30
10383@1445607964.902845:xen_platform_log xen platform: XEN|BUGCHECK: - RDX = 0000000000000000
10383@1445607964.902933:xen_platform_log xen platform: XEN|BUGCHECK: - RCX = 00000000FB1ADC40
10383@1445607964.903020:xen_platform_log xen platform: XEN|BUGCHECK: - RAX = 000000000000000F
10383@1445607964.903107:xen_platform_log xen platform: XEN|BUGCHECK: - RBP = 0000000000000000
10383@1445607964.903194:xen_platform_log xen platform: XEN|BUGCHECK: - RIP = 00000000A1135802
10383@1445607964.903281:xen_platform_log xen platform: XEN|BUGCHECK: - RSP = 00000000FB1ADC20
10383@1445607964.903378:xen_platform_log xen platform: XEN|BUGCHECK: - R8 = 0000000000000000
10383@1445607964.903465:xen_platform_log xen platform: XEN|BUGCHECK: - R9 = 0000000000000000
10383@1445607964.903552:xen_platform_log xen platform: XEN|BUGCHECK: - R10 = 0000000000000100
10383@1445607964.903638:xen_platform_log xen platform: XEN|BUGCHECK: - R11 = 0000000000000000
10383@1445607964.903725:xen_platform_log xen platform: XEN|BUGCHECK: - R12 = 000000000000007B
10383@1445607964.903812:xen_platform_log xen platform: XEN|BUGCHECK: - R13 = 00000000FB1AE901
10383@1445607964.903899:xen_platform_log xen platform: XEN|BUGCHECK: - R14 = 0000000000000000
10383@1445607964.903985:xen_platform_log xen platform: XEN|BUGCHECK: - R15 = 00000000B2B62AA0
10383@1445607964.904055:xen_platform_log xen platform: XEN|BUGCHECK: STACK:
10383@1445607964.904233:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AE130: (0000000000000003 00000000A11392C0 00000000A1138A50 00000000A113E3A0) xen.sys + 0000000000005B9D
10383@1445607964.904413:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AE180: (00000000A1141460 00000000FB1AE2C0 0000000000000040 00000000B2B62AA0) ntoskrnl.exe + 00000000001ADF7D
10383@1445607964.904594:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AE1C0: (00000000A1141460 00000000B2B62AA0 0000000000000000 0000000000000001) ntoskrnl.exe + 00000000001AD27D
10383@1445607964.904773:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AE8D0: (00000000FB1AE940 00000000B2C2F8B1 0000000000000000 00000000C0000034) ntoskrnl.exe + 000000000013E554
10383@1445607964.904986:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AE910: (000000000000007B 00000000FB1AE940 00000000C0000034 0000000000000000) ntoskrnl.exe + 0000000000189F9B
10383@1445607964.905178:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AE990: (00000000CF010680 00000000800001A0 00000000CF010680 00000000FFE17B80) ntoskrnl.exe + 00000000007450AD
10383@1445607964.905361:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AEBD0: (00000000381F8040 00000000B2B74F00 0000000000000006 00000000B12C1D50) ntoskrnl.exe + 00000000007343FD
10383@1445607964.905553:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AECF0: (00000000B4537070 00000000B12C1D50 00000000B2D7C098 0000000000000E63) ntoskrnl.exe + 0000000000729F69
10383@1445607964.905733:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AED20: (000000000001D804 00000000B12C1D50 00000000B2D7C098 00000000B12C1D50) ntoskrnl.exe + 00000000004EE0C2
10383@1445607964.905911:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AED50: (00000000380AC040 00000000000633C4 000000000001E310 000000000001E310) ntoskrnl.exe + 00000000000E1A95
10383@1445607964.906092:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AEDA0: (00000000B2B9A180 00000000380AC040 00000000B296FA54 0000000000071C4C) ntoskrnl.exe + 00000000001435F6
10383@1445607964.906256:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AEDD0: (00000000FB1AF000 00000000FB1A9000 0000000000000000 0000000000000000) 0000000000000000
10383@1445607964.906325:xen_platform_log xen platform: XEN|BUGCHECK: <====
Issued domain 10 reboot
qemu: terminating on signal 1 from pid 10163
red_channel_client_disconnect_dummy: rcc=0x556af72be350 (channel=0x556af7ffe0c0 type=5 id=0)
snd_channel_put: SndChannel=0x556af6ed9260 freed
red_channel_client_disconnect_dummy: rcc=0x556af7b2f270 (channel=0x556af80001f0 type=6 id=0)
snd_channel_put: SndChannel=0x556af774dd70 freed

--------------000806090602090802020106
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
--------------000806090602090802020106--


From win-pv-devel-bounces@lists.xenproject.org Fri Oct 23 14:08:09 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 14:08: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 1Zpd0q-0000Ff-7S; Fri, 23 Oct 2015 14:08:08 +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 1Zpd0p-0000FS-6U
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 14:08:07 +0000
Received: from [193.109.254.147] by server-4.bemta-14.messagelabs.com id
	B5/7A-10715-64F3A265; Fri, 23 Oct 2015 14:08:06 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-11.tower-27.messagelabs.com!1445609284!54873716!1
X-Originating-IP: [209.85.212.170]
X-SpamReason: No, hits=2.2 required=7.0 tests=BIZ_TLD,BODY_RANDOM_LONG
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3214 invoked from network); 23 Oct 2015 14:08:04 -0000
Received: from mail-wi0-f170.google.com (HELO mail-wi0-f170.google.com)
	(209.85.212.170)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 14:08:04 -0000
Received: by wikq8 with SMTP id q8so78668947wik.1
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 23 Oct 2015 07:08:04 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=m2r_biz.20150623.gappssmtp.com; s=20150623;
	h=subject:to:references:from:message-id:date:user-agent:mime-version
	:in-reply-to:content-type;
	bh=vD8Ht7K2751xaV4emRbvTSkRUldyZIlDICpAr/r4qi8=;
	b=0qL/7q2T77jyjrxogiVy1y2TPG/xotmWvsgxFikA9jEcScmXfWKjpZKHhH426GzlIX
	c4/BiDOPw4ugaQFF+cFIjOzm7jsRWd8RyYOb63iRu69vh5ItPWLGitIIShaYjYwW0zvl
	NTumt4mZQwK1cS1MkGoVP72F0jX2WWecGdhqIBCO9lGFYQbBiT2hc5c7VGyrDzPGV+1P
	jgcCT5BDRGGZjYl86cL0q2vOlYW+nhm+BknoVUNbh0kV50gbcUdp4jBog44KacPsSqUG
	ZQ/ZK2lXoeECAjlJmtX1lHcw6h348CO/xk53vh6ls9SakxdFUwqriYwjaq06nrrIkQV/
	Si0A==
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;
	bh=vD8Ht7K2751xaV4emRbvTSkRUldyZIlDICpAr/r4qi8=;
	b=lpYcMuGUVGGRg3H14X1J9Y0MX9GI14pxSDuooViQFPCVoFQsptbMEe5Me+mZUY3mEC
	7Vms9lG8dQKLYRvGRcjTvM13PHiUSQyRL8MOcksRC5Jw6T6ooNw32CMB9DH7gTt6ev8e
	rlXxLDjhAvKmtcR6+tUakI0o8cwYjbiYj6/WvwL+0X1ZBq5ceNKeKsiL/pCqb0/JyXba
	rAHkhb3ST9RdQrEvD9xRIqTHbQ7RTF+cUOrXvpnvV9mXtbOIn46gG7zcq75DoIsk7uTC
	ebRNXvGybTE9PjS/55d6SbTFoauIH5+vsSU+fhVTAj1+vW/snulGnTAReLjeVc6Vb/17
	J+CQ==
X-Gm-Message-State: ALoCoQknpGDXuBKhRYnctIUA/eVvPNHL/QcTp6mAOOuTW9VruXhb75RQILoGUc2OKiiHyMimIhwn
X-Received: by 10.194.57.142 with SMTP id i14mr5682869wjq.24.1445609284234;
	Fri, 23 Oct 2015 07:08:04 -0700 (PDT)
Received: from [192.168.1.37] (ip-73-126.sn2.eutelia.it. [83.211.73.126])
	by smtp.googlemail.com with ESMTPSA id
	qq4sm22881301wjc.14.2015.10.23.07.08.02
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 23 Oct 2015 07:08:03 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <5629FAAE.8090700@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622531@AMSPEX01CL01.citrite.net>
	<562A0875.20008@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622850@AMSPEX01CL01.citrite.net>
	<562A0F44.6090403@m2r.biz>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <562A3F4D.6090808@m2r.biz>
Date: Fri, 23 Oct 2015 16:08:13 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <562A0F44.6090403@m2r.biz>
Content-Type: multipart/mixed; boundary="------------000806090602090802020106"
Subject: Re: [win-pv-devel] winpv drivers update still don't works correctly
 and domUs unable to boot on next reboot
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.
--------------000806090602090802020106
Content-Type: text/plain; charset=windows-1252; format=flowed
Content-Transfer-Encoding: 7bit

Il 23/10/2015 12:43, Fabio Fantoni ha scritto:
> Il 23/10/2015 12:25, 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: 23 October 2015 11:14
>>> To: Paul Durrant; win-pv-devel@lists.xenproject.org
>>> Subject: Re: [win-pv-devel] winpv drivers update still don't works 
>>> correctly
>>> and domUs unable to boot on next reboot
>>>
>>> Il 23/10/2015 11:33, Paul Durrant ha scritto:
>>>>> -----Original Message-----
>>>>> From: Fabio Fantoni [mailto:fabio.fantoni@m2r.biz]
>>>>> Sent: 23 October 2015 10:15
>>>>> To: win-pv-devel@lists.xenproject.org
>>>>> Cc: Paul Durrant
>>>>> Subject: winpv drivers update still don't works correctly and domUs
>>> unable to
>>>>> boot on next reboot
>>>>>
>>>>> In many months I have tried numerous times with numerous winpv builds
>>> on
>>>>> windows update 7/8/10 but most of the time still using earlier builds
>>>>> for one or more components, and often the next reboot fails to boot.
>>>> You have a driver incompatibility problem. You have a XENBUS 8.2.0 
>>>> from
>>> 22nd October, but a XENVBD 8.1.0 from 11th August. So, I think what's
>>> happing is that the old XENVBD is unable to bind to the PDO created 
>>> by the
>>> newer XENBUS, hence no FDO is being created, hence no disk PDOs are
>>> being created, hence you have no system disk and you get a 0x7B BSOD.
>>>>     Paul
>>> Even if I updated ALL the component (so all the same build), also in
>>> case of same "major version" ( for example 8.1.0 (1) -> 8.1.0 (2) ), 
>>> the
>>> domU uses one or more component at the older version.
>>> For what I remember happen mainly for disks and network components.
>>> In some case domU was still working even if it using old build of 
>>> one or
>>> more components, in many other cases network or disks was not working
>>> (for disks the domU was unable to boot like this latest).
>>> I already tried many tests for many hours in latest months trying to
>>> remove the drivers, also manually remove service, files, registry keys
>>> ecc... (after uninstall from windows control panel) but without found a
>>> secure update procedure because also in many remove cases windows was
>>> unable to boot.
>>> If I understand good I suppose the mainly problems are that uninstaller
>>> (in windows control panel) doesn't remove all effective related things,
>>> and removing them manually if very difficult. It seems that winpv
>>> components coinstaller have something wrong or missed which make unable
>>> to use correctly the latest  builds and/or uninstall/update the 
>>> drivers.
>>>
>>> Thanks for any reply and sorry for my bad english.
>> I tend to install using dpinst so when I remove I generally do it via 
>> the 'uninstall programs' pane in control panel. I then reboot to get 
>> back to emulated devices and only then do install newer PV drivers.
>>
>>    Paul
>
> I already tried the same (as I wrote) for a hundred times or more in 
> the last year but too many times the domU was unable to boot because 
> of winpv things still remains after uninstall (or for other window 
> problem that I not understand exactly).
> I spent tens of hours to found a solution to remove remaining service, 
> registry keys and files AFTER uninstall from windows control panel but 
> I was always unable to found a clean and safe procedure to full 
> removal that left windows still able to boot in any case.

I now retried with same domU when I had the latest problem reported (I 
returned to status before the winpv update with disk snapshot), I 
removed the winpv drivers from windows control panel (in this case I 
didn't try additional manual clean) and reboot.
Next boot windows fails to boot and from qemu log winpv things are still 
present and used but boot fails (I suppose because partial as uninstalled).
Full qemu log with trace in attachment.
Seems very strange that similar thing happen only to me and in 80-90% of 
my tests with winpv, as already wrote tested on many domUs, W7/8/10, 
different builds of winpv, different versions of dom0 kernel, xen, qemu 
ecc...

If you need more informations/tests tell me and I'll post them.

Thanks for any reply and sorry for my bad english.

>
>>
>>>>> In my latest test:
>>>>> Dom0:
>>>>> Wheezy (debian 7) 64 bit with xen 4.6.0 plus some small additional
>>> patches:
>>>>> https://github.com/Fantu/Xen/commits/rebase/m2r-testing-4.6
>>>>> kernel is custom build of 4.1.8 with .config in attachment
>>>>> Qemu 2.4 with some small additional patches:
>>>>> https://github.com/Fantu/qemu/commits/rebase/upstream
>>>>> Seabios 1.8.2
>>>>>
>>>>> DomU:
>>>>> windows 10 pro 64 bit
>>>>> xl cfg in attachment
>>>>>
>>>>> I updated all winpv components to latest build without saw errors 
>>>>> but on
>>>>> reboot windows fails to boot, in qemu log I saw a trace about and 
>>>>> also
>>>>> the still use older build of at least one component.
>>>>> Full qemu log with trace in attachment.
>>>>> I had similar problem many time with different versions of xen, qemu,
>>>>> seabios, winpv, windows ecc...
>>>>> I also already did at least one other report about time ago if I
>>>>> remember good.
>>>>>
>>>>>
>>>>> If you need more informations/tests tell me and I'll post them.
>>>>>
>>>>> Thanks for any reply and sorry for my bad english.
>>>>>
>>>


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

main_channel_link: add main channel client
main_channel_handle_parsed: net test: latency 9.272000 ms, bitrate 527835051 bps (503.382731 Mbps)
inputs_connect: inputs channel client create
red_dispatcher_set_cursor_peer: 
10383@1445607910.317226:xen_platform_log xen platform: XEN|DllInitialize: 8.1.0 (73) (07.08.2015)
10383@1445607910.317486:xen_platform_log xen platform: XEN|AcpiFindRsdp: 0x00000000000F65D0
10383@1445607910.317623:xen_platform_log xen platform: XEN|SystemGetStartOptions:  TESTSIGNING  FLIGHTSIGNING  NOEXECUTE=OPTIN
10383@1445607910.317735:xen_platform_log xen platform: XEN|SystemGetVersionInformation: KERNEL: 10.0 (BUILD 10565) PLATFORM WIN32_NT (x64)
10383@1445607910.317814:xen_platform_log xen platform: XEN|SystemGetVersionInformation: SUITES:
10383@1445607910.317893:xen_platform_log xen platform: XEN|SystemGetVersionInformation: - TERMINAL
10383@1445607910.317976:xen_platform_log xen platform: XEN|SystemGetVersionInformation: - SINGLEUSERTS
10383@1445607910.318059:xen_platform_log xen platform: XEN|SystemGetVersionInformation: TYPE: WORKSTATION
10383@1445607910.318166:xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[0] 00000000.00001000 - 00000000.0009efff
10383@1445607910.318274:xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[1] 00000000.00100000 - 00000000.00101fff
10383@1445607910.318380:xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[2] 00000000.00103000 - 00000000.efffefff
10383@1445607910.318487:xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[3] 00000001.00000000 - 00000001.07ffffff
10383@1445607910.318569:xen_platform_log xen platform: XEN|AcpiGetXsdt: 0x00000000FC00A000
10383@1445607910.319030:xen_platform_log xen platform: XEN|SystemProcessorInformation: ====> (0:0)
10383@1445607910.319127:xen_platform_log xen platform: XEN|SystemProcessorInformation: Manufacturer: GenuineIntel
10383@1445607910.319191:xen_platform_log xen platform: XEN|SystemProcessorInformation: APIC ID: 00
10383@1445607910.319255:xen_platform_log xen platform: XEN|SystemProcessorInformation: PROCESSOR ID: 00
10383@1445607910.319318:xen_platform_log xen platform: XEN|SystemProcessorInformation: <==== (0:0)
10383@1445607910.319416:xen_platform_log xen platform: XEN|SystemProcessorInformation: ====> (0:1)
10383@1445607910.319512:xen_platform_log xen platform: XEN|SystemProcessorInformation: Manufacturer: GenuineIntel
10383@1445607910.319591:xen_platform_log xen platform: XEN|SystemProcessorInformation: APIC ID: 02
10383@1445607910.319674:xen_platform_log xen platform: XEN|SystemProcessorInformation: PROCESSOR ID: 01
10383@1445607910.319761:xen_platform_log xen platform: XEN|SystemProcessorInformation: <==== (0:1)
10383@1445607910.320152:xen_platform_log xen platform: XEN: HYPERCALL PAGE 0 @ 00000001.048a6000
10383@1445607910.320330:xen_platform_log xen platform: XEN|UnplugSetRequest: DISKS
10383@1445607910.320404:xen_platform_log xen platform: XEN|UnplugSetRequest: NICS
10383@1445607910.322732:xen_platform_log xen platform: XENFILT|DriverEntry: 8.1.0 (73) (07.08.2015)
10383@1445607910.322817:xen_platform_log xen platform: XEN: 4.6.0 (__XEN_INTERFACE_VERSION__ = 00040600)
10383@1445607910.351785:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE00038DFEC60 (ACPI\PNP0A03\0)
10383@1445607910.727835:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038E84C60 (PCI\VEN_8086&DEV_1237&SUBSYS_11001AF4&REV_02\00)
10383@1445607910.728023:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038E84880 (PCI\VEN_8086&DEV_7000&SUBSYS_11001AF4&REV_00\08)
10383@1445607910.728183:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038DF4C60 (PCI\VEN_8086&DEV_7010&SUBSYS_11001AF4&REV_00\09)
10383@1445607910.728346:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038DF4880 (PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10)
10383@1445607910.736172:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038FD9B30 (PCI\VEN_8086&DEV_2668&SUBSYS_11001AF4&REV_01\18)
10383@1445607910.736337:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038DFDC60 (PCI\VEN_1AF4&DEV_1003&SUBSYS_00031AF4&REV_00\20)
10383@1445607910.736529:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038FDBC60 (PCI\VEN_1B36&DEV_0100&SUBSYS_11001AF4&REV_04\28)
10383@1445607910.736688:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038FDB880 (PCI\VEN_10EC&DEV_8139&SUBSYS_11001AF4&REV_20\30)
10383@1445607910.736854:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038E899F0 (PCI\VEN_8086&DEV_2934&SUBSYS_11001AF4&REV_03\E8)
10383@1445607910.737014:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038DF5B30 (PCI\VEN_8086&DEV_2935&SUBSYS_11001AF4&REV_03\E9)
10383@1445607910.737174:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038FDCC60 (PCI\VEN_8086&DEV_2936&SUBSYS_11001AF4&REV_03\EA)
10383@1445607910.737332:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038E88C60 (PCI\VEN_8086&DEV_293A&SUBSYS_11001AF4&REV_03\EF)
10383@1445607910.737486:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038FDDC60 (ACPI\PNP0103\0)
10383@1445607910.737580:xen_platform_log xen platform: XENFILT|DriverSetFilterState: ACTIVE DEVICE PRESENT
10383@1445607910.737759:xen_platform_log xen platform: UNPLUG: PRE-AMBLE (DRIVERS NOT BLACKLISTED)
10383@1445607910.756083:xen_platform_log xen platform: UNPLUG: DISKS
10383@1445607910.756177:xen_platform_log xen platform: XENFILT|DriverSetFilterState: PENDING
10383@1445607910.793846:xen_platform_log xen platform: XENFILT|DriverSetFilterState: DISABLED
10383@1445607910.834839:xen_platform_log xen platform: XENBUS|DriverEntry: 8.1.0 (73) (07.08.2015)
10383@1445607910.870869:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE00038FF4C60 (PCIIDE\IDEChannel\0)
10383@1445607910.871197:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFE00038FF7C60 (PCIIDE\IDEChannel\1)
10383@1445607910.877446:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFE00038FF9C60 (IDE\CdRomQEMU_QEMU_DVD-ROM_______________________2.4.____\0.1.0)
10383@1445607911.413226:xen_platform_log xen platform: XENVBD|DriverEntry:8.1.0.32 (11/8/2015)
10383@1445607911.417272:xen_platform_log xen platform: XENVBD|__DriverParseParameterKey:DriverParameters: 
10383@1445607911.417713:xen_platform_log xen platform: XENDISK|DriverEntry:XENDISK 8.1.0 (32) (11.08.2015)
10383@1445607964.901552:xen_platform_log xen platform: XEN|BUGCHECK: ====>
10383@1445607964.901755:xen_platform_log xen platform: XEN|BUGCHECK: INACCESSIBLE_BOOT_DEVICE: FFFFD001FB1AE940 FFFFFFFFC0000034 0000000000000000 0000000000000000
10383@1445607964.901869:xen_platform_log xen platform: XEN|BUGCHECK: \ArcName\multi(0)disk(0)rdisk(0)partition(2)
10383@1445607964.901962:xen_platform_log xen platform: XEN|BUGCHECK: CONTEXT (FFFFD001FB1ADC40):
10383@1445607964.902037:xen_platform_log xen platform: XEN|BUGCHECK: - GS = 002B
10383@1445607964.902112:xen_platform_log xen platform: XEN|BUGCHECK: - FS = 0053
10383@1445607964.902187:xen_platform_log xen platform: XEN|BUGCHECK: - ES = 002B
10383@1445607964.902262:xen_platform_log xen platform: XEN|BUGCHECK: - DS = 002B
10383@1445607964.902337:xen_platform_log xen platform: XEN|BUGCHECK: - SS = 0018
10383@1445607964.902412:xen_platform_log xen platform: XEN|BUGCHECK: - CS = 0010
10383@1445607964.902495:xen_platform_log xen platform: XEN|BUGCHECK: - EFLAGS = 00000086
10383@1445607964.902582:xen_platform_log xen platform: XEN|BUGCHECK: - RDI = 00000000FB1AE940
10383@1445607964.902670:xen_platform_log xen platform: XEN|BUGCHECK: - RSI = 00000000C0000034
10383@1445607964.902758:xen_platform_log xen platform: XEN|BUGCHECK: - RBX = 00000000A1140A30
10383@1445607964.902845:xen_platform_log xen platform: XEN|BUGCHECK: - RDX = 0000000000000000
10383@1445607964.902933:xen_platform_log xen platform: XEN|BUGCHECK: - RCX = 00000000FB1ADC40
10383@1445607964.903020:xen_platform_log xen platform: XEN|BUGCHECK: - RAX = 000000000000000F
10383@1445607964.903107:xen_platform_log xen platform: XEN|BUGCHECK: - RBP = 0000000000000000
10383@1445607964.903194:xen_platform_log xen platform: XEN|BUGCHECK: - RIP = 00000000A1135802
10383@1445607964.903281:xen_platform_log xen platform: XEN|BUGCHECK: - RSP = 00000000FB1ADC20
10383@1445607964.903378:xen_platform_log xen platform: XEN|BUGCHECK: - R8 = 0000000000000000
10383@1445607964.903465:xen_platform_log xen platform: XEN|BUGCHECK: - R9 = 0000000000000000
10383@1445607964.903552:xen_platform_log xen platform: XEN|BUGCHECK: - R10 = 0000000000000100
10383@1445607964.903638:xen_platform_log xen platform: XEN|BUGCHECK: - R11 = 0000000000000000
10383@1445607964.903725:xen_platform_log xen platform: XEN|BUGCHECK: - R12 = 000000000000007B
10383@1445607964.903812:xen_platform_log xen platform: XEN|BUGCHECK: - R13 = 00000000FB1AE901
10383@1445607964.903899:xen_platform_log xen platform: XEN|BUGCHECK: - R14 = 0000000000000000
10383@1445607964.903985:xen_platform_log xen platform: XEN|BUGCHECK: - R15 = 00000000B2B62AA0
10383@1445607964.904055:xen_platform_log xen platform: XEN|BUGCHECK: STACK:
10383@1445607964.904233:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AE130: (0000000000000003 00000000A11392C0 00000000A1138A50 00000000A113E3A0) xen.sys + 0000000000005B9D
10383@1445607964.904413:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AE180: (00000000A1141460 00000000FB1AE2C0 0000000000000040 00000000B2B62AA0) ntoskrnl.exe + 00000000001ADF7D
10383@1445607964.904594:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AE1C0: (00000000A1141460 00000000B2B62AA0 0000000000000000 0000000000000001) ntoskrnl.exe + 00000000001AD27D
10383@1445607964.904773:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AE8D0: (00000000FB1AE940 00000000B2C2F8B1 0000000000000000 00000000C0000034) ntoskrnl.exe + 000000000013E554
10383@1445607964.904986:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AE910: (000000000000007B 00000000FB1AE940 00000000C0000034 0000000000000000) ntoskrnl.exe + 0000000000189F9B
10383@1445607964.905178:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AE990: (00000000CF010680 00000000800001A0 00000000CF010680 00000000FFE17B80) ntoskrnl.exe + 00000000007450AD
10383@1445607964.905361:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AEBD0: (00000000381F8040 00000000B2B74F00 0000000000000006 00000000B12C1D50) ntoskrnl.exe + 00000000007343FD
10383@1445607964.905553:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AECF0: (00000000B4537070 00000000B12C1D50 00000000B2D7C098 0000000000000E63) ntoskrnl.exe + 0000000000729F69
10383@1445607964.905733:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AED20: (000000000001D804 00000000B12C1D50 00000000B2D7C098 00000000B12C1D50) ntoskrnl.exe + 00000000004EE0C2
10383@1445607964.905911:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AED50: (00000000380AC040 00000000000633C4 000000000001E310 000000000001E310) ntoskrnl.exe + 00000000000E1A95
10383@1445607964.906092:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AEDA0: (00000000B2B9A180 00000000380AC040 00000000B296FA54 0000000000071C4C) ntoskrnl.exe + 00000000001435F6
10383@1445607964.906256:xen_platform_log xen platform: XEN|BUGCHECK: 00000000FB1AEDD0: (00000000FB1AF000 00000000FB1A9000 0000000000000000 0000000000000000) 0000000000000000
10383@1445607964.906325:xen_platform_log xen platform: XEN|BUGCHECK: <====
Issued domain 10 reboot
qemu: terminating on signal 1 from pid 10163
red_channel_client_disconnect_dummy: rcc=0x556af72be350 (channel=0x556af7ffe0c0 type=5 id=0)
snd_channel_put: SndChannel=0x556af6ed9260 freed
red_channel_client_disconnect_dummy: rcc=0x556af7b2f270 (channel=0x556af80001f0 type=6 id=0)
snd_channel_put: SndChannel=0x556af774dd70 freed

--------------000806090602090802020106
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
--------------000806090602090802020106--


From win-pv-devel-bounces@lists.xenproject.org Fri Oct 23 14:35:58 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 14:35: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 1ZpdRm-0003QA-98; Fri, 23 Oct 2015 14:35:58 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7314647ef=Paul.Durrant@citrix.com>)
	id 1ZpdRk-0003Po-VW
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 14:35:57 +0000
Received: from [193.109.254.147] by server-7.bemta-14.messagelabs.com id
	BD/74-28221-CC54A265; Fri, 23 Oct 2015 14:35:56 +0000
X-Env-Sender: prvs=7314647ef=Paul.Durrant@citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1445610954!24179687!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.2 required=7.0 tests=UPPERCASE_50_75,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32423 invoked from network); 23 Oct 2015 14:35:54 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 14:35:54 -0000
X-IronPort-AV: E=Sophos;i="5.20,186,1444694400"; 
   d="scan'208";a="6005031"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 4/6] Define new IOCTLs for user-mode
	clients
Thread-Index: AQHRC8EMTEI5bSrCdkGffNwK5YtHNp55KLVw
Date: Fri, 23 Oct 2015 14:35:46 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F623227@AMSPEX01CL01.citrite.net>
References: <562721FB.3020901@invisiblethingslab.com>
In-Reply-To: <562721FB.3020901@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] [PATCH 4/6] Define new IOCTLs for user-mode
 clients
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 Rafal Wojdyla
> Sent: 21 October 2015 06:26
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 4/6] Define new IOCTLs for user-mode
> clients
> 
> IOCTL input is defined as XENIFACE_*_IN structs.
> IOCTL output is defined as XENIFACE_*_OUT structs.
> 
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  include/xeniface_ioctls.h | 279
> +++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 278 insertions(+), 1 deletion(-)
> 
> diff --git a/include/xeniface_ioctls.h b/include/xeniface_ioctls.h
> index 1367f67..6ad98d6 100644
> --- a/include/xeniface_ioctls.h
> +++ b/include/xeniface_ioctls.h
> @@ -29,20 +29,297 @@
>   * SUCH DAMAGE.
>   */
> 
> +/*! \file xeniface_ioctls.h
> +    \brief User-mode IOCTL interfaces to the XENIFACE driver
> +*/
> +
>  #ifndef _XENIFACE_IOCTLS_H_
>  #define _XENIFACE_IOCTLS_H_
> 
> +/*! \brief XENIFACE device GUID */
>  DEFINE_GUID(GUID_INTERFACE_XENIFACE, \
>      0xb2cfb085, 0xaa5e, 0x47e1, 0x8b, 0xf7, 0x97, 0x93, 0xf3, 0x15, 0x45, 0x65);
> 
> +/*! \brief Bitmask of XenStore key permissions */
> +typedef enum _XENIFACE_STORE_PERMISSION_MASK {
> +    XENIFACE_STORE_PERM_NONE  = 0, /*!< No access */
> +    XENIFACE_STORE_PERM_READ  = 1, /*!< Read access */
> +    XENIFACE_STORE_PERM_WRITE = 2, /*!< Write access */
> +} XENIFACE_STORE_PERMISSION_MASK;
> +
> +/*! \brief XenStore key permissions entry for a single domain */
> +typedef struct _XENIFACE_STORE_PERMISSION {
> +    USHORT                         Domain; /*!< Target domain */
> +    XENIFACE_STORE_PERMISSION_MASK Mask;   /*!< Permissions for the
> domain */
> +} XENIFACE_STORE_PERMISSION, *PXENIFACE_STORE_PERMISSION;
> +
> +/*! \brief Bitmask of all available XenStore permission values */
> +#define XENIFACE_STORE_ALLOWED_PERMISSIONS \
> +    (XENIFACE_STORE_PERM_NONE | XENIFACE_STORE_PERM_READ |
> XENIFACE_STORE_PERM_WRITE)
> +
> +/*! \brief Read a value from XenStore
> +
> +    Input: NUL-terminated CHAR array containing the requested key's path
> +
> +    Output: NUL-terminated CHAR array containing the requested key's value
> +*/
>  #define IOCTL_XENIFACE_STORE_READ \
>      CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Write a value to XenStore
> +
> +    Input: NUL-terminated CHAR array containing the requested key's path,
> +           NUL-terminated CHAR array containing the key's value,
> +           final NUL terminator
> +
> +    Output: None
> +*/
>  #define IOCTL_XENIFACE_STORE_WRITE \
>      CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Enumerate all immediate child keys of a XenStore key
> +
> +    Input: NUL-terminated CHAR array containing the requested key's path
> +
> +    Output: List of NUL-terminated CHAR arrays containing the child key
> names,
> +            followed by a NUL CHAR
> +*/
>  #define IOCTL_XENIFACE_STORE_DIRECTORY \
>      CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Remove a key from XenStore
> +
> +    Input: NUL-terminated CHAR array containing the requested key's path
> +
> +    Output: None
> +*/
>  #define IOCTL_XENIFACE_STORE_REMOVE \
>      CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> 
> +/*! \brief Set permissions for a XenStore key
> +
> +    Input: XENIFACE_STORE_SET_PERMISSIONS_IN
> +
> +    Output: None
> +*/
> +#define IOCTL_XENIFACE_STORE_SET_PERMISSIONS \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_STORE_SET_PERMISSIONS */
> +typedef struct _XENIFACE_STORE_SET_PERMISSIONS_IN {
> +    PCHAR                     Path;                       /*!< NUL-terminated path to a
> XenStore key */
> +    ULONG                     PathLength;                 /*!< Size of Path in bytes, including
> the NUL terminator */
> +    ULONG                     NumberPermissions;          /*!< Number of permission
> entries */
> +    XENIFACE_STORE_PERMISSION Permissions[ANYSIZE_ARRAY]; /*!<
> Permission entries */
> +} XENIFACE_STORE_SET_PERMISSIONS_IN,
> *PXENIFACE_STORE_SET_PERMISSIONS_IN;
> +
> +/*! \brief Add a XenStore watch
> +
> +    Input: XENIFACE_STORE_ADD_WATCH_IN
> +
> +    Output: XENIFACE_STORE_ADD_WATCH_OUT
> +*/
> +#define IOCTL_XENIFACE_STORE_ADD_WATCH \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x805, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_STORE_ADD_WATCH */
> +typedef struct _XENIFACE_STORE_ADD_WATCH_IN {
> +    PCHAR  Path;       /*!< NUL-terminated path to a XenStore key */
> +    ULONG  PathLength; /*!< Size of Path in bytes, including the NUL
> terminator */
> +    HANDLE Event;      /*!< Handle to an event object that will be signaled
> when the watch fires */
> +} XENIFACE_STORE_ADD_WATCH_IN,
> *PXENIFACE_STORE_ADD_WATCH_IN;
> +
> +/*! \brief Output for IOCTL_XENIFACE_STORE_ADD_WATCH */
> +typedef struct _XENIFACE_STORE_ADD_WATCH_OUT {
> +    PVOID Context; /*!< Handle to the watch */
> +} XENIFACE_STORE_ADD_WATCH_OUT,
> *PXENIFACE_STORE_ADD_WATCH_OUT;
> +
> +/*! \brief Remove a XenStore watch
> +
> +    Input: XENIFACE_STORE_REMOVE_WATCH_IN
> +
> +    Output: None
> +*/
> +#define IOCTL_XENIFACE_STORE_REMOVE_WATCH \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x806, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_STORE_REMOVE_WATCH */
> +typedef struct _XENIFACE_STORE_REMOVE_WATCH_IN {
> +    PVOID Context; /*!< Handle to the watch */
> +} XENIFACE_STORE_REMOVE_WATCH_IN,
> *PXENIFACE_STORE_REMOVE_WATCH_IN;
> +
> +/*! \brief Open an event channel that was already bound by a remote
> domain
> +
> +    Input: XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN
> +
> +    Output: XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT
> +*/
> +#define IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x810, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN */
> +typedef struct _XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN {
> +    USHORT  RemoteDomain; /*!< Remote domain that has already bound
> the channel */
> +    ULONG   RemotePort;   /*!< Port number that is assigned to the event
> channel in the RemoteDomain */
> +    BOOLEAN Mask;         /*!< Set to TRUE if the event channel should be
> initially masked */
> +    HANDLE  Event;        /*!< Handle to an event object that will receive event
> channel notifications */
> +} XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN,
> *PXENIFACE_EVTCHN_BIND_INTERDOMAIN_IN;
> +
> +/*! \brief Output for IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN */
> +typedef struct _XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT {
> +    ULONG LocalPort; /*!< Local port number that is assigned to the event
> channel */
> +} XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT,
> *PXENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT;
> +
> +/*! \brief Open an unbound event channel
> +
> +    Input: XENIFACE_EVTCHN_BIND_UNBOUND_IN
> +
> +    Output: XENIFACE_EVTCHN_BIND_UNBOUND_OUT
> +*/
> +#define IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x811, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND */
> +typedef struct _XENIFACE_EVTCHN_BIND_UNBOUND_IN {
> +    USHORT  RemoteDomain; /*!< Remote domain that will bind the channel
> */
> +    BOOLEAN Mask;         /*!< Set to TRUE if the event channel should be
> initially masked */
> +    HANDLE  Event;        /*!< Handle to an event object that will receive event
> channel notifications */
> +} XENIFACE_EVTCHN_BIND_UNBOUND_IN,
> *PXENIFACE_EVTCHN_BIND_UNBOUND_IN;
> +
> +/*! \brief Output for IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND */
> +typedef struct _XENIFACE_EVTCHN_BIND_UNBOUND_OUT {
> +    ULONG LocalPort; /*!< Local port number that is assigned to the event
> channel */
> +} XENIFACE_EVTCHN_BIND_UNBOUND_OUT,
> *PXENIFACE_EVTCHN_BIND_UNBOUND_OUT;
> +
> +/*! \brief Close an event channel
> +
> +    Input: XENIFACE_EVTCHN_CLOSE_IN
> +
> +    Output: None
> +*/
> +#define IOCTL_XENIFACE_EVTCHN_CLOSE \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x812, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_EVTCHN_CLOSE */
> +typedef struct _XENIFACE_EVTCHN_CLOSE_IN {
> +    ULONG LocalPort; /*!< Local port number that is assigned to the event
> channel */
> +} XENIFACE_EVTCHN_CLOSE_IN, *PXENIFACE_EVTCHN_CLOSE_IN;
> +
> +/*! \brief Notify the remote end of an event channel
> +
> +    Input: XENIFACE_EVTCHN_CLOSE_IN
> +
> +    Output: None
> +*/
> +#define IOCTL_XENIFACE_EVTCHN_NOTIFY \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x813, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_EVTCHN_NOTIFY */
> +typedef struct _XENIFACE_EVTCHN_NOTIFY_IN {
> +    ULONG LocalPort; /*!< Local port number that is assigned to the event
> channel */
> +} XENIFACE_EVTCHN_NOTIFY_IN, *PXENIFACE_EVTCHN_NOTIFY_IN;
> +
> +/*! \brief Unmask an event channel
> +
> +    Input: XENIFACE_EVTCHN_CLOSE_IN
> +
> +    Output: None
> +*/
> +#define IOCTL_XENIFACE_EVTCHN_UNMASK \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x814, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_EVTCHN_UNMASK */
> +typedef struct _XENIFACE_EVTCHN_UNMASK_IN {
> +    ULONG LocalPort; /*!< Local port number that is assigned to the event
> channel */
> +} XENIFACE_EVTCHN_UNMASK_IN, *PXENIFACE_EVTCHN_UNMASK_IN;
> +
> +/*! \brief Bitmask of XenStore key permissions */
> +typedef enum _XENIFACE_GNTTAB_PAGE_FLAGS {
> +    XENIFACE_GNTTAB_READONLY          = 1 << 0, /*!< If set, the
> granted/mapped pages are read-only */
> +    XENIFACE_GNTTAB_USE_NOTIFY_OFFSET = 1 << 1, /*!< If set, the
> NotifyOffset member of the grant/map IOCTL input is used */
> +    XENIFACE_GNTTAB_USE_NOTIFY_PORT   = 1 << 2, /*!< If set, the
> NotifyPort member of the grant/map IOCTL input is used */
> +} XENIFACE_GNTTAB_PAGE_FLAGS;
> +
> +/*! \brief Grant permission to access local memory pages to a foreign
> domain
> +    \note This IOCTL must be asynchronous. The driver doesn't complete the
> request
> +          until the grant is explicitly revoked or the calling thread terminates.
> +
> +    Input: XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN
> +
> +    Output: XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT
> +*/
> +#define IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x820, METHOD_NEITHER,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS
> */
> +typedef struct _XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN {
> +    ULONG                      RequestId;    /*!< A unique (for the calling process)
> number identifying the request */
> +    USHORT                     RemoteDomain; /*!< Remote domain that is being
> granted access */
> +    ULONG                      NumberPages;  /*!< Number of 4k pages to grant
> access to */
> +    XENIFACE_GNTTAB_PAGE_FLAGS Flags;        /*!< Additional flags */
> +    ULONG                      NotifyOffset; /*!< Offset of a byte in the granted
> region that will be set to 0 when the grant is revoked */
> +    ULONG                      NotifyPort;   /*!< Local port number of an open event
> channel that will be notified when the grant is revoked */
> +} XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN,
> *PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN;
> +
> +/*! \brief Output for
> IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS */
> +typedef struct _XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT {
> +    PVOID Address;                   /*!< User-mode address of the granted
> memory region */
> +    ULONG References[ANYSIZE_ARRAY]; /*!< An array of Xen-assigned
> references for each granted page */
> +} XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT,
> *PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT;
> +
> +/*! \brief Revoke a foreign domain access to previously granted memory
> region
> +
> +    Input: XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN
> +
> +    Output: None
> +*/
> +#define IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x821, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS
> */
> +typedef struct _XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN {
> +    ULONG RequestId; /*! Request ID used in the corresponding
> IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS call */
> +} XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN,
> *PXENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN;
> +
> +/*! \brief Map a foreign memory region into the current address space
> +    \note This IOCTL must be asynchronous. The driver doesn't complete the
> request
> +          until the memory is explicitly unmapped or the calling thread
> terminates.
> +
> +    Input: XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN
> +
> +    Output: XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT
> +*/
> +#define IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x822, METHOD_NEITHER,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES */
> +typedef struct _XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN {
> +    ULONG                      RequestId;                 /*!< A unique (for the calling
> process) number identifying the request */
> +    USHORT                     RemoteDomain;              /*!< Remote domain that has
> granted access to the pages */
> +    ULONG                      NumberPages;               /*!< Number of 4k pages to map
> */
> +    XENIFACE_GNTTAB_PAGE_FLAGS Flags;                     /*!< Additional flags */
> +    ULONG                      NotifyOffset;              /*!< Offset of a byte in the
> mapped region that will be set to 0 when the region is unmapped */
> +    ULONG                      NotifyPort;                /*!< Local port number of an open
> event channel that will be notified when the region is unmapped */
> +    ULONG                      References[ANYSIZE_ARRAY]; /*!< An array of Xen-
> assigned references for each granted page */
> +} XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN,
> *PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN;
> +
> +/*! \brief Output for IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES */
> +typedef struct _XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT {
> +    PVOID Address; /*!< User-mode address of the mapped memory region
> */
> +} XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT,
> *PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT;
> +
> +/*! \brief Unmap a foreign memory region from the current address space
> +
> +    Input: XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN
> +
> +    Output: None
> +*/
> +#define IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x823, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES
> */
> +typedef struct _XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN {
> +    ULONG RequestId; /*! Request ID used in the corresponding
> IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES call */
> +} XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN,
> *PXENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN;
> +
>  #endif // _XENIFACE_IOCTLS_H_
> -
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Fri Oct 23 14:35:58 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 14:35: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 1ZpdRm-0003QA-98; Fri, 23 Oct 2015 14:35:58 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7314647ef=Paul.Durrant@citrix.com>)
	id 1ZpdRk-0003Po-VW
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 14:35:57 +0000
Received: from [193.109.254.147] by server-7.bemta-14.messagelabs.com id
	BD/74-28221-CC54A265; Fri, 23 Oct 2015 14:35:56 +0000
X-Env-Sender: prvs=7314647ef=Paul.Durrant@citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1445610954!24179687!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.2 required=7.0 tests=UPPERCASE_50_75,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32423 invoked from network); 23 Oct 2015 14:35:54 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 14:35:54 -0000
X-IronPort-AV: E=Sophos;i="5.20,186,1444694400"; 
   d="scan'208";a="6005031"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 4/6] Define new IOCTLs for user-mode
	clients
Thread-Index: AQHRC8EMTEI5bSrCdkGffNwK5YtHNp55KLVw
Date: Fri, 23 Oct 2015 14:35:46 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F623227@AMSPEX01CL01.citrite.net>
References: <562721FB.3020901@invisiblethingslab.com>
In-Reply-To: <562721FB.3020901@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] [PATCH 4/6] Define new IOCTLs for user-mode
 clients
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 Rafal Wojdyla
> Sent: 21 October 2015 06:26
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 4/6] Define new IOCTLs for user-mode
> clients
> 
> IOCTL input is defined as XENIFACE_*_IN structs.
> IOCTL output is defined as XENIFACE_*_OUT structs.
> 
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  include/xeniface_ioctls.h | 279
> +++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 278 insertions(+), 1 deletion(-)
> 
> diff --git a/include/xeniface_ioctls.h b/include/xeniface_ioctls.h
> index 1367f67..6ad98d6 100644
> --- a/include/xeniface_ioctls.h
> +++ b/include/xeniface_ioctls.h
> @@ -29,20 +29,297 @@
>   * SUCH DAMAGE.
>   */
> 
> +/*! \file xeniface_ioctls.h
> +    \brief User-mode IOCTL interfaces to the XENIFACE driver
> +*/
> +
>  #ifndef _XENIFACE_IOCTLS_H_
>  #define _XENIFACE_IOCTLS_H_
> 
> +/*! \brief XENIFACE device GUID */
>  DEFINE_GUID(GUID_INTERFACE_XENIFACE, \
>      0xb2cfb085, 0xaa5e, 0x47e1, 0x8b, 0xf7, 0x97, 0x93, 0xf3, 0x15, 0x45, 0x65);
> 
> +/*! \brief Bitmask of XenStore key permissions */
> +typedef enum _XENIFACE_STORE_PERMISSION_MASK {
> +    XENIFACE_STORE_PERM_NONE  = 0, /*!< No access */
> +    XENIFACE_STORE_PERM_READ  = 1, /*!< Read access */
> +    XENIFACE_STORE_PERM_WRITE = 2, /*!< Write access */
> +} XENIFACE_STORE_PERMISSION_MASK;
> +
> +/*! \brief XenStore key permissions entry for a single domain */
> +typedef struct _XENIFACE_STORE_PERMISSION {
> +    USHORT                         Domain; /*!< Target domain */
> +    XENIFACE_STORE_PERMISSION_MASK Mask;   /*!< Permissions for the
> domain */
> +} XENIFACE_STORE_PERMISSION, *PXENIFACE_STORE_PERMISSION;
> +
> +/*! \brief Bitmask of all available XenStore permission values */
> +#define XENIFACE_STORE_ALLOWED_PERMISSIONS \
> +    (XENIFACE_STORE_PERM_NONE | XENIFACE_STORE_PERM_READ |
> XENIFACE_STORE_PERM_WRITE)
> +
> +/*! \brief Read a value from XenStore
> +
> +    Input: NUL-terminated CHAR array containing the requested key's path
> +
> +    Output: NUL-terminated CHAR array containing the requested key's value
> +*/
>  #define IOCTL_XENIFACE_STORE_READ \
>      CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Write a value to XenStore
> +
> +    Input: NUL-terminated CHAR array containing the requested key's path,
> +           NUL-terminated CHAR array containing the key's value,
> +           final NUL terminator
> +
> +    Output: None
> +*/
>  #define IOCTL_XENIFACE_STORE_WRITE \
>      CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Enumerate all immediate child keys of a XenStore key
> +
> +    Input: NUL-terminated CHAR array containing the requested key's path
> +
> +    Output: List of NUL-terminated CHAR arrays containing the child key
> names,
> +            followed by a NUL CHAR
> +*/
>  #define IOCTL_XENIFACE_STORE_DIRECTORY \
>      CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Remove a key from XenStore
> +
> +    Input: NUL-terminated CHAR array containing the requested key's path
> +
> +    Output: None
> +*/
>  #define IOCTL_XENIFACE_STORE_REMOVE \
>      CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> 
> +/*! \brief Set permissions for a XenStore key
> +
> +    Input: XENIFACE_STORE_SET_PERMISSIONS_IN
> +
> +    Output: None
> +*/
> +#define IOCTL_XENIFACE_STORE_SET_PERMISSIONS \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_STORE_SET_PERMISSIONS */
> +typedef struct _XENIFACE_STORE_SET_PERMISSIONS_IN {
> +    PCHAR                     Path;                       /*!< NUL-terminated path to a
> XenStore key */
> +    ULONG                     PathLength;                 /*!< Size of Path in bytes, including
> the NUL terminator */
> +    ULONG                     NumberPermissions;          /*!< Number of permission
> entries */
> +    XENIFACE_STORE_PERMISSION Permissions[ANYSIZE_ARRAY]; /*!<
> Permission entries */
> +} XENIFACE_STORE_SET_PERMISSIONS_IN,
> *PXENIFACE_STORE_SET_PERMISSIONS_IN;
> +
> +/*! \brief Add a XenStore watch
> +
> +    Input: XENIFACE_STORE_ADD_WATCH_IN
> +
> +    Output: XENIFACE_STORE_ADD_WATCH_OUT
> +*/
> +#define IOCTL_XENIFACE_STORE_ADD_WATCH \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x805, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_STORE_ADD_WATCH */
> +typedef struct _XENIFACE_STORE_ADD_WATCH_IN {
> +    PCHAR  Path;       /*!< NUL-terminated path to a XenStore key */
> +    ULONG  PathLength; /*!< Size of Path in bytes, including the NUL
> terminator */
> +    HANDLE Event;      /*!< Handle to an event object that will be signaled
> when the watch fires */
> +} XENIFACE_STORE_ADD_WATCH_IN,
> *PXENIFACE_STORE_ADD_WATCH_IN;
> +
> +/*! \brief Output for IOCTL_XENIFACE_STORE_ADD_WATCH */
> +typedef struct _XENIFACE_STORE_ADD_WATCH_OUT {
> +    PVOID Context; /*!< Handle to the watch */
> +} XENIFACE_STORE_ADD_WATCH_OUT,
> *PXENIFACE_STORE_ADD_WATCH_OUT;
> +
> +/*! \brief Remove a XenStore watch
> +
> +    Input: XENIFACE_STORE_REMOVE_WATCH_IN
> +
> +    Output: None
> +*/
> +#define IOCTL_XENIFACE_STORE_REMOVE_WATCH \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x806, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_STORE_REMOVE_WATCH */
> +typedef struct _XENIFACE_STORE_REMOVE_WATCH_IN {
> +    PVOID Context; /*!< Handle to the watch */
> +} XENIFACE_STORE_REMOVE_WATCH_IN,
> *PXENIFACE_STORE_REMOVE_WATCH_IN;
> +
> +/*! \brief Open an event channel that was already bound by a remote
> domain
> +
> +    Input: XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN
> +
> +    Output: XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT
> +*/
> +#define IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x810, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN */
> +typedef struct _XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN {
> +    USHORT  RemoteDomain; /*!< Remote domain that has already bound
> the channel */
> +    ULONG   RemotePort;   /*!< Port number that is assigned to the event
> channel in the RemoteDomain */
> +    BOOLEAN Mask;         /*!< Set to TRUE if the event channel should be
> initially masked */
> +    HANDLE  Event;        /*!< Handle to an event object that will receive event
> channel notifications */
> +} XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN,
> *PXENIFACE_EVTCHN_BIND_INTERDOMAIN_IN;
> +
> +/*! \brief Output for IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN */
> +typedef struct _XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT {
> +    ULONG LocalPort; /*!< Local port number that is assigned to the event
> channel */
> +} XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT,
> *PXENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT;
> +
> +/*! \brief Open an unbound event channel
> +
> +    Input: XENIFACE_EVTCHN_BIND_UNBOUND_IN
> +
> +    Output: XENIFACE_EVTCHN_BIND_UNBOUND_OUT
> +*/
> +#define IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x811, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND */
> +typedef struct _XENIFACE_EVTCHN_BIND_UNBOUND_IN {
> +    USHORT  RemoteDomain; /*!< Remote domain that will bind the channel
> */
> +    BOOLEAN Mask;         /*!< Set to TRUE if the event channel should be
> initially masked */
> +    HANDLE  Event;        /*!< Handle to an event object that will receive event
> channel notifications */
> +} XENIFACE_EVTCHN_BIND_UNBOUND_IN,
> *PXENIFACE_EVTCHN_BIND_UNBOUND_IN;
> +
> +/*! \brief Output for IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND */
> +typedef struct _XENIFACE_EVTCHN_BIND_UNBOUND_OUT {
> +    ULONG LocalPort; /*!< Local port number that is assigned to the event
> channel */
> +} XENIFACE_EVTCHN_BIND_UNBOUND_OUT,
> *PXENIFACE_EVTCHN_BIND_UNBOUND_OUT;
> +
> +/*! \brief Close an event channel
> +
> +    Input: XENIFACE_EVTCHN_CLOSE_IN
> +
> +    Output: None
> +*/
> +#define IOCTL_XENIFACE_EVTCHN_CLOSE \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x812, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_EVTCHN_CLOSE */
> +typedef struct _XENIFACE_EVTCHN_CLOSE_IN {
> +    ULONG LocalPort; /*!< Local port number that is assigned to the event
> channel */
> +} XENIFACE_EVTCHN_CLOSE_IN, *PXENIFACE_EVTCHN_CLOSE_IN;
> +
> +/*! \brief Notify the remote end of an event channel
> +
> +    Input: XENIFACE_EVTCHN_CLOSE_IN
> +
> +    Output: None
> +*/
> +#define IOCTL_XENIFACE_EVTCHN_NOTIFY \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x813, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_EVTCHN_NOTIFY */
> +typedef struct _XENIFACE_EVTCHN_NOTIFY_IN {
> +    ULONG LocalPort; /*!< Local port number that is assigned to the event
> channel */
> +} XENIFACE_EVTCHN_NOTIFY_IN, *PXENIFACE_EVTCHN_NOTIFY_IN;
> +
> +/*! \brief Unmask an event channel
> +
> +    Input: XENIFACE_EVTCHN_CLOSE_IN
> +
> +    Output: None
> +*/
> +#define IOCTL_XENIFACE_EVTCHN_UNMASK \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x814, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_EVTCHN_UNMASK */
> +typedef struct _XENIFACE_EVTCHN_UNMASK_IN {
> +    ULONG LocalPort; /*!< Local port number that is assigned to the event
> channel */
> +} XENIFACE_EVTCHN_UNMASK_IN, *PXENIFACE_EVTCHN_UNMASK_IN;
> +
> +/*! \brief Bitmask of XenStore key permissions */
> +typedef enum _XENIFACE_GNTTAB_PAGE_FLAGS {
> +    XENIFACE_GNTTAB_READONLY          = 1 << 0, /*!< If set, the
> granted/mapped pages are read-only */
> +    XENIFACE_GNTTAB_USE_NOTIFY_OFFSET = 1 << 1, /*!< If set, the
> NotifyOffset member of the grant/map IOCTL input is used */
> +    XENIFACE_GNTTAB_USE_NOTIFY_PORT   = 1 << 2, /*!< If set, the
> NotifyPort member of the grant/map IOCTL input is used */
> +} XENIFACE_GNTTAB_PAGE_FLAGS;
> +
> +/*! \brief Grant permission to access local memory pages to a foreign
> domain
> +    \note This IOCTL must be asynchronous. The driver doesn't complete the
> request
> +          until the grant is explicitly revoked or the calling thread terminates.
> +
> +    Input: XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN
> +
> +    Output: XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT
> +*/
> +#define IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x820, METHOD_NEITHER,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS
> */
> +typedef struct _XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN {
> +    ULONG                      RequestId;    /*!< A unique (for the calling process)
> number identifying the request */
> +    USHORT                     RemoteDomain; /*!< Remote domain that is being
> granted access */
> +    ULONG                      NumberPages;  /*!< Number of 4k pages to grant
> access to */
> +    XENIFACE_GNTTAB_PAGE_FLAGS Flags;        /*!< Additional flags */
> +    ULONG                      NotifyOffset; /*!< Offset of a byte in the granted
> region that will be set to 0 when the grant is revoked */
> +    ULONG                      NotifyPort;   /*!< Local port number of an open event
> channel that will be notified when the grant is revoked */
> +} XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN,
> *PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN;
> +
> +/*! \brief Output for
> IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS */
> +typedef struct _XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT {
> +    PVOID Address;                   /*!< User-mode address of the granted
> memory region */
> +    ULONG References[ANYSIZE_ARRAY]; /*!< An array of Xen-assigned
> references for each granted page */
> +} XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT,
> *PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT;
> +
> +/*! \brief Revoke a foreign domain access to previously granted memory
> region
> +
> +    Input: XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN
> +
> +    Output: None
> +*/
> +#define IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x821, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS
> */
> +typedef struct _XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN {
> +    ULONG RequestId; /*! Request ID used in the corresponding
> IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS call */
> +} XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN,
> *PXENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN;
> +
> +/*! \brief Map a foreign memory region into the current address space
> +    \note This IOCTL must be asynchronous. The driver doesn't complete the
> request
> +          until the memory is explicitly unmapped or the calling thread
> terminates.
> +
> +    Input: XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN
> +
> +    Output: XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT
> +*/
> +#define IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x822, METHOD_NEITHER,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES */
> +typedef struct _XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN {
> +    ULONG                      RequestId;                 /*!< A unique (for the calling
> process) number identifying the request */
> +    USHORT                     RemoteDomain;              /*!< Remote domain that has
> granted access to the pages */
> +    ULONG                      NumberPages;               /*!< Number of 4k pages to map
> */
> +    XENIFACE_GNTTAB_PAGE_FLAGS Flags;                     /*!< Additional flags */
> +    ULONG                      NotifyOffset;              /*!< Offset of a byte in the
> mapped region that will be set to 0 when the region is unmapped */
> +    ULONG                      NotifyPort;                /*!< Local port number of an open
> event channel that will be notified when the region is unmapped */
> +    ULONG                      References[ANYSIZE_ARRAY]; /*!< An array of Xen-
> assigned references for each granted page */
> +} XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN,
> *PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN;
> +
> +/*! \brief Output for IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES */
> +typedef struct _XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT {
> +    PVOID Address; /*!< User-mode address of the mapped memory region
> */
> +} XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT,
> *PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT;
> +
> +/*! \brief Unmap a foreign memory region from the current address space
> +
> +    Input: XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN
> +
> +    Output: None
> +*/
> +#define IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES \
> +    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x823, METHOD_BUFFERED,
> FILE_ANY_ACCESS)
> +
> +/*! \brief Input for IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES
> */
> +typedef struct _XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN {
> +    ULONG RequestId; /*! Request ID used in the corresponding
> IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES call */
> +} XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN,
> *PXENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN;
> +
>  #endif // _XENIFACE_IOCTLS_H_
> -
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Fri Oct 23 14:36:20 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 14:36: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 1ZpdS8-0003U2-CB; Fri, 23 Oct 2015 14:36:20 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7314647ef=Paul.Durrant@citrix.com>)
	id 1ZpdS6-0003Tm-Eb
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 14:36:18 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	F2/CC-12889-1E54A265; Fri, 23 Oct 2015 14:36:17 +0000
X-Env-Sender: prvs=7314647ef=Paul.Durrant@citrix.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1445610972!22108600!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17762 invoked from network); 23 Oct 2015 14:36:12 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 14:36:12 -0000
X-IronPort-AV: E=Sophos;i="5.20,186,1444694400"; 
   d="scan'208";a="6005071"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 5/6] Implement new IOCTL handlers
Thread-Index: AQHRC8EaQ/ezKT5xBUWhIiuxai+Ly555KNHg
Date: Fri, 23 Oct 2015 14:36:11 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F623232@AMSPEX01CL01.citrite.net>
References: <56272208.8060208@invisiblethingslab.com>
In-Reply-To: <56272208.8060208@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] [PATCH 5/6] Implement new IOCTL handlers
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 Rafal Wojdyla
> Sent: 21 October 2015 06:27
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 5/6] Implement new IOCTL handlers
> 
> This patch implements new store, evtchn and gnttab IOCTLs.
> Handlers are split into separate files for readability.
> 
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  include/xeniface_ioctls.h        |   1 +
>  src/xeniface/fdo.c               | 179 +++++++++-
>  src/xeniface/fdo.h               |  44 ++-
>  src/xeniface/ioctl_evtchn.c      | 492 ++++++++++++++++++++++++++
>  src/xeniface/ioctl_gnttab.c      | 747
> +++++++++++++++++++++++++++++++++++++++
>  src/xeniface/ioctl_store.c       | 608 +++++++++++++++++++++++++++++++
>  src/xeniface/ioctls.c            | 396 ++++++++-------------
>  src/xeniface/ioctls.h            | 330 ++++++++++++++++-
>  src/xeniface/irp_queue.c         | 162 +++++++++
>  src/xeniface/irp_queue.h         |  81 +++++
>  vs2012/xeniface/xeniface.vcxproj |  30 +-
>  vs2013/xeniface/xeniface.vcxproj |  30 +-
>  12 files changed, 2807 insertions(+), 293 deletions(-)
>  create mode 100644 src/xeniface/ioctl_evtchn.c
>  create mode 100644 src/xeniface/ioctl_gnttab.c
>  create mode 100644 src/xeniface/ioctl_store.c
>  create mode 100644 src/xeniface/irp_queue.c
>  create mode 100644 src/xeniface/irp_queue.h
> 
> diff --git a/include/xeniface_ioctls.h b/include/xeniface_ioctls.h
> index 6ad98d6..a842d4f 100644
> --- a/include/xeniface_ioctls.h
> +++ b/include/xeniface_ioctls.h
> @@ -1,4 +1,5 @@
>  /* Copyright (c) Citrix Systems Inc.
> + * Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
>   * All rights reserved.
>   *
>   * Redistribution and use in source and binary forms,
> diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
> index b73dee1..71ffbe2 100644
> --- a/src/xeniface/fdo.c
> +++ b/src/xeniface/fdo.c
> @@ -36,7 +36,8 @@
>  #include <stdlib.h>
> 
>  #include <store_interface.h>
> -
> +#include <evtchn_interface.h>
> +#include <gnttab_interface.h>
>  #include <suspend_interface.h>
> 
> 
> @@ -52,6 +53,7 @@
>  #include "ioctls.h"
>  #include "wmi.h"
>  #include "xeniface_ioctls.h"
> +#include "irp_queue.h"
> 
>  #define FDO_POOL 'ODF'
> 
> @@ -664,6 +666,25 @@ __FdoD3ToD0(
>      if (!NT_SUCCESS(status))
>          goto fail1;
> 
> +    status = XENBUS_EVTCHN(Acquire, &Fdo->EvtchnInterface);
> +    if (!NT_SUCCESS(status))
> +        goto fail2;
> +
> +    status = XENBUS_GNTTAB(Acquire, &Fdo->GnttabInterface);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    status = XENBUS_GNTTAB(CreateCache,
> +                           &Fdo->GnttabInterface,
> +                           "xeniface-gnttab",
> +                           0,
> +                           GnttabAcquireLock,
> +                           GnttabReleaseLock,
> +                           Fdo,
> +                           &Fdo->GnttabCache);
> +    if (!NT_SUCCESS(status))
> +        goto fail4;
> +
>      __FdoSetDevicePowerState(Fdo, PowerDeviceD0);
> 
>      PowerState.DeviceState = PowerDeviceD0;
> @@ -675,6 +696,18 @@ __FdoD3ToD0(
> 
>      return STATUS_SUCCESS;
> 
> +fail4:
> +    Error("fail4\n");
> +    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
> +
> +fail3:
> +    Error("fail3\n");
> +    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
> +
> +fail2:
> +    Error("fail2\n");
> +    XENBUS_STORE(Release, &Fdo->StoreInterface);
> +
>  fail1:
>      Error("fail1 (%08x)\n", status);
> 
> @@ -700,6 +733,9 @@ __FdoD0ToD3(
> 
>      __FdoSetDevicePowerState(Fdo, PowerDeviceD3);
> 
> +    XENBUS_GNTTAB(DestroyCache, &Fdo->GnttabInterface, Fdo-
> >GnttabCache);
> +    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
> +    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
>      XENBUS_STORE(Release, &Fdo->StoreInterface);
> 
>      Trace("<====\n");
> @@ -1991,27 +2027,25 @@ FdoDispatchDefault(
> 
>  NTSTATUS
>  FdoCreateFile (
> -    __in PXENIFACE_FDO fdoData,
> -    __inout PIRP Irp
> +    __in PXENIFACE_FDO  Fdo,
> +    __inout PIRP        Irp
>      )
>  {
> -    NTSTATUS     status;
> +    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
> +    NTSTATUS            status;
> 
> +    XenIfaceDebugPrint(TRACE, "FO %p, Process %p\n", Stack->FileObject,
> PsGetCurrentProcess());
> 
> -    XenIfaceDebugPrint(TRACE, "Create \n");
> -
> -    if (Deleted == fdoData->Dx->DevicePnpState)
> -    {
> +    if (Deleted == Fdo->Dx->DevicePnpState) {
>          Irp->IoStatus.Status = STATUS_NO_SUCH_DEVICE;
> -        IoCompleteRequest (Irp, IO_NO_INCREMENT);
> +        IoCompleteRequest(Irp, IO_NO_INCREMENT);
>          return STATUS_NO_SUCH_DEVICE;
>      }
> 
> -
>      status = STATUS_SUCCESS;
>      Irp->IoStatus.Information = 0;
>      Irp->IoStatus.Status = status;
> -    IoCompleteRequest (Irp, IO_NO_INCREMENT);
> +    IoCompleteRequest(Irp, IO_NO_INCREMENT);
> 
>      return status;
>  }
> @@ -2019,20 +2053,22 @@ FdoCreateFile (
> 
>  NTSTATUS
>  FdoClose (
> -    __in PXENIFACE_FDO fdoData,
> -    __inout PIRP Irp
> +    __in PXENIFACE_FDO  Fdo,
> +    __inout PIRP        Irp
>      )
> 
>  {
> +    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
> +    NTSTATUS            status;
> 
> -    NTSTATUS     status;
> +    XenIfaceDebugPrint(TRACE, "FO %p, Process %p\n", Stack->FileObject,
> PsGetCurrentProcess());
> 
> -    XenIfaceDebugPrint(TRACE, "Close \n");
> +    XenIfaceCleanup(Fdo, Stack->FileObject);
> 
>      status = STATUS_SUCCESS;
>      Irp->IoStatus.Information = 0;
>      Irp->IoStatus.Status = status;
> -    IoCompleteRequest (Irp, IO_NO_INCREMENT);
> +    IoCompleteRequest(Irp, IO_NO_INCREMENT);
> 
>      return status;
>  }
> @@ -2081,7 +2117,7 @@ FdoDispatch(
>          break;
> 
>      case IRP_MJ_DEVICE_CONTROL:
> -        status = XenIFaceIoctl(Fdo, Irp);
> +        status = XenIfaceIoctl(Fdo, Irp);
>          break;
> 
>      case IRP_MJ_SYSTEM_CONTROL:
> @@ -2206,6 +2242,8 @@ FdoCreate(
>      WCHAR               Name[MAXNAMELEN * sizeof (WCHAR)];
>      ULONG               Size;
>      NTSTATUS            status;
> +    ULONG               ProcessorCount;
> +    ULONG               Index;
> 
>  #pragma prefast(suppress:28197) // Possibly leaking memory
> 'FunctionDeviceObject'
>      status = IoCreateDevice(DriverObject,
> @@ -2296,6 +2334,24 @@ FdoCreate(
>      if (!NT_SUCCESS(status))
>          goto fail10;
> 
> +    status = FDO_QUERY_INTERFACE(Fdo,
> +                                 XENBUS,
> +                                 EVTCHN,
> +                                 (PINTERFACE)&Fdo->EvtchnInterface,
> +                                 sizeof (Fdo->EvtchnInterface),
> +                                 FALSE);
> +    if (!NT_SUCCESS(status))
> +        goto fail11;
> +
> +    status = FDO_QUERY_INTERFACE(Fdo,
> +                                 XENBUS,
> +                                 GNTTAB,
> +                                 (PINTERFACE)&Fdo->GnttabInterface,
> +                                 sizeof (Fdo->GnttabInterface),
> +                                 FALSE);
> +    if (!NT_SUCCESS(status))
> +        goto fail12;
> +
>      InitializeMutex(&Fdo->Mutex);
>      InitializeListHead(&Dx->ListEntry);
>      Fdo->References = 1;
> @@ -2306,7 +2362,46 @@ FdoCreate(
> 
>      status = ThreadCreate(FdoRegistryThreadHandler, Fdo, &Fdo-
> >registryThread);
>      if (!NT_SUCCESS(status))
> -        goto fail11;
> +        goto fail13;
> +
> +    KeInitializeSpinLock(&Fdo->StoreWatchLock);
> +    InitializeListHead(&Fdo->StoreWatchList);
> +
> +    KeInitializeSpinLock(&Fdo->EvtchnLock);
> +    InitializeListHead(&Fdo->EvtchnList);
> +
> +    KeInitializeSpinLock(&Fdo->IrpQueueLock);
> +    InitializeListHead(&Fdo->IrpList);
> +
> +    KeInitializeSpinLock(&Fdo->GnttabCacheLock);
> +
> +    status = IoCsqInitializeEx(&Fdo->IrpQueue,
> +                               CsqInsertIrpEx,
> +                               CsqRemoveIrp,
> +                               CsqPeekNextIrp,
> +                               CsqAcquireLock,
> +                               CsqReleaseLock,
> +                               CsqCompleteCanceledIrp);
> +    if (!NT_SUCCESS(status))
> +        goto fail14;
> +
> +    ProcessorCount =
> KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
> +
> +    status = STATUS_NO_MEMORY;
> +    Fdo->EvtchnDpc = __FdoAllocate(sizeof (KDPC) * ProcessorCount);
> +    if (Fdo->EvtchnDpc == NULL)
> +        goto fail15;
> +
> +    for (Index = 0; Index < ProcessorCount; Index++) {
> +        PROCESSOR_NUMBER ProcNumber;
> +
> +        status = KeGetProcessorNumberFromIndex(Index, &ProcNumber);
> +        ASSERT(NT_SUCCESS(status));
> +
> +        KeInitializeDpc(&Fdo->EvtchnDpc[Index], EvtchnNotificationDpc,
> NULL);
> +        status = KeSetTargetProcessorDpcEx(&Fdo->EvtchnDpc[Index],
> &ProcNumber);
> +        ASSERT(NT_SUCCESS(status));
> +    }
> 
>      Info("%p (%s)\n",
>           FunctionDeviceObject,
> @@ -2317,6 +2412,27 @@ FdoCreate(
> 
>      return STATUS_SUCCESS;
> 
> +fail15:
> +    Error("fail15\n");
> +
> +fail14:
> +    Error("fail14\n");
> +
> +    ThreadAlert(Fdo->registryThread);
> +    ThreadJoin(Fdo->registryThread);
> +    Fdo->registryThread = NULL;
> +
> +fail13:
> +    Error("fail13\n");
> +
> +    RtlZeroMemory(&Fdo->GnttabInterface,
> +                  sizeof (XENBUS_GNTTAB_INTERFACE));
> +
> +fail12:
> +    Error("fail12\n");
> +
> +    RtlZeroMemory(&Fdo->EvtchnInterface,
> +                  sizeof (XENBUS_EVTCHN_INTERFACE));
> 
>  fail11:
>      Error("fail11\n");
> @@ -2394,7 +2510,8 @@ FdoDestroy(
>      )
>  {
>      PXENIFACE_DX          Dx = Fdo->Dx;
> -    PDEVICE_OBJECT      FunctionDeviceObject = Dx->DeviceObject;
> +    PDEVICE_OBJECT        FunctionDeviceObject = Dx->DeviceObject;
> +    ULONG                 ProcessorCount;
> 
>      ASSERT(IsListEmpty(&Dx->ListEntry));
>      ASSERT3U(Fdo->References, ==, 0);
> @@ -2408,10 +2525,34 @@ FdoDestroy(
> 
>      Dx->Fdo = NULL;
> 
> +    ProcessorCount =
> KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
> +    RtlZeroMemory(Fdo->EvtchnDpc, sizeof (KDPC) * ProcessorCount);
> +    __FdoFree(Fdo->EvtchnDpc);
> +
> +    RtlZeroMemory(&Fdo->GnttabCacheLock, sizeof (KSPIN_LOCK));
> +    ASSERT(IsListEmpty(&Fdo->IrpList));
> +    RtlZeroMemory(&Fdo->IrpList, sizeof (LIST_ENTRY));
> +    RtlZeroMemory(&Fdo->IrpQueueLock, sizeof (KSPIN_LOCK));
> +    RtlZeroMemory(&Fdo->IrpQueue, sizeof (IO_CSQ));
> +
> +    ASSERT(IsListEmpty(&Fdo->EvtchnList));
> +    RtlZeroMemory(&Fdo->EvtchnList, sizeof (LIST_ENTRY));
> +    RtlZeroMemory(&Fdo->EvtchnLock, sizeof (KSPIN_LOCK));
> +
> +    ASSERT(IsListEmpty(&Fdo->StoreWatchList));
> +    RtlZeroMemory(&Fdo->StoreWatchList, sizeof (LIST_ENTRY));
> +    RtlZeroMemory(&Fdo->StoreWatchLock, sizeof (KSPIN_LOCK));
> +
>      RtlZeroMemory(&Fdo->Mutex, sizeof (XENIFACE_MUTEX));
> 
>      Fdo->InterfacesAcquired = FALSE;
> 
> +    RtlZeroMemory(&Fdo->GnttabInterface,
> +                  sizeof (XENBUS_GNTTAB_INTERFACE));
> +
> +    RtlZeroMemory(&Fdo->EvtchnInterface,
> +                  sizeof (XENBUS_EVTCHN_INTERFACE));
> +
>      RtlZeroMemory(&Fdo->StoreInterface,
>                    sizeof (XENBUS_STORE_INTERFACE));
> 
> diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
> index c859338..781b1cc 100644
> --- a/src/xeniface/fdo.h
> +++ b/src/xeniface/fdo.h
> @@ -34,6 +34,8 @@
> 
>  #include <ntifs.h>
>  #include <store_interface.h>
> +#include <evtchn_interface.h>
> +#include <gnttab_interface.h>
>  #include <suspend_interface.h>
>  #include <shared_info_interface.h>
> 
> @@ -73,32 +75,44 @@ typedef struct _XENIFACE_FDO {
> 
>      FDO_RESOURCE                    Resource[RESOURCE_COUNT];
> 
> -
>      XENBUS_STORE_INTERFACE          StoreInterface;
> -
>      XENBUS_SUSPEND_INTERFACE        SuspendInterface;
> -
>      XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
> -
> +    XENBUS_EVTCHN_INTERFACE         EvtchnInterface;
> +    XENBUS_GNTTAB_INTERFACE         GnttabInterface;
>      PXENBUS_SUSPEND_CALLBACK        SuspendCallbackLate;
> 
> -    BOOLEAN						    InterfacesAcquired;
> +    BOOLEAN                         InterfacesAcquired;
> +
> +    KSPIN_LOCK                      StoreWatchLock;
> +    LIST_ENTRY                      StoreWatchList;
> +
> +    KSPIN_LOCK                      EvtchnLock;
> +    LIST_ENTRY                      EvtchnList;
> +    PKDPC                           EvtchnDpc;
> +
> +    KSPIN_LOCK                      GnttabCacheLock;
> +
> +    IO_CSQ                          IrpQueue;
> +    KSPIN_LOCK                      IrpQueueLock;
> +    LIST_ENTRY                      IrpList;
> +
> +    PXENBUS_GNTTAB_CACHE            GnttabCache;
> 
>      #define MAX_SESSIONS    (65536)
> 
> -    int							    WmiReady;
> +    int                             WmiReady;
> 
> -    USHORT						    Sessions;
> -    FAST_MUTEX					    SessionLock;
> -    LIST_ENTRY					    SessionHead;
> +    USHORT                          Sessions;
> +    FAST_MUTEX                      SessionLock;
> +    LIST_ENTRY                      SessionHead;
> 
> -    PXENIFACE_THREAD			    registryThread;
> -    KEVENT						    registryWriteEvent;
> +    PXENIFACE_THREAD                registryThread;
> +    KEVENT                          registryWriteEvent;
> 
> +    UNICODE_STRING                  SuggestedInstanceName;
> 
> -    UNICODE_STRING				    SuggestedInstanceName;
> -
> -    UNICODE_STRING				    InterfaceName;
> +    UNICODE_STRING                  InterfaceName;
> 
>  } XENIFACE_FDO, *PXENIFACE_FDO;
> 
> @@ -163,6 +177,4 @@ FdoDispatch(
>      IN  PIRP            Irp
>      );
> 
> -
> -
>  #endif  // _XENIFACE_FDO_H
> diff --git a/src/xeniface/ioctl_evtchn.c b/src/xeniface/ioctl_evtchn.c
> new file mode 100644
> index 0000000..93f1931
> --- /dev/null
> +++ b/src/xeniface/ioctl_evtchn.c
> @@ -0,0 +1,492 @@
> +/* Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
> + * 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 "driver.h"
> +#include "ioctls.h"
> +#include "xeniface_ioctls.h"
> +#include "log.h"
> +
> +_Function_class_(KDEFERRED_ROUTINE)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +_IRQL_requires_same_
> +VOID
> +EvtchnNotificationDpc(
> +    __in      PKDPC Dpc,
> +    __in_opt  PVOID _Context,
> +    __in_opt  PVOID Argument1,
> +    __in_opt  PVOID Argument2
> +    )
> +{
> +    PXENIFACE_EVTCHN_CONTEXT Context = Argument1;
> +
> +    UNREFERENCED_PARAMETER(Dpc);
> +    UNREFERENCED_PARAMETER(_Context);
> +    UNREFERENCED_PARAMETER(Argument2);
> +
> +    ASSERT(Context);
> +
> +#if DBG
> +    XenIfaceDebugPrint(INFO, "Channel %p, LocalPort %d, Cpu %lu\n",
> +                       Context->Channel, Context->LocalPort,
> KeGetCurrentProcessorNumber());
> +#endif
> +    KeSetEvent(Context->Event, 0, FALSE);
> +
> +    XENBUS_EVTCHN(Unmask,
> +                  &Context->Fdo->EvtchnInterface,
> +                  Context->Channel,
> +                  FALSE);
> +}
> +
> +_Function_class_(KSERVICE_ROUTINE)
> +_IRQL_requires_(HIGH_LEVEL)
> +_IRQL_requires_same_
> +static DECLSPEC_NOINLINE
> +BOOLEAN
> +EvtchnInterruptHandler(
> +    __in      PKINTERRUPT Interrupt,
> +    __in_opt  PVOID Argument
> +    )
> +{
> +    PXENIFACE_EVTCHN_CONTEXT Context = Argument;
> +    PROCESSOR_NUMBER ProcNumber;
> +    ULONG ProcIndex;
> +
> +    UNREFERENCED_PARAMETER(Interrupt);
> +    ASSERT(Context);
> +
> +    KeGetCurrentProcessorNumberEx(&ProcNumber);
> +    ProcIndex = KeGetProcessorIndexFromNumber(&ProcNumber);
> +    if (!KeInsertQueueDpc(&Context->Fdo->EvtchnDpc[ProcIndex], Context,
> NULL)) {
> +        XenIfaceDebugPrint(TRACE, "NOT INSERTED: Context %p, Port %lu, FO
> %p, Cpu %lu\n",
> +                           Context, Context->LocalPort, Context->FileObject,
> ProcIndex);
> +    }
> +
> +    return TRUE;
> +}
> +
> +_IRQL_requires_(PASSIVE_LEVEL) // needed for KeFlushQueuedDpcs
> +VOID
> +EvtchnFree(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_EVTCHN_CONTEXT Context
> +    )
> +{
> +    ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
> +
> +    XenIfaceDebugPrint(TRACE, "Context %p, LocalPort %d, FO %p\n",
> +                       Context, Context->LocalPort, Context->FileObject);
> +
> +    XENBUS_EVTCHN(Close,
> +                  &Fdo->EvtchnInterface,
> +                  Context->Channel);
> +
> +    // There may still be a pending event at this time.
> +    // Wait for our DPCs to complete.
> +    KeFlushQueuedDpcs();
> +
> +    ObDereferenceObject(Context->Event);
> +    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +}
> +
> +_Requires_exclusive_lock_held_(Fdo->EvtchnLock)
> +static
> +PXENIFACE_EVTCHN_CONTEXT
> +EvtchnFindChannel(
> +    __in      PXENIFACE_FDO Fdo,
> +    __in      ULONG         LocalPort,
> +    __in_opt  PFILE_OBJECT  FileObject
> +    )
> +{
> +    PXENIFACE_EVTCHN_CONTEXT Context, Found = NULL;
> +    PLIST_ENTRY Node;
> +
> +    Node = Fdo->EvtchnList.Flink;
> +    while (Node->Flink != Fdo->EvtchnList.Flink) {
> +        Context = CONTAINING_RECORD(Node, XENIFACE_EVTCHN_CONTEXT,
> Entry);
> +
> +        Node = Node->Flink;
> +        if (Context->LocalPort != LocalPort)
> +            continue;
> +
> +        if (FileObject != NULL &&
> +            FileObject != Context->FileObject) {
> +            continue;
> +        }
> +
> +        Found = Context;
> +        break;
> +    }
> +
> +    return Found;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnBindUnbound(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_BIND_UNBOUND_IN In = Buffer;
> +    PXENIFACE_EVTCHN_BIND_UNBOUND_OUT Out = Buffer;
> +    PXENIFACE_EVTCHN_CONTEXT Context;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_IN) ||
> +        OutLen != sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_OUT)) {
> +        goto fail1;
> +    }
> +
> +    status = STATUS_NO_MEMORY;
> +    Context = ExAllocatePoolWithTag(NonPagedPool,
> sizeof(XENIFACE_EVTCHN_CONTEXT), XENIFACE_POOL_TAG);
> +    if (Context == NULL)
> +        goto fail2;
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
> +    Context->FileObject = FileObject;
> +
> +    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, Mask %d, FO %p\n",
> +                       In->RemoteDomain, In->Mask, FileObject);
> +
> +    status = ObReferenceObjectByHandle(In->Event,
> +                                       EVENT_MODIFY_STATE,
> +                                       *ExEventObjectType,
> +                                       UserMode,
> +                                       &Context->Event,
> +                                       NULL);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    status = STATUS_UNSUCCESSFUL;
> +    Context->Channel = XENBUS_EVTCHN(Open,
> +                                     &Fdo->EvtchnInterface,
> +                                     XENBUS_EVTCHN_TYPE_UNBOUND,
> +                                     EvtchnInterruptHandler,
> +                                     Context,
> +                                     In->RemoteDomain,
> +                                     TRUE);
> +    if (Context->Channel == NULL)
> +        goto fail4;
> +
> +    Context->LocalPort = XENBUS_EVTCHN(GetPort,
> +                                       &Fdo->EvtchnInterface,
> +                                       Context->Channel);
> +
> +    Context->Fdo = Fdo;
> +
> +    ExInterlockedInsertTailList(&Fdo->EvtchnList, &Context->Entry, &Fdo-
> >EvtchnLock);
> +
> +    Out->LocalPort = Context->LocalPort;
> +    *Info = sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_OUT);
> +
> +    if (!In->Mask) {
> +        XENBUS_EVTCHN(Unmask,
> +                      &Fdo->EvtchnInterface,
> +                      Context->Channel,
> +                      FALSE);
> +    }
> +
> +    XenIfaceDebugPrint(TRACE, "< LocalPort %lu, Context %p\n", Context-
> >LocalPort, Context);
> +    return STATUS_SUCCESS;
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +    ObDereferenceObject(Context->Event);
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnBindInterdomain(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_BIND_INTERDOMAIN_IN In = Buffer;
> +    PXENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT Out = Buffer;
> +    PXENIFACE_EVTCHN_CONTEXT Context;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN) ||
> +        OutLen != sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT)) {
> +        goto fail1;
> +    }
> +
> +    status = STATUS_NO_MEMORY;
> +    Context = ExAllocatePoolWithTag(NonPagedPool,
> sizeof(XENIFACE_EVTCHN_CONTEXT), XENIFACE_POOL_TAG);
> +    if (Context == NULL)
> +        goto fail2;
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
> +    Context->FileObject = FileObject;
> +
> +    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, RemotePort %lu,
> Mask %d, FO %p\n",
> +                       In->RemoteDomain, In->RemotePort, In->Mask, FileObject);
> +
> +    status = ObReferenceObjectByHandle(In->Event,
> +                                       EVENT_MODIFY_STATE,
> +                                       *ExEventObjectType,
> +                                       UserMode,
> +                                       &Context->Event,
> +                                       NULL);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    status = STATUS_UNSUCCESSFUL;
> +    Context->Channel = XENBUS_EVTCHN(Open,
> +                                     &Fdo->EvtchnInterface,
> +                                     XENBUS_EVTCHN_TYPE_INTER_DOMAIN,
> +                                     EvtchnInterruptHandler,
> +                                     Context,
> +                                     In->RemoteDomain,
> +                                     In->RemotePort,
> +                                     TRUE);
> +    if (Context->Channel == NULL)
> +        goto fail4;
> +
> +    Context->LocalPort = XENBUS_EVTCHN(GetPort,
> +                                       &Fdo->EvtchnInterface,
> +                                       Context->Channel);
> +
> +    Context->Fdo = Fdo;
> +
> +    ExInterlockedInsertTailList(&Fdo->EvtchnList, &Context->Entry, &Fdo-
> >EvtchnLock);
> +
> +    Out->LocalPort = Context->LocalPort;
> +    *Info = sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT);
> +
> +    if (!In->Mask) {
> +        XENBUS_EVTCHN(Unmask,
> +                      &Fdo->EvtchnInterface,
> +                      Context->Channel,
> +                      FALSE);
> +    }
> +
> +    XenIfaceDebugPrint(TRACE, "< LocalPort %lu, Context %p\n", Context-
> >LocalPort, Context);
> +
> +    return STATUS_SUCCESS;
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +    ObDereferenceObject(Context->Event);
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnClose(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_CLOSE_IN In = Buffer;
> +    PXENIFACE_EVTCHN_CONTEXT Context;
> +    KIRQL Irql;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_EVTCHN_CLOSE_IN) ||
> +        OutLen != 0) {
> +        goto fail1;
> +    }
> +
> +    XenIfaceDebugPrint(TRACE, "> LocalPort %lu, FO %p\n", In->LocalPort,
> FileObject);
> +
> +    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
> +    status = STATUS_NOT_FOUND;
> +    Context = EvtchnFindChannel(Fdo, In->LocalPort, FileObject);
> +    if (Context == NULL)
> +        goto fail2;
> +
> +    RemoveEntryList(&Context->Entry);
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +    EvtchnFree(Fdo, Context);
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +_Requires_lock_not_held_(Fdo->EvtchnLock)
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +EvtchnNotify(
> +    __in      PXENIFACE_FDO Fdo,
> +    __in      ULONG         LocalPort,
> +    __in_opt  PFILE_OBJECT  FileObject
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_CONTEXT Context;
> +    KIRQL Irql;
> +
> +    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
> +
> +    Context = EvtchnFindChannel(Fdo, LocalPort, FileObject);
> +
> +    status = STATUS_NOT_FOUND;
> +    if (Context == NULL)
> +        goto fail1;
> +
> +    XENBUS_EVTCHN(Send,
> +                  &Fdo->EvtchnInterface,
> +                  Context->Channel);
> +
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +
> +    return STATUS_SUCCESS;
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnNotify(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_NOTIFY_IN In = Buffer;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_EVTCHN_NOTIFY_IN) ||
> +        OutLen != 0) {
> +        goto fail1;
> +    }
> +
> +#if DBG
> +    XenIfaceDebugPrint(INFO, "> LocalPort %d, FO %p\n", In->LocalPort,
> FileObject);
> +#endif
> +
> +    return EvtchnNotify(Fdo, In->LocalPort, FileObject);
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnUnmask(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_UNMASK_IN In = Buffer;
> +    PXENIFACE_EVTCHN_CONTEXT Context;
> +    KIRQL Irql;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_EVTCHN_UNMASK_IN) ||
> +        OutLen != 0) {
> +        goto fail1;
> +    }
> +
> +    XenIfaceDebugPrint(TRACE, "> LocalPort %d, FO %p\n", In->LocalPort,
> FileObject);
> +
> +    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
> +
> +    Context = EvtchnFindChannel(Fdo, In->LocalPort, FileObject);
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (Context == NULL)
> +        goto fail2;
> +
> +    XENBUS_EVTCHN(Unmask,
> +                  &Fdo->EvtchnInterface,
> +                  Context->Channel,
> +                  FALSE);
> +
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> diff --git a/src/xeniface/ioctl_gnttab.c b/src/xeniface/ioctl_gnttab.c
> new file mode 100644
> index 0000000..a24a5ee
> --- /dev/null
> +++ b/src/xeniface/ioctl_gnttab.c
> @@ -0,0 +1,747 @@
> +/* Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
> + * 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 "driver.h"
> +#include "ioctls.h"
> +#include "xeniface_ioctls.h"
> +#include "log.h"
> +#include "irp_queue.h"
> +
> +// Complete a canceled gnttab IRP, cleanup associated grant/map.
> +_Function_class_(IO_WORKITEM_ROUTINE)
> +VOID
> +CompleteGnttabIrp(
> +    __in      PDEVICE_OBJECT DeviceObject,
> +    __in_opt  PVOID          Context
> +    )
> +{
> +    PXENIFACE_DX Dx = (PXENIFACE_DX)DeviceObject->DeviceExtension;
> +    PXENIFACE_FDO Fdo = Dx->Fdo;
> +    PIRP Irp = Context;
> +    PXENIFACE_CONTEXT_ID Id;
> +    PIO_WORKITEM WorkItem;
> +    KAPC_STATE ApcState;
> +    BOOLEAN ChangeProcess;
> +
> +    ASSERT(Context != NULL);
> +
> +    Id = Irp->Tail.Overlay.DriverContext[0];
> +    WorkItem = Irp->Tail.Overlay.DriverContext[1];
> +
> +    // We are not guaranteed to be in the context of the process that
> initiated the IRP,
> +    // but we need to be there to unmap memory.
> +    ChangeProcess = PsGetCurrentProcess() != Id->Process;
> +    if (ChangeProcess) {
> +        XenIfaceDebugPrint(TRACE, "Changing process from %p to %p\n",
> PsGetCurrentProcess(), Id->Process);
> +        KeStackAttachProcess(Id->Process, &ApcState);
> +    }
> +
> +    XenIfaceDebugPrint(TRACE, "Irp %p, Process %p, Id %lu, Type %d, IRQL
> %d\n",
> +                       Irp, Id->Process, Id->RequestId, Id->Type, KeGetCurrentIrql());
> +
> +    switch (Id->Type) {
> +
> +    case XENIFACE_CONTEXT_GRANT:
> +        GnttabFreeGrant(Fdo, CONTAINING_RECORD(Id,
> XENIFACE_GRANT_CONTEXT, Id));
> +        break;
> +
> +    case XENIFACE_CONTEXT_MAP:
> +        GnttabFreeMap(Fdo, CONTAINING_RECORD(Id,
> XENIFACE_MAP_CONTEXT, Id));
> +        break;
> +
> +    default:
> +        ASSERT(FALSE);
> +    }
> +
> +    if (ChangeProcess)
> +        KeUnstackDetachProcess(&ApcState);
> +
> +    IoFreeWorkItem(WorkItem);
> +
> +    Irp->IoStatus.Status = STATUS_CANCELLED;
> +    Irp->IoStatus.Information = 0;
> +    IoCompleteRequest(Irp, IO_NO_INCREMENT);
> +}
> +
> +_Acquires_exclusive_lock_(((PXENIFACE_FDO)Argument)-
> >GnttabCacheLock)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +VOID
> +GnttabAcquireLock(
> +    __in  PVOID Argument
> +    )
> +{
> +    PXENIFACE_FDO Fdo = Argument;
> +
> +    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
> +
> +    KeAcquireSpinLockAtDpcLevel(&Fdo->GnttabCacheLock);
> +}
> +
> +_Releases_exclusive_lock_(((PXENIFACE_FDO)Argument)-
> >GnttabCacheLock)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +VOID
> +GnttabReleaseLock(
> +    __in  PVOID Argument
> +    )
> +{
> +    PXENIFACE_FDO Fdo = Argument;
> +
> +    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
> +
> +    KeReleaseSpinLockFromDpcLevel(&Fdo->GnttabCacheLock);
> +}
> +
> +_Requires_lock_not_held_(Fdo->IrpQueueLock)
> +static
> +PIRP
> +FindGnttabIrp(
> +    __in  PXENIFACE_FDO Fdo,
> +    __in  PXENIFACE_CONTEXT_ID Id
> +    )
> +{
> +    KIRQL Irql;
> +    PIRP Irp;
> +
> +    CsqAcquireLock(&Fdo->IrpQueue, &Irql);
> +    Irp = CsqPeekNextIrp(&Fdo->IrpQueue, NULL, Id);
> +    CsqReleaseLock(&Fdo->IrpQueue, Irql);
> +    return Irp;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabPermitForeignAccess(
> +    __in     PXENIFACE_FDO  Fdo,
> +    __in     PVOID          Buffer,
> +    __in     ULONG          InLen,
> +    __in     ULONG          OutLen,
> +    __inout  PIRP           Irp
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN In;
> +    PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT Out = Irp-
> >UserBuffer;
> +    PXENIFACE_GRANT_CONTEXT Context;
> +    ULONG Page;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN))
> +        goto fail1;
> +
> +    // This IOCTL uses METHOD_NEITHER so we directly access user memory.
> +    status = __CaptureUserBuffer(Buffer, InLen, &In);
> +    if (!NT_SUCCESS(status))
> +        goto fail2;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (In->NumberPages == 0 ||
> +        In->NumberPages > 1024 * 1024) {
> +        goto fail3;
> +    }
> +
> +    if ((In->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) &&
> +        (In->NotifyOffset >= In->NumberPages * PAGE_SIZE)) {
> +        goto fail4;
> +    }
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (OutLen !=
> (ULONG)FIELD_OFFSET(XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OU
> T, References[In->NumberPages]))
> +        goto fail5;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context = ExAllocatePoolWithTag(NonPagedPool,
> sizeof(XENIFACE_GRANT_CONTEXT), XENIFACE_POOL_TAG);
> +    if (Context == NULL)
> +        goto fail6;
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
> +    Context->Id.Type = XENIFACE_CONTEXT_GRANT;
> +    Context->Id.Process = PsGetCurrentProcess();
> +    Context->Id.RequestId = In->RequestId;
> +    Context->RemoteDomain = In->RemoteDomain;
> +    Context->NumberPages = In->NumberPages;
> +    Context->Flags = In->Flags;
> +    Context->NotifyOffset = In->NotifyOffset;
> +    Context->NotifyPort = In->NotifyPort;
> +
> +    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, NumberPages %lu,
> Flags 0x%x, Offset 0x%x, Port %d, Process %p, Id %lu\n",
> +                       Context->RemoteDomain, Context->NumberPages, Context-
> >Flags, Context->NotifyOffset, Context->NotifyPort,
> +                       Context->Id.Process, Context->Id.RequestId);
> +
> +    // Check if the request ID is unique for this process.
> +    // This doesn't protect us from simultaneous requests with the same ID
> arriving here
> +    // but another check for duplicate ID is performed when the context/IRP
> is queued at the end.
> +    // Ideally we would lock the whole section but that's not really an option
> since we touch user memory.
> +    status = STATUS_INVALID_PARAMETER;
> +    if (FindGnttabIrp(Fdo, &Context->Id) != NULL)
> +        goto fail7;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context->Grants = ExAllocatePoolWithTag(NonPagedPool, Context-
> >NumberPages * sizeof(PXENBUS_GNTTAB_ENTRY),
> XENIFACE_POOL_TAG);
> +    if (Context->Grants == NULL)
> +        goto fail8;
> +
> +    RtlZeroMemory(Context->Grants, Context->NumberPages *
> sizeof(PXENBUS_GNTTAB_ENTRY));
> +
> +    // allocate memory to share
> +    status = STATUS_NO_MEMORY;
> +    Context->KernelVa = ExAllocatePoolWithTag(NonPagedPool, Context-
> >NumberPages * PAGE_SIZE, XENIFACE_POOL_TAG);
> +    if (Context->KernelVa == NULL)
> +        goto fail9;
> +
> +    RtlZeroMemory(Context->KernelVa, Context->NumberPages *
> PAGE_SIZE);
> +    Context->Mdl = IoAllocateMdl(Context->KernelVa, Context-
> >NumberPages * PAGE_SIZE, FALSE, FALSE, NULL);
> +    if (Context->Mdl == NULL)
> +        goto fail10;
> +
> +    MmBuildMdlForNonPagedPool(Context->Mdl);
> +    ASSERT(MmGetMdlByteCount(Context->Mdl) == Context-
> >NumberPages * PAGE_SIZE);
> +
> +    // perform sharing
> +    for (Page = 0; Page < Context->NumberPages; Page++) {
> +        status = XENBUS_GNTTAB(PermitForeignAccess,
> +                               &Fdo->GnttabInterface,
> +                               Fdo->GnttabCache,
> +                               FALSE,
> +                               Context->RemoteDomain,
> +                               MmGetMdlPfnArray(Context->Mdl)[Page],
> +                               (Context->Flags & XENIFACE_GNTTAB_READONLY) != 0,
> +                               &(Context->Grants[Page]));
> +
> +// prefast somehow thinks that this call can modify Page...
> +#pragma prefast(suppress:6385)
> +        XenIfaceDebugPrint(INFO, "Grants[%lu] = %p\n", Page, Context-
> >Grants[Page]);
> +        if (!NT_SUCCESS(status))
> +            goto fail11;
> +    }
> +
> +    // map into user mode
> +#pragma prefast(suppress:6320) // we want to catch all exceptions
> +    __try {
> +        Context->UserVa = MmMapLockedPagesSpecifyCache(Context->Mdl,
> +                                                       UserMode,
> +                                                       MmCached,
> +                                                       NULL,
> +                                                       FALSE,
> +                                                       NormalPagePriority);
> +    }
> +    __except (EXCEPTION_EXECUTE_HANDLER) {
> +        status = GetExceptionCode();
> +        goto fail12;
> +    }
> +
> +    status = STATUS_UNSUCCESSFUL;
> +    if (Context->UserVa == NULL)
> +        goto fail13;
> +
> +    XenIfaceDebugPrint(TRACE, "< Context %p, Irp %p, KernelVa %p, UserVa
> %p\n",
> +                       Context, Irp, Context->KernelVa, Context->UserVa);
> +
> +    // Pass the result to user mode.
> +#pragma prefast(suppress: 6320) // we want to catch all exceptions
> +    try {
> +        ProbeForWrite(Out, OutLen, 1);
> +        Out->Address = Context->UserVa;
> +
> +        for (Page = 0; Page < Context->NumberPages; Page++) {
> +            Out->References[Page] = XENBUS_GNTTAB(GetReference,
> +                                                  &Fdo->GnttabInterface,
> +                                                  Context->Grants[Page]);
> +        }
> +    } except(EXCEPTION_EXECUTE_HANDLER) {
> +        status = GetExceptionCode();
> +        XenIfaceDebugPrint(ERROR, "Exception 0x%lx while probing/writing
> output buffer at %p, size 0x%lx\n", status, Out, OutLen);
> +        goto fail14;
> +    }
> +
> +    // Insert the IRP/context into the pending queue.
> +    // This also checks (again) if the request ID is unique for the calling
> process.
> +    Irp->Tail.Overlay.DriverContext[0] = &Context->Id;
> +    status = IoCsqInsertIrpEx(&Fdo->IrpQueue, Irp, NULL, &Context->Id);
> +    if (!NT_SUCCESS(status))
> +        goto fail15;
> +
> +    __FreeCapturedBuffer(In);
> +
> +    return STATUS_PENDING;
> +
> +fail15:
> +    XenIfaceDebugPrint(ERROR, "Fail15\n");
> +
> +fail14:
> +    XenIfaceDebugPrint(ERROR, "Fail14\n");
> +    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
> +
> +fail13:
> +    XenIfaceDebugPrint(ERROR, "Fail13\n");
> +
> +fail12:
> +    XenIfaceDebugPrint(ERROR, "Fail12\n");
> +
> +fail11:
> +    XenIfaceDebugPrint(ERROR, "Fail11: Page = %lu\n", Page);
> +
> +    while (Page > 0) {
> +        ASSERT(NT_SUCCESS(XENBUS_GNTTAB(RevokeForeignAccess,
> +                                        &Fdo->GnttabInterface,
> +                                        Fdo->GnttabCache,
> +                                        FALSE,
> +                                        Context->Grants[Page - 1])));
> +
> +        --Page;
> +    }
> +    IoFreeMdl(Context->Mdl);
> +
> +fail10:
> +    XenIfaceDebugPrint(ERROR, "Fail10\n");
> +    ExFreePoolWithTag(Context->KernelVa, XENIFACE_POOL_TAG);
> +
> +fail9:
> +    XenIfaceDebugPrint(ERROR, "Fail9\n");
> +    ExFreePoolWithTag(Context->Grants, XENIFACE_POOL_TAG);
> +
> +fail8:
> +    XenIfaceDebugPrint(ERROR, "Fail8\n");
> +
> +fail7:
> +    XenIfaceDebugPrint(ERROR, "Fail7\n");
> +    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +
> +fail6:
> +    XenIfaceDebugPrint(ERROR, "Fail6\n");
> +
> +fail5:
> +    XenIfaceDebugPrint(ERROR, "Fail5\n");
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +    __FreeCapturedBuffer(In);
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +_IRQL_requires_max_(APC_LEVEL)
> +VOID
> +GnttabFreeGrant(
> +    __in     PXENIFACE_FDO            Fdo,
> +    __inout  PXENIFACE_GRANT_CONTEXT  Context
> +)
> +{
> +    NTSTATUS status;
> +    ULONG Page;
> +
> +    ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
> +
> +    XenIfaceDebugPrint(TRACE, "Context %p\n", Context);
> +
> +    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) {
> +        ((PCHAR)Context->KernelVa)[Context->NotifyOffset] = 0;
> +    }
> +
> +    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_PORT) {
> +        status = EvtchnNotify(Fdo, Context->NotifyPort, NULL);
> +
> +        if (!NT_SUCCESS(status)) // non-fatal, we must free memory
> +            XenIfaceDebugPrint(ERROR, "failed to notify port %lu: 0x%x\n",
> Context->NotifyPort, status);
> +    }
> +
> +    // unmap from user address space
> +    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
> +
> +    // stop sharing
> +    for (Page = 0; Page < Context->NumberPages; Page++) {
> +        status = XENBUS_GNTTAB(RevokeForeignAccess,
> +                               &Fdo->GnttabInterface,
> +                               Fdo->GnttabCache,
> +                               FALSE,
> +                               Context->Grants[Page]);
> +
> +        ASSERT(NT_SUCCESS(status)); // failure here is fatal, something
> must've gone catastrophically wrong
> +    }
> +
> +    IoFreeMdl(Context->Mdl);
> +
> +    RtlZeroMemory(Context->KernelVa, Context->NumberPages *
> PAGE_SIZE);
> +    ExFreePoolWithTag(Context->KernelVa, XENIFACE_POOL_TAG);
> +
> +    RtlZeroMemory(Context->Grants, Context->NumberPages *
> sizeof(PXENBUS_GNTTAB_ENTRY));
> +    ExFreePoolWithTag(Context->Grants, XENIFACE_POOL_TAG);
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabRevokeForeignAccess(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN In = Buffer;
> +    PXENIFACE_GRANT_CONTEXT Context = NULL;
> +    XENIFACE_CONTEXT_ID Id;
> +    PIRP PendingIrp;
> +    PXENIFACE_CONTEXT_ID ContextId;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN))
> +        goto fail1;
> +
> +    Id.Type = XENIFACE_CONTEXT_GRANT;
> +    Id.Process = PsGetCurrentProcess();
> +    Id.RequestId = In->RequestId;
> +
> +    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process,
> Id.RequestId);
> +
> +    status = STATUS_NOT_FOUND;
> +    PendingIrp = IoCsqRemoveNextIrp(&Fdo->IrpQueue, &Id);
> +    if (PendingIrp == NULL)
> +        goto fail2;
> +
> +    ContextId = PendingIrp->Tail.Overlay.DriverContext[0];
> +    Context = CONTAINING_RECORD(ContextId,
> XENIFACE_GRANT_CONTEXT, Id);
> +    GnttabFreeGrant(Fdo, Context);
> +
> +    PendingIrp->IoStatus.Status = STATUS_SUCCESS;
> +    PendingIrp->IoStatus.Information = 0;
> +    IoCompleteRequest(PendingIrp, IO_NO_INCREMENT);
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabMapForeignPages(
> +    __in     PXENIFACE_FDO     Fdo,
> +    __in     PVOID             Buffer,
> +    __in     ULONG             InLen,
> +    __in     ULONG             OutLen,
> +    __inout  PIRP              Irp
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN In = Buffer;
> +    PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT Out = Irp-
> >UserBuffer;
> +    ULONG NumberPages;
> +    ULONG PageIndex;
> +    PXENIFACE_MAP_CONTEXT Context;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen < sizeof(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN) ||
> +        OutLen != sizeof(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT)) {
> +        goto fail1;
> +    }
> +
> +    // This IOCTL uses METHOD_NEITHER so we directly access user memory.
> +
> +    // Calculate the expected number of pages based on input buffer size.
> +    NumberPages = (InLen -
> (ULONG)FIELD_OFFSET(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN,
> References)) / sizeof(In->References[0]);
> +
> +    status = __CaptureUserBuffer(Buffer, InLen, &In);
> +    if (!NT_SUCCESS(status))
> +        goto fail2;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (In->NumberPages == 0 ||
> +        In->NumberPages > 1024 * 1024 ||
> +        In->NumberPages != NumberPages) {
> +        goto fail3;
> +    }
> +
> +    if ((In->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) &&
> +        (In->NotifyOffset >= In->NumberPages * PAGE_SIZE)) {
> +        goto fail4;
> +    }
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen !=
> (ULONG)FIELD_OFFSET(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN,
> References[In->NumberPages]))
> +        goto fail5;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context = ExAllocatePoolWithTag(NonPagedPool,
> sizeof(XENIFACE_MAP_CONTEXT), XENIFACE_POOL_TAG);
> +    if (Context == NULL)
> +        goto fail6;
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
> +    Context->Id.Type = XENIFACE_CONTEXT_MAP;
> +    Context->Id.Process = PsGetCurrentProcess();
> +    Context->Id.RequestId = In->RequestId;
> +    Context->RemoteDomain = In->RemoteDomain;
> +    Context->NumberPages = In->NumberPages;
> +    Context->Flags = In->Flags;
> +    Context->NotifyOffset = In->NotifyOffset;
> +    Context->NotifyPort = In->NotifyPort;
> +
> +    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, NumberPages %lu,
> Flags 0x%x, Offset 0x%x, Port %d, Process %p, Id %lu\n",
> +                       Context->RemoteDomain, Context->NumberPages, Context-
> >Flags, Context->NotifyOffset, Context->NotifyPort,
> +                       Context->Id.Process, Context->Id.RequestId);
> +
> +    for (PageIndex = 0; PageIndex < In->NumberPages; PageIndex++)
> +        XenIfaceDebugPrint(INFO, "> Ref %d\n", In->References[PageIndex]);
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (FindGnttabIrp(Fdo, &Context->Id) != NULL)
> +        goto fail7;
> +
> +    status = XENBUS_GNTTAB(MapForeignPages,
> +                           &Fdo->GnttabInterface,
> +                           Context->RemoteDomain,
> +                           Context->NumberPages,
> +                           In->References,
> +                           Context->Flags & XENIFACE_GNTTAB_READONLY,
> +                           &Context->Address);
> +
> +    if (!NT_SUCCESS(status))
> +        goto fail8;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context->KernelVa = MmMapIoSpace(Context->Address, Context-
> >NumberPages * PAGE_SIZE, MmCached);
> +    if (Context->KernelVa == NULL)
> +        goto fail9;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context->Mdl = IoAllocateMdl(Context->KernelVa, Context-
> >NumberPages * PAGE_SIZE, FALSE, FALSE, NULL);
> +    if (Context->Mdl == NULL)
> +        goto fail10;
> +
> +    MmBuildMdlForNonPagedPool(Context->Mdl);
> +
> +    // map into user mode
> +#pragma prefast(suppress: 6320) // we want to catch all exceptions
> +    __try {
> +        Context->UserVa = MmMapLockedPagesSpecifyCache(Context->Mdl,
> +                                                       UserMode,
> +                                                       MmCached,
> +                                                       NULL,
> +                                                       FALSE,
> +                                                       NormalPagePriority);
> +    }
> +    __except (EXCEPTION_EXECUTE_HANDLER) {
> +        status = GetExceptionCode();
> +        goto fail11;
> +    }
> +
> +    status = STATUS_UNSUCCESSFUL;
> +    if (Context->UserVa == NULL)
> +        goto fail12;
> +
> +    XenIfaceDebugPrint(TRACE, "< Context %p, Irp %p, Address %p, KernelVa
> %p, UserVa %p\n",
> +                       Context, Irp, Context->Address, Context->KernelVa, Context-
> >UserVa);
> +
> +    // Pass the result to user mode.
> +#pragma prefast(suppress: 6320) // we want to catch all exceptions
> +    try {
> +        ProbeForWrite(Out, OutLen, 1);
> +        Out->Address = Context->UserVa;
> +    } except(EXCEPTION_EXECUTE_HANDLER) {
> +        status = GetExceptionCode();
> +        XenIfaceDebugPrint(ERROR, "Exception 0x%lx while probing/writing
> output buffer at %p, size 0x%lx\n", status, Out, OutLen);
> +        goto fail13;
> +    }
> +
> +    // Insert the IRP/context into the pending queue.
> +    // This also checks (again) if the request ID is unique for the calling
> process.
> +    Irp->Tail.Overlay.DriverContext[0] = &Context->Id;
> +    status = IoCsqInsertIrpEx(&Fdo->IrpQueue, Irp, NULL, &Context->Id);
> +    if (!NT_SUCCESS(status))
> +        goto fail14;
> +
> +    __FreeCapturedBuffer(In);
> +
> +    return STATUS_PENDING;
> +
> +fail14:
> +    XenIfaceDebugPrint(ERROR, "Fail14\n");
> +
> +fail13:
> +    XenIfaceDebugPrint(ERROR, "Fail13\n");
> +    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
> +
> +fail12:
> +    XenIfaceDebugPrint(ERROR, "Fail12\n");
> +
> +fail11:
> +    XenIfaceDebugPrint(ERROR, "Fail11\n");
> +    IoFreeMdl(Context->Mdl);
> +
> +fail10:
> +    XenIfaceDebugPrint(ERROR, "Fail10\n");
> +    MmUnmapIoSpace(Context->KernelVa, Context->NumberPages *
> PAGE_SIZE);
> +
> +fail9:
> +    XenIfaceDebugPrint(ERROR, "Fail9\n");
> +    ASSERT(NT_SUCCESS(XENBUS_GNTTAB(UnmapForeignPages,
> +                                    &Fdo->GnttabInterface,
> +                                    Context->Address
> +                                    )));
> +
> +fail8:
> +    XenIfaceDebugPrint(ERROR, "Fail8\n");
> +
> +fail7:
> +    XenIfaceDebugPrint(ERROR, "Fail7\n");
> +    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +
> +fail6:
> +    XenIfaceDebugPrint(ERROR, "Fail6\n");
> +
> +fail5:
> +    XenIfaceDebugPrint(ERROR, "Fail5\n");
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +    __FreeCapturedBuffer(In);
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +_IRQL_requires_max_(APC_LEVEL)
> +DECLSPEC_NOINLINE
> +VOID
> +GnttabFreeMap(
> +    __in     PXENIFACE_FDO            Fdo,
> +    __inout  PXENIFACE_MAP_CONTEXT    Context
> +    )
> +{
> +    NTSTATUS status;
> +
> +    ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
> +
> +    XenIfaceDebugPrint(TRACE, "Context %p\n", Context);
> +
> +    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) {
> +        ((PCHAR)Context->KernelVa)[Context->NotifyOffset] = 0;
> +    }
> +
> +    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_PORT) {
> +        status = EvtchnNotify(Fdo, Context->NotifyPort, NULL);
> +
> +        if (!NT_SUCCESS(status)) // non-fatal, we must free memory
> +            XenIfaceDebugPrint(ERROR, "failed to notify port %lu: 0x%x\n",
> Context->NotifyPort, status);
> +    }
> +
> +    // unmap from user address space
> +    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
> +
> +    IoFreeMdl(Context->Mdl);
> +
> +    // unmap from system space
> +    MmUnmapIoSpace(Context->KernelVa, Context->NumberPages *
> PAGE_SIZE);
> +
> +    // undo mapping
> +    status = XENBUS_GNTTAB(UnmapForeignPages,
> +                           &Fdo->GnttabInterface,
> +                           Context->Address);
> +
> +    ASSERT(NT_SUCCESS(status));
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabUnmapForeignPages(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN In = Buffer;
> +    PXENIFACE_MAP_CONTEXT Context = NULL;
> +    XENIFACE_CONTEXT_ID Id;
> +    PIRP PendingIrp;
> +    PXENIFACE_CONTEXT_ID ContextId;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN) &&
> +        OutLen != 0) {
> +        goto fail1;
> +    }
> +
> +    Id.Type = XENIFACE_CONTEXT_MAP;
> +    Id.Process = PsGetCurrentProcess();
> +    Id.RequestId = In->RequestId;
> +
> +    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process,
> Id.RequestId);
> +
> +    status = STATUS_NOT_FOUND;
> +    PendingIrp = IoCsqRemoveNextIrp(&Fdo->IrpQueue, &Id);
> +    if (PendingIrp == NULL)
> +        goto fail2;
> +
> +    ContextId = PendingIrp->Tail.Overlay.DriverContext[0];
> +    Context = CONTAINING_RECORD(ContextId, XENIFACE_MAP_CONTEXT,
> Id);
> +    GnttabFreeMap(Fdo, Context);
> +
> +    PendingIrp->IoStatus.Status = STATUS_SUCCESS;
> +    PendingIrp->IoStatus.Information = 0;
> +    IoCompleteRequest(PendingIrp, IO_NO_INCREMENT);
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> diff --git a/src/xeniface/ioctl_store.c b/src/xeniface/ioctl_store.c
> new file mode 100644
> index 0000000..5bd4649
> --- /dev/null
> +++ b/src/xeniface/ioctl_store.c
> @@ -0,0 +1,608 @@
> +/* Copyright (c) Citrix Systems Inc.
> + * Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
> + * 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 "driver.h"
> +#include "ioctls.h"
> +#include "xeniface_ioctls.h"
> +#include "log.h"
> +
> +#define XENSTORE_ABS_PATH_MAX 3072
> +#define XENSTORE_REL_PATH_MAX 2048
> +
> +static FORCEINLINE
> +BOOLEAN
> +__IsValidStr(
> +    __in  PCHAR             Str,
> +    __in  ULONG             Len
> +    )
> +{
> +    for ( ; Len--; ++Str) {
> +        if (*Str == '\0')
> +            return TRUE;
> +        if (!isprint((unsigned char)*Str))
> +            break;
> +    }
> +    return FALSE;
> +}
> +
> +static FORCEINLINE
> +ULONG
> +__MultiSzLen(
> +    __in  PCHAR             Str,
> +    __out PULONG            Count
> +    )
> +{
> +    ULONG Length = 0;
> +    if (Count)  *Count = 0;
> +    do {
> +        for ( ; *Str; ++Str, ++Length) ;
> +        ++Str; ++Length;
> +        if (*Count) ++(*Count);
> +    } while (*Str);
> +    return Length;
> +}
> +
> +static FORCEINLINE
> +VOID
> +__DisplayMultiSz(
> +    __in PCHAR              Caller,
> +    __in PCHAR              Str
> +    )
> +{
> +    PCHAR   Ptr;
> +    ULONG   Idx;
> +    ULONG   Len;
> +
> +    for (Ptr = Str, Idx = 0; *Ptr; ++Idx) {
> +        Len = (ULONG)strlen(Ptr);
> +        XenIfaceDebugPrint(TRACE, "|%s: [%d]=(%d)->\"%s\"\n", Caller, Idx,
> Len, Ptr);
> +        Ptr += (Len + 1);
> +    }
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRead(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS    status;
> +    PCHAR       Value;
> +    ULONG       Length;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen == 0)
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (!__IsValidStr(Buffer, InLen))
> +        goto fail2;
> +
> +    status = XENBUS_STORE(Read, &Fdo->StoreInterface, NULL, NULL,
> Buffer, &Value);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    Length = (ULONG)strlen(Value) + 1;
> +
> +    status = STATUS_BUFFER_OVERFLOW;
> +    if (OutLen == 0) {
> +        XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)\n", Buffer, Length);
> +        goto done;
> +    }
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (OutLen < Length)
> +        goto fail4;
> +
> +    XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)->\"%s\"\n", Buffer, Length,
> Value);
> +
> +    RtlCopyMemory(Buffer, Value, Length);
> +    Buffer[Length - 1] = 0;
> +    status = STATUS_SUCCESS;
> +
> +done:
> +    *Info = (ULONG_PTR)Length;
> +    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> +    return status;
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")=(%d < %d)\n", Buffer,
> OutLen, Length);
> +    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreWrite(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    )
> +{
> +    NTSTATUS    status;
> +    PCHAR       Value;
> +    ULONG       Length;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen == 0 || OutLen != 0)
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (!__IsValidStr(Buffer, InLen))
> +        goto fail2;
> +
> +    Length = (ULONG)strlen(Buffer) + 1;
> +    Value = Buffer + Length;
> +
> +    if (!__IsValidStr(Value, InLen - Length))
> +        goto fail3;
> +
> +    status = XENBUS_STORE(Printf, &Fdo->StoreInterface, NULL, NULL,
> Buffer, Value);
> +    if (!NT_SUCCESS(status))
> +        goto fail4;
> +
> +    XenIfaceDebugPrint(TRACE, "(\"%s\"=\"%s\")\n", Buffer, Value);
> +    return status;
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")\n", Value);
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreDirectory(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS    status;
> +    PCHAR       Value;
> +    ULONG       Length;
> +    ULONG       Count;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen == 0)
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (!__IsValidStr(Buffer, InLen))
> +        goto fail2;
> +
> +    status = XENBUS_STORE(Directory, &Fdo->StoreInterface, NULL, NULL,
> Buffer, &Value);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    Length = __MultiSzLen(Value, &Count) + 1;
> +
> +    status = STATUS_BUFFER_OVERFLOW;
> +    if (OutLen == 0) {
> +        XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)(%d)\n", Buffer, Length,
> Count);
> +        goto done;
> +    }
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (OutLen < Length)
> +        goto fail4;
> +
> +    XenIfaceDebugPrint(INFO, "(\"%s\")=(%d)(%d)\n", Buffer, Length,
> Count);
> +#if DBG
> +    __DisplayMultiSz(__FUNCTION__, Value);
> +#endif
> +
> +    RtlCopyMemory(Buffer, Value, Length);
> +    Buffer[Length - 2] = 0;
> +    Buffer[Length - 1] = 0;
> +    status = STATUS_SUCCESS;
> +
> +done:
> +    *Info = (ULONG_PTR)Length;
> +    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> +    return status;
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")=(%d < %d)\n", Buffer,
> OutLen, Length);
> +    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRemove(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    )
> +{
> +    NTSTATUS    status;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen == 0 || OutLen != 0)
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (!__IsValidStr(Buffer, InLen))
> +        goto fail2;
> +
> +    status = XENBUS_STORE(Remove, &Fdo->StoreInterface, NULL, NULL,
> Buffer);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    XenIfaceDebugPrint(TRACE, "(\"%s\")\n", Buffer);
> +    return status;
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +static
> +PXENBUS_STORE_PERMISSION
> +__ConvertPermissions(
> +    __in  ULONG                       NumberPermissions,
> +    __in  PXENIFACE_STORE_PERMISSION  XenifacePermissions
> +)
> +{
> +    PXENBUS_STORE_PERMISSION          XenbusPermissions;
> +    ULONG                             Index;
> +
> +    if (NumberPermissions > 255)
> +        goto fail1;
> +
> +    XenbusPermissions = ExAllocatePoolWithTag(NonPagedPool,
> NumberPermissions * sizeof(XENBUS_STORE_PERMISSION),
> XENIFACE_POOL_TAG);
> +    if (XenbusPermissions == NULL)
> +        goto fail2;
> +
> +    // Currently XENIFACE_STORE_PERMISSION is the same as
> XENBUS_STORE_PERMISSION,
> +    // but we convert them here in case something changes in the future.
> +    for (Index = 0; Index < NumberPermissions; Index++) {
> +        if ((XenifacePermissions[Index].Mask &
> ~XENIFACE_STORE_ALLOWED_PERMISSIONS) != 0)
> +            goto fail3;
> +
> +        XenbusPermissions[Index].Domain =
> XenifacePermissions[Index].Domain;
> +        XenbusPermissions[Index].Mask =
> (XENBUS_STORE_PERMISSION_MASK)XenifacePermissions[Index].Mask;
> +    }
> +
> +    return XenbusPermissions;
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +    ExFreePoolWithTag(XenbusPermissions, XENIFACE_POOL_TAG);
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1\n");
> +    return NULL;
> +}
> +
> +static
> +VOID
> +__FreePermissions(
> +    __in  PXENBUS_STORE_PERMISSION    Permissions
> +    )
> +{
> +    ExFreePoolWithTag(Permissions, XENIFACE_POOL_TAG);
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreSetPermissions(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_STORE_SET_PERMISSIONS_IN In = Buffer;
> +    PXENBUS_STORE_PERMISSION Permissions;
> +    ULONG Index;
> +    PCHAR Path;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen < sizeof(XENIFACE_STORE_SET_PERMISSIONS_IN) ||
> +        OutLen != 0) {
> +        goto fail1;
> +    }
> +
> +    if (InLen !=
> (ULONG)FIELD_OFFSET(XENIFACE_STORE_SET_PERMISSIONS_IN,
> Permissions[In->NumberPermissions]))
> +        goto fail2;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (In->PathLength == 0 ||
> +        In->PathLength > XENSTORE_ABS_PATH_MAX) {
> +        goto fail3;
> +    }
> +
> +    Permissions = __ConvertPermissions(In->NumberPermissions, In-
> >Permissions);
> +    if (Permissions == NULL)
> +        goto fail4;
> +
> +    status = __CaptureUserBuffer(In->Path, In->PathLength, &Path);
> +    if (!NT_SUCCESS(status))
> +        goto fail5;
> +
> +    Path[In->PathLength - 1] = 0;
> +    XenIfaceDebugPrint(TRACE, "> Path '%s', NumberPermissions %lu\n",
> Path, In->NumberPermissions);
> +
> +    for (Index = 0; Index < In->NumberPermissions; Index++) {
> +        XenIfaceDebugPrint(TRACE, "> %lu: Domain %d, Mask 0x%x\n",
> +                           Index, Permissions[Index].Domain,
> Permissions[Index].Mask);
> +    }
> +
> +    status = XENBUS_STORE(PermissionsSet,
> +                          &Fdo->StoreInterface,
> +                          NULL, // transaction
> +                          NULL, // prefix
> +                          Path,
> +                          Permissions,
> +                          In->NumberPermissions);
> +
> +    if (!NT_SUCCESS(status))
> +        goto fail6;
> +
> +    __FreeCapturedBuffer(Path);
> +    return status;
> +
> +fail6:
> +    XenIfaceDebugPrint(ERROR, "Fail6\n");
> +    __FreeCapturedBuffer(Path);
> +
> +fail5:
> +    XenIfaceDebugPrint(ERROR, "Fail5\n");
> +    __FreePermissions(Permissions);
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreAddWatch(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_STORE_ADD_WATCH_IN In = Buffer;
> +    PXENIFACE_STORE_ADD_WATCH_OUT Out = Buffer;
> +    PCHAR Path;
> +    PXENIFACE_STORE_CONTEXT Context;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_STORE_ADD_WATCH_IN) ||
> +        OutLen != sizeof(XENIFACE_STORE_ADD_WATCH_OUT)) {
> +        goto fail1;
> +    }
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (In->PathLength == 0 ||
> +        In->PathLength > XENSTORE_ABS_PATH_MAX) {
> +        goto fail2;
> +    }
> +
> +    status = __CaptureUserBuffer(In->Path, In->PathLength, &Path);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    Path[In->PathLength - 1] = 0;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context = ExAllocatePoolWithTag(NonPagedPool,
> sizeof(XENIFACE_STORE_CONTEXT), XENIFACE_POOL_TAG);
> +    if (Context == NULL)
> +        goto fail4;
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
> +
> +    Context->FileObject = FileObject;
> +
> +    status = ObReferenceObjectByHandle(In->Event,
> +                                       EVENT_MODIFY_STATE,
> +                                       *ExEventObjectType,
> +                                       UserMode,
> +                                       &Context->Event,
> +                                       NULL);
> +    if (!NT_SUCCESS(status))
> +        goto fail5;
> +
> +    XenIfaceDebugPrint(TRACE, "> Path '%s', Event %p, FO %p\n", Path, In-
> >Event, FileObject);
> +
> +    status = XENBUS_STORE(WatchAdd,
> +                          &Fdo->StoreInterface,
> +                          NULL, // prefix
> +                          Path,
> +                          Context->Event,
> +                          &Context->Watch);
> +
> +    if (!NT_SUCCESS(status))
> +        goto fail6;
> +
> +    __FreeCapturedBuffer(Path);
> +
> +    ExInterlockedInsertTailList(&Fdo->StoreWatchList, &Context->Entry,
> &Fdo->StoreWatchLock);
> +
> +    XenIfaceDebugPrint(TRACE, "< Context %p, Watch %p\n", Context,
> Context->Watch);
> +
> +    Out->Context = Context;
> +    *Info = sizeof(XENIFACE_STORE_ADD_WATCH_OUT);
> +
> +    return status;
> +
> +fail6:
> +    XenIfaceDebugPrint(ERROR, "Fail6\n");
> +    ObDereferenceObject(Context->Event);
> +
> +fail5:
> +    XenIfaceDebugPrint(ERROR, "Fail5\n");
> +    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +    __FreeCapturedBuffer(Path);
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +VOID
> +StoreFreeWatch(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_STORE_CONTEXT Context
> +    )
> +{
> +    NTSTATUS status;
> +
> +    XenIfaceDebugPrint(TRACE, "Context %p, Watch %p, FO %p\n",
> +                       Context, Context->Watch, Context->FileObject);
> +
> +    status = XENBUS_STORE(WatchRemove,
> +                          &Fdo->StoreInterface,
> +                          Context->Watch);
> +
> +    ASSERT(NT_SUCCESS(status)); // this is fatal since we'd leave an active
> watch without cleaning it up
> +
> +    ObDereferenceObject(Context->Event);
> +    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRemoveWatch(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_STORE_REMOVE_WATCH_IN In = Buffer;
> +    PXENIFACE_STORE_CONTEXT Context = NULL;
> +    KIRQL Irql;
> +    PLIST_ENTRY Node;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_STORE_REMOVE_WATCH_IN) ||
> +        OutLen != 0) {
> +        goto fail1;
> +    }
> +
> +    XenIfaceDebugPrint(TRACE, "> Context %p, FO %p\n", In->Context,
> FileObject);
> +
> +    KeAcquireSpinLock(&Fdo->StoreWatchLock, &Irql);
> +    Node = Fdo->StoreWatchList.Flink;
> +    while (Node->Flink != Fdo->StoreWatchList.Flink) {
> +        Context = CONTAINING_RECORD(Node, XENIFACE_STORE_CONTEXT,
> Entry);
> +
> +        Node = Node->Flink;
> +        if (Context != In->Context ||
> +            Context->FileObject != FileObject) {
> +            continue;
> +        }
> +
> +        RemoveEntryList(&Context->Entry);
> +        break;
> +    }
> +    KeReleaseSpinLock(&Fdo->StoreWatchLock, Irql);
> +
> +    status = STATUS_NOT_FOUND;
> +    if (Context == NULL || Context != In->Context)
> +        goto fail2;
> +
> +    StoreFreeWatch(Fdo, Context);
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> diff --git a/src/xeniface/ioctls.c b/src/xeniface/ioctls.c
> index ead7f9b..b306a45 100644
> --- a/src/xeniface/ioctls.c
> +++ b/src/xeniface/ioctls.c
> @@ -1,4 +1,5 @@
>  /* Copyright (c) Citrix Systems Inc.
> + * Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
>   * All rights reserved.
>   *
>   * Redistribution and use in source and binary forms,
> @@ -29,266 +30,123 @@
>   * SUCH DAMAGE.
>   */
> 
> -
>  #include "driver.h"
>  #include "ioctls.h"
> -#include "..\..\include\xeniface_ioctls.h"
> +#include "xeniface_ioctls.h"
>  #include "log.h"
> 
> -static FORCEINLINE BOOLEAN
> -__IsValidStr(
> -    __in  PCHAR             Str,
> -    __in  ULONG             Len
> +NTSTATUS
> +__CaptureUserBuffer(
> +    __in  PVOID Buffer,
> +    __in  ULONG Length,
> +    __out PVOID *CapturedBuffer
>      )
>  {
> -    for ( ; Len--; ++Str) {
> -        if (*Str == '\0')
> -            return TRUE;
> -        if (!isprint((unsigned char)*Str))
> -            break;
> +    NTSTATUS Status;
> +    PVOID TempBuffer = NULL;
> +
> +    if (Length == 0) {
> +        *CapturedBuffer = NULL;
> +        return STATUS_SUCCESS;
>      }
> -    return FALSE;
> -}
> -static FORCEINLINE ULONG
> -__MultiSzLen(
> -    __in  PCHAR             Str,
> -    __out PULONG            Count
> -    )
> -{
> -    ULONG Length = 0;
> -    if (Count)  *Count = 0;
> -    do {
> -        for ( ; *Str; ++Str, ++Length) ;
> -        ++Str; ++Length;
> -        if (*Count) ++(*Count);
> -    } while (*Str);
> -    return Length;
> -}
> -static FORCEINLINE VOID
> -__DisplayMultiSz(
> -    __in PCHAR              Caller,
> -    __in PCHAR              Str
> -    )
> -{
> -    PCHAR   Ptr;
> -    ULONG   Idx;
> -    ULONG   Len;
> -
> -    for (Ptr = Str, Idx = 0; *Ptr; ++Idx) {
> -        Len = (ULONG)strlen(Ptr);
> -        XenIfaceDebugPrint(INFO, "|%s: [%d]=(%d)->\"%s\"\n", Caller, Idx,
> Len, Ptr);
> -        Ptr += (Len + 1);
> +
> +    Status = STATUS_NO_MEMORY;
> +    TempBuffer = ExAllocatePoolWithTag(NonPagedPool, Length,
> XENIFACE_POOL_TAG);
> +    if (TempBuffer == NULL)
> +        return STATUS_INSUFFICIENT_RESOURCES;
> +
> +    Status = STATUS_SUCCESS;
> +
> +#pragma prefast(suppress: 6320) // we want to catch all exceptions
> +    try {
> +        ProbeForRead(Buffer, Length, 1);
> +        RtlCopyMemory(TempBuffer, Buffer, Length);
> +    } except(EXCEPTION_EXECUTE_HANDLER) {
> +        XenIfaceDebugPrint(ERROR, "Exception while probing/reading buffer at
> %p, size 0x%lx\n", Buffer, Length);
> +        ExFreePoolWithTag(TempBuffer, XENIFACE_POOL_TAG);
> +        TempBuffer = NULL;
> +        Status = GetExceptionCode();
>      }
> -}
> 
> +    *CapturedBuffer = TempBuffer;
> 
> -static DECLSPEC_NOINLINE NTSTATUS
> -IoctlRead(
> -    __in  PXENIFACE_FDO         Fdo,
> -    __in  PCHAR             Buffer,
> -    __in  ULONG             InLen,
> -    __in  ULONG             OutLen,
> -    __out PULONG_PTR        Info
> -    )
> -{
> -    NTSTATUS    status;
> -    PCHAR       Value;
> -    ULONG       Length;
> -
> -    status = STATUS_INVALID_BUFFER_SIZE;
> -    if (InLen == 0)
> -        goto fail1;
> -
> -    status = STATUS_INVALID_PARAMETER;
> -    if (!__IsValidStr(Buffer, InLen))
> -        goto fail2;
> -
> -    status = XENBUS_STORE(Read, &Fdo->StoreInterface, NULL, NULL,
> Buffer, &Value);
> -    if (!NT_SUCCESS(status))
> -        goto fail3;
> -
> -    Length = (ULONG)strlen(Value) + 1;
> -
> -    status = STATUS_BUFFER_OVERFLOW;
> -    if (OutLen == 0) {
> -        XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)\n", __FUNCTION__,
> Buffer, Length);
> -        goto done;
> -    }
> -
> -    status = STATUS_INVALID_PARAMETER;
> -    if (OutLen < Length)
> -        goto fail4;
> -
> -    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)->\"%s\"\n",
> __FUNCTION__, Buffer, Length, Value);
> -
> -    RtlCopyMemory(Buffer, Value, Length);
> -    Buffer[Length - 1] = 0;
> -    status = STATUS_SUCCESS;
> -
> -done:
> -    *Info = (ULONG_PTR)Length;
> -    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> -    return status;
> -
> -fail4:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")=(%d < %d)\n",
> __FUNCTION__, Buffer, OutLen, Length);
> -    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> -fail3:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__,
> Buffer);
> -fail2:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
> -fail1:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__,
> status);
> -    return status;
> +    return Status;
>  }
> 
> -static DECLSPEC_NOINLINE NTSTATUS
> -IoctlWrite(
> -    __in  PXENIFACE_FDO         Fdo,
> -    __in  PCHAR             Buffer,
> -    __in  ULONG             InLen,
> -    __in  ULONG             OutLen
> +VOID
> +__FreeCapturedBuffer(
> +    __in  PVOID CapturedBuffer
>      )
>  {
> -    NTSTATUS    status;
> -    PCHAR       Value;
> -    ULONG       Length;
> -
> -    status = STATUS_INVALID_BUFFER_SIZE;
> -    if (InLen == 0 || OutLen != 0)
> -        goto fail1;
> -
> -    status = STATUS_INVALID_PARAMETER;
> -    if (!__IsValidStr(Buffer, InLen))
> -        goto fail2;
> -
> -    Length = (ULONG)strlen(Buffer) + 1;
> -    Value = Buffer + Length;
> -
> -    if (!__IsValidStr(Value, InLen - Length))
> -        goto fail3;
> -
> -    status = XENBUS_STORE(Printf, &Fdo->StoreInterface, NULL, NULL,
> Buffer, Value);
> -    if (!NT_SUCCESS(status))
> -        goto fail4;
> -
> -    XenIfaceDebugPrint(INFO, "|%s: (\"%s\"=\"%s\")\n", __FUNCTION__,
> Buffer, Value);
> -    return status;
> -
> -fail4:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")\n", __FUNCTION__,
> Value);
> -fail3:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__,
> Buffer);
> -fail2:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
> -fail1:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__,
> status);
> -    return status;
> +    if (CapturedBuffer != NULL) {
> +        ExFreePoolWithTag(CapturedBuffer, XENIFACE_POOL_TAG);
> +    }
>  }
> 
> -static DECLSPEC_NOINLINE NTSTATUS
> -IoctlDirectory(
> -    __in  PXENIFACE_FDO         Fdo,
> -    __in  PCHAR             Buffer,
> -    __in  ULONG             InLen,
> -    __in  ULONG             OutLen,
> -    __out PULONG_PTR        Info
> +// Cleanup store watches and event channels, called on file object close.
> +_IRQL_requires_(PASSIVE_LEVEL) // EvtchnFree calls KeFlushQueuedDpcs
> +VOID
> +XenIfaceCleanup(
> +    __in  PXENIFACE_FDO Fdo,
> +    __in  PFILE_OBJECT  FileObject
>      )
>  {
> -    NTSTATUS    status;
> -    PCHAR       Value;
> -    ULONG       Length;
> -    ULONG       Count;
> -
> -    status = STATUS_INVALID_BUFFER_SIZE;
> -    if (InLen == 0)
> -        goto fail1;
> -
> -    status = STATUS_INVALID_PARAMETER;
> -    if (!__IsValidStr(Buffer, InLen))
> -        goto fail2;
> -
> -    status = XENBUS_STORE(Directory, &Fdo->StoreInterface, NULL, NULL,
> Buffer, &Value);
> -    if (!NT_SUCCESS(status))
> -        goto fail3;
> -
> -    Length = __MultiSzLen(Value, &Count) + 1;
> -
> -    status = STATUS_BUFFER_OVERFLOW;
> -    if (OutLen == 0) {
> -        XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)(%d)\n",
> __FUNCTION__, Buffer, Length, Count);
> -        goto done;
> -    }
> -
> -    status = STATUS_INVALID_PARAMETER;
> -    if (OutLen < Length)
> -        goto fail4;
> -
> -    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)(%d)\n", __FUNCTION__,
> Buffer, Length, Count);
> -#if DBG
> -    __DisplayMultiSz(__FUNCTION__, Value);
> -#endif
> -
> -    RtlCopyMemory(Buffer, Value, Length);
> -    Buffer[Length - 2] = 0;
> -    Buffer[Length - 1] = 0;
> -    status = STATUS_SUCCESS;
> -
> -done:
> -    *Info = (ULONG_PTR)Length;
> -    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> -    return status;
> -
> -fail4:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")=(%d < %d)\n",
> __FUNCTION__, Buffer, OutLen, Length);
> -    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> -fail3:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__,
> Buffer);
> -fail2:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
> -fail1:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__,
> status);
> -    return status;
> -}
> +    PLIST_ENTRY Node;
> +    PXENIFACE_STORE_CONTEXT StoreContext;
> +    PXENIFACE_EVTCHN_CONTEXT EvtchnContext;
> +    KIRQL Irql;
> +    LIST_ENTRY ToFree;
> +
> +    XenIfaceDebugPrint(TRACE, "FO %p, IRQL %d, Cpu %lu\n", FileObject,
> KeGetCurrentIrql(), KeGetCurrentProcessorNumber());
> +
> +    // store watches
> +    KeAcquireSpinLock(&Fdo->StoreWatchLock, &Irql);
> +    Node = Fdo->StoreWatchList.Flink;
> +    while (Node->Flink != Fdo->StoreWatchList.Flink) {
> +        StoreContext = CONTAINING_RECORD(Node,
> XENIFACE_STORE_CONTEXT, Entry);
> +
> +        Node = Node->Flink;
> +        if (StoreContext->FileObject != FileObject)
> +            continue;
> +
> +        XenIfaceDebugPrint(TRACE, "Store context %p\n", StoreContext);
> +        RemoveEntryList(&StoreContext->Entry);
> +        StoreFreeWatch(Fdo, StoreContext);
> +    }
> +    KeReleaseSpinLock(&Fdo->StoreWatchLock, Irql);
> +
> +    // event channels
> +    InitializeListHead(&ToFree);
> +    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
> +    Node = Fdo->EvtchnList.Flink;
> +    while (Node->Flink != Fdo->EvtchnList.Flink) {
> +        EvtchnContext = CONTAINING_RECORD(Node,
> XENIFACE_EVTCHN_CONTEXT, Entry);
> +
> +        Node = Node->Flink;
> +        if (EvtchnContext->FileObject != FileObject)
> +            continue;
> +
> +        XenIfaceDebugPrint(TRACE, "Evtchn context %p\n", EvtchnContext);
> +        RemoveEntryList(&EvtchnContext->Entry);
> +        // EvtchnFree requires PASSIVE_LEVEL and we're inside a lock
> +        InsertTailList(&ToFree, &EvtchnContext->Entry);
> +    }
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> 
> -static DECLSPEC_NOINLINE NTSTATUS
> -IoctlRemove(
> -    __in  PXENIFACE_FDO         Fdo,
> -    __in  PCHAR             Buffer,
> -    __in  ULONG             InLen,
> -    __in  ULONG             OutLen
> -    )
> -{
> -    NTSTATUS    status;
> -
> -    status = STATUS_INVALID_BUFFER_SIZE;
> -    if (InLen == 0 || OutLen != 0)
> -        goto fail1;
> -
> -    status = STATUS_INVALID_PARAMETER;
> -    if (!__IsValidStr(Buffer, InLen))
> -        goto fail2;
> -
> -    status = XENBUS_STORE(Remove, &Fdo->StoreInterface, NULL, NULL,
> Buffer);
> -    if (!NT_SUCCESS(status))
> -        goto fail3;
> -
> -    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")\n", __FUNCTION__, Buffer);
> -    return status;
> -
> -fail3:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__,
> Buffer);
> -fail2:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
> -fail1:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__,
> status);
> -    return status;
> +    Node = ToFree.Flink;
> +    while (Node->Flink != ToFree.Flink) {
> +        EvtchnContext = CONTAINING_RECORD(Node,
> XENIFACE_EVTCHN_CONTEXT, Entry);
> +        Node = Node->Flink;
> +
> +        RemoveEntryList(&EvtchnContext->Entry);
> +        EvtchnFree(Fdo, EvtchnContext);
> +    }
>  }
> 
>  NTSTATUS
> -XenIFaceIoctl(
> -    __in  PXENIFACE_FDO         Fdo,
> -    __in  PIRP              Irp
> +XenIfaceIoctl(
> +    __in     PXENIFACE_FDO     Fdo,
> +    __inout  PIRP              Irp
>      )
>  {
>      NTSTATUS            status;
> @@ -302,20 +160,71 @@ XenIFaceIoctl(
>          goto done;
> 
>      switch (Stack->Parameters.DeviceIoControl.IoControlCode) {
> +        // store
>      case IOCTL_XENIFACE_STORE_READ:
> -        status = IoctlRead(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp-
> >IoStatus.Information);
> +        status = IoctlStoreRead(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp-
> >IoStatus.Information);
>          break;
> 
>      case IOCTL_XENIFACE_STORE_WRITE:
> -        status = IoctlWrite(Fdo, (PCHAR)Buffer, InLen, OutLen);
> +        status = IoctlStoreWrite(Fdo, (PCHAR)Buffer, InLen, OutLen);
>          break;
> 
>      case IOCTL_XENIFACE_STORE_DIRECTORY:
> -        status = IoctlDirectory(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp-
> >IoStatus.Information);
> +        status = IoctlStoreDirectory(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp-
> >IoStatus.Information);
>          break;
> 
>      case IOCTL_XENIFACE_STORE_REMOVE:
> -        status = IoctlRemove(Fdo, (PCHAR)Buffer, InLen, OutLen);
> +        status = IoctlStoreRemove(Fdo, (PCHAR)Buffer, InLen, OutLen);
> +        break;
> +
> +    case IOCTL_XENIFACE_STORE_SET_PERMISSIONS:
> +        status = IoctlStoreSetPermissions(Fdo, Buffer, InLen, OutLen);
> +        break;
> +
> +    case IOCTL_XENIFACE_STORE_ADD_WATCH:
> +        status = IoctlStoreAddWatch(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject, &Irp->IoStatus.Information);
> +        break;
> +
> +    case IOCTL_XENIFACE_STORE_REMOVE_WATCH:
> +        status = IoctlStoreRemoveWatch(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject);
> +        break;
> +
> +        // evtchn
> +    case IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND:
> +        status = IoctlEvtchnBindUnbound(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject, &Irp->IoStatus.Information);
> +        break;
> +
> +    case IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN:
> +        status = IoctlEvtchnBindInterdomain(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject, &Irp->IoStatus.Information);
> +        break;
> +
> +    case IOCTL_XENIFACE_EVTCHN_CLOSE:
> +        status = IoctlEvtchnClose(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject);
> +        break;
> +
> +    case IOCTL_XENIFACE_EVTCHN_NOTIFY:
> +        status = IoctlEvtchnNotify(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject);
> +        break;
> +
> +    case IOCTL_XENIFACE_EVTCHN_UNMASK:
> +        status = IoctlEvtchnUnmask(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject);
> +        break;
> +
> +        // gnttab
> +    case IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS: // this is a
> METHOD_NEITHER IOCTL
> +        status = IoctlGnttabPermitForeignAccess(Fdo, Stack-
> >Parameters.DeviceIoControl.Type3InputBuffer, InLen, OutLen, Irp);
> +        break;
> +
> +    case IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS:
> +        status = IoctlGnttabRevokeForeignAccess(Fdo, Buffer, InLen, OutLen);
> +        break;
> +
> +    case IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES: // this is a
> METHOD_NEITHER IOCTL
> +        status = IoctlGnttabMapForeignPages(Fdo, Stack-
> >Parameters.DeviceIoControl.Type3InputBuffer, InLen, OutLen, Irp);
> +        break;
> +
> +    case IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES:
> +        status = IoctlGnttabUnmapForeignPages(Fdo, Buffer, InLen, OutLen);
>          break;
> 
>      default:
> @@ -327,7 +236,8 @@ done:
> 
>      Irp->IoStatus.Status = status;
> 
> -    IoCompleteRequest(Irp, IO_NO_INCREMENT);
> +    if (status != STATUS_PENDING)
> +        IoCompleteRequest(Irp, IO_NO_INCREMENT);
> 
>      return status;
>  }
> diff --git a/src/xeniface/ioctls.h b/src/xeniface/ioctls.h
> index 63de9eb..225ed7f 100644
> --- a/src/xeniface/ioctls.h
> +++ b/src/xeniface/ioctls.h
> @@ -1,4 +1,5 @@
>  /* Copyright (c) Citrix Systems Inc.
> + * Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
>   * All rights reserved.
>   *
>   * Redistribution and use in source and binary forms,
> @@ -32,10 +33,333 @@
>  #ifndef _IOCTLS_H_
>  #define _IOCTLS_H_
> 
> +#include "xeniface_ioctls.h"
> +
> +typedef enum _XENIFACE_CONTEXT_TYPE {
> +    XENIFACE_CONTEXT_GRANT = 1,
> +    XENIFACE_CONTEXT_MAP
> +} XENIFACE_CONTEXT_TYPE;
> +
> +typedef struct _XENIFACE_CONTEXT_ID {
> +    XENIFACE_CONTEXT_TYPE  Type;
> +    ULONG                  RequestId;
> +    PEPROCESS              Process;
> +} XENIFACE_CONTEXT_ID, *PXENIFACE_CONTEXT_ID;
> +
> +typedef struct _XENIFACE_STORE_CONTEXT {
> +    LIST_ENTRY             Entry;
> +    PXENBUS_STORE_WATCH    Watch;
> +    PKEVENT                Event;
> +    PVOID                  FileObject;
> +} XENIFACE_STORE_CONTEXT, *PXENIFACE_STORE_CONTEXT;
> +
> +typedef struct _XENIFACE_EVTCHN_CONTEXT {
> +    LIST_ENTRY             Entry;
> +    PXENBUS_EVTCHN_CHANNEL Channel;
> +    ULONG                  LocalPort;
> +    PKEVENT                Event;
> +    PXENIFACE_FDO          Fdo;
> +    PVOID                  FileObject;
> +} XENIFACE_EVTCHN_CONTEXT, *PXENIFACE_EVTCHN_CONTEXT;
> +
> +typedef struct _XENIFACE_GRANT_CONTEXT {
> +    XENIFACE_CONTEXT_ID        Id;
> +    LIST_ENTRY                 Entry;
> +    PXENBUS_GNTTAB_ENTRY       *Grants;
> +    USHORT                     RemoteDomain;
> +    ULONG                      NumberPages;
> +    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
> +    ULONG                      NotifyOffset;
> +    ULONG                      NotifyPort;
> +    PVOID                      KernelVa;
> +    PVOID                      UserVa;
> +    PMDL                       Mdl;
> +} XENIFACE_GRANT_CONTEXT, *PXENIFACE_GRANT_CONTEXT;
> +
> +typedef struct _XENIFACE_MAP_CONTEXT {
> +    XENIFACE_CONTEXT_ID        Id;
> +    LIST_ENTRY                 Entry;
> +    USHORT                     RemoteDomain;
> +    ULONG                      NumberPages;
> +    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
> +    ULONG                      NotifyOffset;
> +    ULONG                      NotifyPort;
> +    PHYSICAL_ADDRESS           Address;
> +    PVOID                      KernelVa;
> +    PVOID                      UserVa;
> +    PMDL                       Mdl;
> +} XENIFACE_MAP_CONTEXT, *PXENIFACE_MAP_CONTEXT;
> +
>  NTSTATUS
> -XenIFaceIoctl(
> -    __in  PXENIFACE_FDO         Fdo,
> -    __in  PIRP              Irp
> +__CaptureUserBuffer(
> +    __in  PVOID Buffer,
> +    __in  ULONG Length,
> +    __out PVOID *CapturedBuffer
> +    );
> +
> +VOID
> +__FreeCapturedBuffer(
> +    __in  PVOID CapturedBuffer
> +    );
> +
> +NTSTATUS
> +XenIfaceIoctl(
> +    __in     PXENIFACE_FDO     Fdo,
> +    __inout  PIRP              Irp
> +    );
> +
> +_IRQL_requires_(PASSIVE_LEVEL)
> +VOID
> +XenIfaceCleanup(
> +    __in  PXENIFACE_FDO Fdo,
> +    __in  PFILE_OBJECT  FileObject
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRead(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreWrite(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreDirectory(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRemove(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreSetPermissions(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreAddWatch(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRemoveWatch(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    );
> +
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +VOID
> +StoreFreeWatch(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_STORE_CONTEXT Context
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnBindUnbound(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnBindInterdomain(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnClose(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnNotify(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnUnmask(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    );
> +
> +_Requires_lock_not_held_(Fdo->EvtchnLock)
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +EvtchnNotify(
> +    __in      PXENIFACE_FDO Fdo,
> +    __in      ULONG         LocalPort,
> +    __in_opt  PFILE_OBJECT  FileObject
> +    );
> +
> +_Function_class_(KDEFERRED_ROUTINE)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +_IRQL_requires_same_
> +VOID
> +EvtchnNotificationDpc(
> +    __in      PKDPC Dpc,
> +    __in_opt  PVOID Context,
> +    __in_opt  PVOID Argument1,
> +    __in_opt  PVOID Argument2
> +    );
> +
> +_IRQL_requires_(PASSIVE_LEVEL)
> +VOID
> +EvtchnFree(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_EVTCHN_CONTEXT Context
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabPermitForeignAccess(
> +    __in     PXENIFACE_FDO  Fdo,
> +    __in     PVOID          Buffer,
> +    __in     ULONG          InLen,
> +    __in     ULONG          OutLen,
> +    __inout  PIRP           Irp
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabGetGrantResult(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabRevokeForeignAccess(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabMapForeignPages(
> +    __in     PXENIFACE_FDO     Fdo,
> +    __in     PVOID             Buffer,
> +    __in     ULONG             InLen,
> +    __in     ULONG             OutLen,
> +    __inout  PIRP              Irp
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabGetMapResult(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabUnmapForeignPages(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    );
> +
> +_Acquires_exclusive_lock_(((PXENIFACE_FDO)Argument)-
> >GnttabCacheLock)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +VOID
> +GnttabAcquireLock(
> +    __in  PVOID Argument
> +    );
> +
> +_Releases_exclusive_lock_(((PXENIFACE_FDO)Argument)-
> >GnttabCacheLock)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +VOID
> +GnttabReleaseLock(
> +    __in  PVOID Argument
> +    );
> +
> +_Function_class_(IO_WORKITEM_ROUTINE)
> +VOID
> +CompleteGnttabIrp(
> +    __in      PDEVICE_OBJECT DeviceObject,
> +    __in_opt  PVOID          Context
> +    );
> +
> +_IRQL_requires_max_(APC_LEVEL)
> +VOID
> +GnttabFreeGrant(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_GRANT_CONTEXT Context
> +    );
> +
> +_IRQL_requires_max_(APC_LEVEL)
> +VOID
> +GnttabFreeMap(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_MAP_CONTEXT Context
>      );
> 
>  #endif // _IOCTLS_H_
> diff --git a/src/xeniface/irp_queue.c b/src/xeniface/irp_queue.c
> new file mode 100644
> index 0000000..5184726
> --- /dev/null
> +++ b/src/xeniface/irp_queue.c
> @@ -0,0 +1,162 @@
> +/* Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
> + * 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 "driver.h"
> +#include "irp_queue.h"
> +#include "log.h"
> +#include "ioctls.h"
> +
> +// Cancel-safe IRP queue implementation
> +
> +NTSTATUS
> +CsqInsertIrpEx(
> +    _In_  PIO_CSQ Csq,
> +    _In_  PIRP    Irp,
> +    _In_  PVOID   InsertContext // PXENIFACE_CONTEXT_ID
> +    )
> +{
> +    PXENIFACE_FDO Fdo;
> +
> +    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
> +
> +    // Fail if a request with the same ID already exists.
> +    if (CsqPeekNextIrp(Csq, NULL, InsertContext) != NULL)
> +        return STATUS_INVALID_PARAMETER;
> +
> +    InsertTailList(&Fdo->IrpList, &Irp->Tail.Overlay.ListEntry);
> +    return STATUS_SUCCESS;
> +}
> +
> +VOID
> +CsqRemoveIrp(
> +    _In_  PIO_CSQ Csq,
> +    _In_  PIRP    Irp
> +    )
> +{
> +    UNREFERENCED_PARAMETER(Csq);
> +
> +    RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
> +}
> +
> +PIRP
> +CsqPeekNextIrp(
> +    _In_      PIO_CSQ Csq,
> +    _In_opt_  PIRP    Irp,
> +    _In_opt_  PVOID   PeekContext // PXENIFACE_CONTEXT_ID
> +    )
> +{
> +    PXENIFACE_FDO        Fdo;
> +    PIRP                 NextIrp = NULL;
> +    PLIST_ENTRY          Head, NextEntry;
> +    PXENIFACE_CONTEXT_ID Id, TargetId;
> +
> +    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
> +    TargetId = PeekContext;
> +    Head = &Fdo->IrpList;
> +
> +    // If the IRP is NULL, we will start peeking from the list head,
> +    // else we will start from that IRP onwards. This is done under the
> +    // assumption that new IRPs are always inserted at the tail.
> +
> +    if (Irp == NULL) {
> +        NextEntry = Head->Flink;
> +    } else {
> +        NextEntry = Irp->Tail.Overlay.ListEntry.Flink;
> +    }
> +
> +    while (NextEntry != Head) {
> +        NextIrp = CONTAINING_RECORD(NextEntry, IRP, Tail.Overlay.ListEntry);
> +
> +        if (PeekContext) {
> +            Id = NextIrp->Tail.Overlay.DriverContext[0];
> +            if (Id->RequestId == TargetId->RequestId && Id->Process ==
> TargetId->Process)
> +                break;
> +        } else {
> +            break;
> +        }
> +        NextIrp = NULL;
> +        NextEntry = NextEntry->Flink;
> +    }
> +
> +    return NextIrp;
> +}
> +
> +_IRQL_raises_(DISPATCH_LEVEL)
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +_Acquires_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)-
> >IrpQueueLock)
> +VOID
> +CsqAcquireLock(
> +    _In_                                       PIO_CSQ Csq,
> +    _Out_ _At_(*Irql, _Post_ _IRQL_saves_)     PKIRQL  Irql
> +    )
> +{
> +    PXENIFACE_FDO Fdo;
> +
> +    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
> +
> +    KeAcquireSpinLock(&Fdo->IrpQueueLock, Irql);
> +}
> +
> +_IRQL_requires_(DISPATCH_LEVEL)
> +_Releases_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)-
> >IrpQueueLock)
> +VOID
> +CsqReleaseLock(
> +    _In_                    PIO_CSQ Csq,
> +    _In_ _IRQL_restores_    KIRQL   Irql
> +    )
> +{
> +    PXENIFACE_FDO Fdo;
> +
> +    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
> +
> +    KeReleaseSpinLock(&Fdo->IrpQueueLock, Irql);
> +}
> +
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +VOID
> +CsqCompleteCanceledIrp(
> +    _In_  PIO_CSQ Csq,
> +    _In_  PIRP    Irp
> +    )
> +{
> +    PXENIFACE_FDO Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO,
> IrpQueue);
> +    PIO_WORKITEM WorkItem;
> +
> +    XenIfaceDebugPrint(TRACE, "Irp %p, IRQL %d\n",
> +                       Irp, KeGetCurrentIrql());
> +
> +    // This is not guaranteed to run at PASSIVE_LEVEL, so queue a work item
> +    // to perform actual cleanup/IRP completion.
> +
> +    WorkItem = IoAllocateWorkItem(Fdo->Dx->DeviceObject);
> +    Irp->Tail.Overlay.DriverContext[1] = WorkItem; // store so the work item
> can free it
> +    IoQueueWorkItem(WorkItem, CompleteGnttabIrp, DelayedWorkQueue,
> Irp);
> +}
> diff --git a/src/xeniface/irp_queue.h b/src/xeniface/irp_queue.h
> new file mode 100644
> index 0000000..47c36dc
> --- /dev/null
> +++ b/src/xeniface/irp_queue.h
> @@ -0,0 +1,81 @@
> +/* Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
> + * 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 _IRP_QUEUE_H_
> +#define _IRP_QUEUE_H_
> +
> +#include <ntddk.h>
> +
> +NTSTATUS
> +CsqInsertIrpEx(
> +    _In_  PIO_CSQ Csq,
> +    _In_  PIRP    Irp,
> +    _In_  PVOID   InsertContext
> +    );
> +
> +VOID
> +CsqRemoveIrp(
> +    _In_  PIO_CSQ Csq,
> +    _In_  PIRP    Irp
> +    );
> +
> +PIRP
> +CsqPeekNextIrp(
> +    _In_      PIO_CSQ Csq,
> +    _In_opt_  PIRP    Irp,
> +    _In_opt_  PVOID   PeekContext // PXENIFACE_CONTEXT_ID
> +    );
> +
> +_IRQL_raises_(DISPATCH_LEVEL)
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +_Acquires_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)-
> >IrpQueueLock)
> +VOID
> +CsqAcquireLock(
> +    _In_                                       PIO_CSQ Csq,
> +    _Out_ _At_(*Irql, _Post_ _IRQL_saves_)     PKIRQL  Irql
> +    );
> +
> +_IRQL_requires_(DISPATCH_LEVEL)
> +_Releases_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)-
> >IrpQueueLock)
> +VOID
> +CsqReleaseLock(
> +    _In_                    PIO_CSQ Csq,
> +    _In_ _IRQL_restores_    KIRQL   Irql
> +    );
> +
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +VOID
> +CsqCompleteCanceledIrp(
> +    _In_  PIO_CSQ             Csq,
> +    _In_  PIRP                Irp
> +    );
> +
> +#endif
> diff --git a/vs2012/xeniface/xeniface.vcxproj
> b/vs2012/xeniface/xeniface.vcxproj
> index a3472ba..fadc1d1 100644
> --- a/vs2012/xeniface/xeniface.vcxproj
> +++ b/vs2012/xeniface/xeniface.vcxproj
> @@ -73,12 +73,16 @@
>  		<FilesToPackage Include="@(Inf->'%(CopyOutput)')"
> Condition="'@(Inf)'!=''" />
>  	</ItemGroup>
>  	<ItemGroup>
> -	        <ClCompile Include="../../src/xeniface/ioctls.c" />
> -                <ClCompile Include="../../src/xeniface/wmi.c" />
> -                <ClCompile Include="../../src/xeniface/driver.c" />
> -                <ClCompile Include="../../src/xeniface/fdo.c" />
> -                <ClCompile Include="../../src/xeniface/registry.c" />
> -                <ClCompile Include="../../src\xeniface/thread.c" />
> +		<ClCompile Include="..\..\src\xeniface\ioctls.c" />
> +		<ClCompile Include="..\..\src\xeniface\wmi.c" />
> +		<ClCompile Include="..\..\src\xeniface\driver.c" />
> +		<ClCompile Include="..\..\src\xeniface\fdo.c" />
> +		<ClCompile Include="..\..\src\xeniface\registry.c" />
> +		<ClCompile Include="..\..\src\xeniface\thread.c" />
> +		<ClCompile Include="..\..\src\xeniface\ioctl_evtchn.c" />
> +		<ClCompile Include="..\..\src\xeniface\ioctl_gnttab.c" />
> +		<ClCompile Include="..\..\src\xeniface\ioctl_store.c" />
> +		<ClCompile Include="..\..\src\xeniface\irp_queue.c" />
>  	</ItemGroup>
>          <ItemGroup>
>                  <Mofcomp Include="../../src/xeniface/wmi.mof">
> @@ -96,5 +100,19 @@
>  	<ItemGroup>
>  		<Inf Include="..\xeniface.inf" />
>  	</ItemGroup>
> +	<ItemGroup>
> +		<ClInclude Include="..\..\src\xeniface\assert.h" />
> +		<ClInclude Include="..\..\src\xeniface\driver.h" />
> +		<ClInclude Include="..\..\src\xeniface\fdo.h" />
> +		<ClInclude Include="..\..\src\xeniface\ioctls.h" />
> +		<ClInclude Include="..\..\src\xeniface\irp_queue.h" />
> +		<ClInclude Include="..\..\src\xeniface\log.h" />
> +		<ClInclude Include="..\..\src\xeniface\mutex.h" />
> +		<ClInclude Include="..\..\src\xeniface\names.h" />
> +		<ClInclude Include="..\..\src\xeniface\registry.h" />
> +		<ClInclude Include="..\..\src\xeniface\thread.h" />
> +		<ClInclude Include="..\..\src\xeniface\types.h" />
> +		<ClInclude Include="..\..\src\xeniface\wmi.h" />
> +	</ItemGroup>
>  	<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
>  </Project>
> diff --git a/vs2013/xeniface/xeniface.vcxproj
> b/vs2013/xeniface/xeniface.vcxproj
> index fea2ad1..44a1cdf 100644
> --- a/vs2013/xeniface/xeniface.vcxproj
> +++ b/vs2013/xeniface/xeniface.vcxproj
> @@ -125,12 +125,16 @@
>      <FilesToPackage Include="@(Inf->'%(CopyOutput)')"
> Condition="'@(Inf)'!=''" />
>    </ItemGroup>
>    <ItemGroup>
> -    <ClCompile Include="../../src/xeniface/ioctls.c" />
> -    <ClCompile Include="../../src/xeniface/wmi.c" />
> -    <ClCompile Include="../../src/xeniface/driver.c" />
> -    <ClCompile Include="../../src/xeniface/fdo.c" />
> -    <ClCompile Include="../../src/xeniface/registry.c" />
> -    <ClCompile Include="../../src\xeniface/thread.c" />
> +    <ClCompile Include="..\..\src\xeniface\ioctls.c" />
> +    <ClCompile Include="..\..\src\xeniface\wmi.c" />
> +    <ClCompile Include="..\..\src\xeniface\driver.c" />
> +    <ClCompile Include="..\..\src\xeniface\fdo.c" />
> +    <ClCompile Include="..\..\src\xeniface\registry.c" />
> +    <ClCompile Include="..\..\src\xeniface\thread.c" />
> +    <ClCompile Include="..\..\src\xeniface\ioctl_evtchn.c" />
> +    <ClCompile Include="..\..\src\xeniface\ioctl_gnttab.c" />
> +    <ClCompile Include="..\..\src\xeniface\ioctl_store.c" />
> +    <ClCompile Include="..\..\src\xeniface\irp_queue.c" />
>    </ItemGroup>
>    <ItemGroup>
>      <Mofcomp Include="../../src/xeniface/wmi.mof">
> @@ -148,5 +152,19 @@
>    <ItemGroup>
>      <Inf Include="..\xeniface.inf" />
>    </ItemGroup>
> +  <ItemGroup>
> +    <ClInclude Include="..\..\src\xeniface\assert.h" />
> +    <ClInclude Include="..\..\src\xeniface\driver.h" />
> +    <ClInclude Include="..\..\src\xeniface\fdo.h" />
> +    <ClInclude Include="..\..\src\xeniface\ioctls.h" />
> +    <ClInclude Include="..\..\src\xeniface\irp_queue.h" />
> +    <ClInclude Include="..\..\src\xeniface\log.h" />
> +    <ClInclude Include="..\..\src\xeniface\mutex.h" />
> +    <ClInclude Include="..\..\src\xeniface\names.h" />
> +    <ClInclude Include="..\..\src\xeniface\registry.h" />
> +    <ClInclude Include="..\..\src\xeniface\thread.h" />
> +    <ClInclude Include="..\..\src\xeniface\types.h" />
> +    <ClInclude Include="..\..\src\xeniface\wmi.h" />
> +  </ItemGroup>
>    <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
>  </Project>
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Fri Oct 23 14:36:20 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 14:36: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 1ZpdS8-0003U2-CB; Fri, 23 Oct 2015 14:36:20 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7314647ef=Paul.Durrant@citrix.com>)
	id 1ZpdS6-0003Tm-Eb
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 14:36:18 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	F2/CC-12889-1E54A265; Fri, 23 Oct 2015 14:36:17 +0000
X-Env-Sender: prvs=7314647ef=Paul.Durrant@citrix.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1445610972!22108600!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17762 invoked from network); 23 Oct 2015 14:36:12 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 14:36:12 -0000
X-IronPort-AV: E=Sophos;i="5.20,186,1444694400"; 
   d="scan'208";a="6005071"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 5/6] Implement new IOCTL handlers
Thread-Index: AQHRC8EaQ/ezKT5xBUWhIiuxai+Ly555KNHg
Date: Fri, 23 Oct 2015 14:36:11 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F623232@AMSPEX01CL01.citrite.net>
References: <56272208.8060208@invisiblethingslab.com>
In-Reply-To: <56272208.8060208@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] [PATCH 5/6] Implement new IOCTL handlers
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 Rafal Wojdyla
> Sent: 21 October 2015 06:27
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 5/6] Implement new IOCTL handlers
> 
> This patch implements new store, evtchn and gnttab IOCTLs.
> Handlers are split into separate files for readability.
> 
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  include/xeniface_ioctls.h        |   1 +
>  src/xeniface/fdo.c               | 179 +++++++++-
>  src/xeniface/fdo.h               |  44 ++-
>  src/xeniface/ioctl_evtchn.c      | 492 ++++++++++++++++++++++++++
>  src/xeniface/ioctl_gnttab.c      | 747
> +++++++++++++++++++++++++++++++++++++++
>  src/xeniface/ioctl_store.c       | 608 +++++++++++++++++++++++++++++++
>  src/xeniface/ioctls.c            | 396 ++++++++-------------
>  src/xeniface/ioctls.h            | 330 ++++++++++++++++-
>  src/xeniface/irp_queue.c         | 162 +++++++++
>  src/xeniface/irp_queue.h         |  81 +++++
>  vs2012/xeniface/xeniface.vcxproj |  30 +-
>  vs2013/xeniface/xeniface.vcxproj |  30 +-
>  12 files changed, 2807 insertions(+), 293 deletions(-)
>  create mode 100644 src/xeniface/ioctl_evtchn.c
>  create mode 100644 src/xeniface/ioctl_gnttab.c
>  create mode 100644 src/xeniface/ioctl_store.c
>  create mode 100644 src/xeniface/irp_queue.c
>  create mode 100644 src/xeniface/irp_queue.h
> 
> diff --git a/include/xeniface_ioctls.h b/include/xeniface_ioctls.h
> index 6ad98d6..a842d4f 100644
> --- a/include/xeniface_ioctls.h
> +++ b/include/xeniface_ioctls.h
> @@ -1,4 +1,5 @@
>  /* Copyright (c) Citrix Systems Inc.
> + * Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
>   * All rights reserved.
>   *
>   * Redistribution and use in source and binary forms,
> diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
> index b73dee1..71ffbe2 100644
> --- a/src/xeniface/fdo.c
> +++ b/src/xeniface/fdo.c
> @@ -36,7 +36,8 @@
>  #include <stdlib.h>
> 
>  #include <store_interface.h>
> -
> +#include <evtchn_interface.h>
> +#include <gnttab_interface.h>
>  #include <suspend_interface.h>
> 
> 
> @@ -52,6 +53,7 @@
>  #include "ioctls.h"
>  #include "wmi.h"
>  #include "xeniface_ioctls.h"
> +#include "irp_queue.h"
> 
>  #define FDO_POOL 'ODF'
> 
> @@ -664,6 +666,25 @@ __FdoD3ToD0(
>      if (!NT_SUCCESS(status))
>          goto fail1;
> 
> +    status = XENBUS_EVTCHN(Acquire, &Fdo->EvtchnInterface);
> +    if (!NT_SUCCESS(status))
> +        goto fail2;
> +
> +    status = XENBUS_GNTTAB(Acquire, &Fdo->GnttabInterface);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    status = XENBUS_GNTTAB(CreateCache,
> +                           &Fdo->GnttabInterface,
> +                           "xeniface-gnttab",
> +                           0,
> +                           GnttabAcquireLock,
> +                           GnttabReleaseLock,
> +                           Fdo,
> +                           &Fdo->GnttabCache);
> +    if (!NT_SUCCESS(status))
> +        goto fail4;
> +
>      __FdoSetDevicePowerState(Fdo, PowerDeviceD0);
> 
>      PowerState.DeviceState = PowerDeviceD0;
> @@ -675,6 +696,18 @@ __FdoD3ToD0(
> 
>      return STATUS_SUCCESS;
> 
> +fail4:
> +    Error("fail4\n");
> +    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
> +
> +fail3:
> +    Error("fail3\n");
> +    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
> +
> +fail2:
> +    Error("fail2\n");
> +    XENBUS_STORE(Release, &Fdo->StoreInterface);
> +
>  fail1:
>      Error("fail1 (%08x)\n", status);
> 
> @@ -700,6 +733,9 @@ __FdoD0ToD3(
> 
>      __FdoSetDevicePowerState(Fdo, PowerDeviceD3);
> 
> +    XENBUS_GNTTAB(DestroyCache, &Fdo->GnttabInterface, Fdo-
> >GnttabCache);
> +    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
> +    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
>      XENBUS_STORE(Release, &Fdo->StoreInterface);
> 
>      Trace("<====\n");
> @@ -1991,27 +2027,25 @@ FdoDispatchDefault(
> 
>  NTSTATUS
>  FdoCreateFile (
> -    __in PXENIFACE_FDO fdoData,
> -    __inout PIRP Irp
> +    __in PXENIFACE_FDO  Fdo,
> +    __inout PIRP        Irp
>      )
>  {
> -    NTSTATUS     status;
> +    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
> +    NTSTATUS            status;
> 
> +    XenIfaceDebugPrint(TRACE, "FO %p, Process %p\n", Stack->FileObject,
> PsGetCurrentProcess());
> 
> -    XenIfaceDebugPrint(TRACE, "Create \n");
> -
> -    if (Deleted == fdoData->Dx->DevicePnpState)
> -    {
> +    if (Deleted == Fdo->Dx->DevicePnpState) {
>          Irp->IoStatus.Status = STATUS_NO_SUCH_DEVICE;
> -        IoCompleteRequest (Irp, IO_NO_INCREMENT);
> +        IoCompleteRequest(Irp, IO_NO_INCREMENT);
>          return STATUS_NO_SUCH_DEVICE;
>      }
> 
> -
>      status = STATUS_SUCCESS;
>      Irp->IoStatus.Information = 0;
>      Irp->IoStatus.Status = status;
> -    IoCompleteRequest (Irp, IO_NO_INCREMENT);
> +    IoCompleteRequest(Irp, IO_NO_INCREMENT);
> 
>      return status;
>  }
> @@ -2019,20 +2053,22 @@ FdoCreateFile (
> 
>  NTSTATUS
>  FdoClose (
> -    __in PXENIFACE_FDO fdoData,
> -    __inout PIRP Irp
> +    __in PXENIFACE_FDO  Fdo,
> +    __inout PIRP        Irp
>      )
> 
>  {
> +    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
> +    NTSTATUS            status;
> 
> -    NTSTATUS     status;
> +    XenIfaceDebugPrint(TRACE, "FO %p, Process %p\n", Stack->FileObject,
> PsGetCurrentProcess());
> 
> -    XenIfaceDebugPrint(TRACE, "Close \n");
> +    XenIfaceCleanup(Fdo, Stack->FileObject);
> 
>      status = STATUS_SUCCESS;
>      Irp->IoStatus.Information = 0;
>      Irp->IoStatus.Status = status;
> -    IoCompleteRequest (Irp, IO_NO_INCREMENT);
> +    IoCompleteRequest(Irp, IO_NO_INCREMENT);
> 
>      return status;
>  }
> @@ -2081,7 +2117,7 @@ FdoDispatch(
>          break;
> 
>      case IRP_MJ_DEVICE_CONTROL:
> -        status = XenIFaceIoctl(Fdo, Irp);
> +        status = XenIfaceIoctl(Fdo, Irp);
>          break;
> 
>      case IRP_MJ_SYSTEM_CONTROL:
> @@ -2206,6 +2242,8 @@ FdoCreate(
>      WCHAR               Name[MAXNAMELEN * sizeof (WCHAR)];
>      ULONG               Size;
>      NTSTATUS            status;
> +    ULONG               ProcessorCount;
> +    ULONG               Index;
> 
>  #pragma prefast(suppress:28197) // Possibly leaking memory
> 'FunctionDeviceObject'
>      status = IoCreateDevice(DriverObject,
> @@ -2296,6 +2334,24 @@ FdoCreate(
>      if (!NT_SUCCESS(status))
>          goto fail10;
> 
> +    status = FDO_QUERY_INTERFACE(Fdo,
> +                                 XENBUS,
> +                                 EVTCHN,
> +                                 (PINTERFACE)&Fdo->EvtchnInterface,
> +                                 sizeof (Fdo->EvtchnInterface),
> +                                 FALSE);
> +    if (!NT_SUCCESS(status))
> +        goto fail11;
> +
> +    status = FDO_QUERY_INTERFACE(Fdo,
> +                                 XENBUS,
> +                                 GNTTAB,
> +                                 (PINTERFACE)&Fdo->GnttabInterface,
> +                                 sizeof (Fdo->GnttabInterface),
> +                                 FALSE);
> +    if (!NT_SUCCESS(status))
> +        goto fail12;
> +
>      InitializeMutex(&Fdo->Mutex);
>      InitializeListHead(&Dx->ListEntry);
>      Fdo->References = 1;
> @@ -2306,7 +2362,46 @@ FdoCreate(
> 
>      status = ThreadCreate(FdoRegistryThreadHandler, Fdo, &Fdo-
> >registryThread);
>      if (!NT_SUCCESS(status))
> -        goto fail11;
> +        goto fail13;
> +
> +    KeInitializeSpinLock(&Fdo->StoreWatchLock);
> +    InitializeListHead(&Fdo->StoreWatchList);
> +
> +    KeInitializeSpinLock(&Fdo->EvtchnLock);
> +    InitializeListHead(&Fdo->EvtchnList);
> +
> +    KeInitializeSpinLock(&Fdo->IrpQueueLock);
> +    InitializeListHead(&Fdo->IrpList);
> +
> +    KeInitializeSpinLock(&Fdo->GnttabCacheLock);
> +
> +    status = IoCsqInitializeEx(&Fdo->IrpQueue,
> +                               CsqInsertIrpEx,
> +                               CsqRemoveIrp,
> +                               CsqPeekNextIrp,
> +                               CsqAcquireLock,
> +                               CsqReleaseLock,
> +                               CsqCompleteCanceledIrp);
> +    if (!NT_SUCCESS(status))
> +        goto fail14;
> +
> +    ProcessorCount =
> KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
> +
> +    status = STATUS_NO_MEMORY;
> +    Fdo->EvtchnDpc = __FdoAllocate(sizeof (KDPC) * ProcessorCount);
> +    if (Fdo->EvtchnDpc == NULL)
> +        goto fail15;
> +
> +    for (Index = 0; Index < ProcessorCount; Index++) {
> +        PROCESSOR_NUMBER ProcNumber;
> +
> +        status = KeGetProcessorNumberFromIndex(Index, &ProcNumber);
> +        ASSERT(NT_SUCCESS(status));
> +
> +        KeInitializeDpc(&Fdo->EvtchnDpc[Index], EvtchnNotificationDpc,
> NULL);
> +        status = KeSetTargetProcessorDpcEx(&Fdo->EvtchnDpc[Index],
> &ProcNumber);
> +        ASSERT(NT_SUCCESS(status));
> +    }
> 
>      Info("%p (%s)\n",
>           FunctionDeviceObject,
> @@ -2317,6 +2412,27 @@ FdoCreate(
> 
>      return STATUS_SUCCESS;
> 
> +fail15:
> +    Error("fail15\n");
> +
> +fail14:
> +    Error("fail14\n");
> +
> +    ThreadAlert(Fdo->registryThread);
> +    ThreadJoin(Fdo->registryThread);
> +    Fdo->registryThread = NULL;
> +
> +fail13:
> +    Error("fail13\n");
> +
> +    RtlZeroMemory(&Fdo->GnttabInterface,
> +                  sizeof (XENBUS_GNTTAB_INTERFACE));
> +
> +fail12:
> +    Error("fail12\n");
> +
> +    RtlZeroMemory(&Fdo->EvtchnInterface,
> +                  sizeof (XENBUS_EVTCHN_INTERFACE));
> 
>  fail11:
>      Error("fail11\n");
> @@ -2394,7 +2510,8 @@ FdoDestroy(
>      )
>  {
>      PXENIFACE_DX          Dx = Fdo->Dx;
> -    PDEVICE_OBJECT      FunctionDeviceObject = Dx->DeviceObject;
> +    PDEVICE_OBJECT        FunctionDeviceObject = Dx->DeviceObject;
> +    ULONG                 ProcessorCount;
> 
>      ASSERT(IsListEmpty(&Dx->ListEntry));
>      ASSERT3U(Fdo->References, ==, 0);
> @@ -2408,10 +2525,34 @@ FdoDestroy(
> 
>      Dx->Fdo = NULL;
> 
> +    ProcessorCount =
> KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
> +    RtlZeroMemory(Fdo->EvtchnDpc, sizeof (KDPC) * ProcessorCount);
> +    __FdoFree(Fdo->EvtchnDpc);
> +
> +    RtlZeroMemory(&Fdo->GnttabCacheLock, sizeof (KSPIN_LOCK));
> +    ASSERT(IsListEmpty(&Fdo->IrpList));
> +    RtlZeroMemory(&Fdo->IrpList, sizeof (LIST_ENTRY));
> +    RtlZeroMemory(&Fdo->IrpQueueLock, sizeof (KSPIN_LOCK));
> +    RtlZeroMemory(&Fdo->IrpQueue, sizeof (IO_CSQ));
> +
> +    ASSERT(IsListEmpty(&Fdo->EvtchnList));
> +    RtlZeroMemory(&Fdo->EvtchnList, sizeof (LIST_ENTRY));
> +    RtlZeroMemory(&Fdo->EvtchnLock, sizeof (KSPIN_LOCK));
> +
> +    ASSERT(IsListEmpty(&Fdo->StoreWatchList));
> +    RtlZeroMemory(&Fdo->StoreWatchList, sizeof (LIST_ENTRY));
> +    RtlZeroMemory(&Fdo->StoreWatchLock, sizeof (KSPIN_LOCK));
> +
>      RtlZeroMemory(&Fdo->Mutex, sizeof (XENIFACE_MUTEX));
> 
>      Fdo->InterfacesAcquired = FALSE;
> 
> +    RtlZeroMemory(&Fdo->GnttabInterface,
> +                  sizeof (XENBUS_GNTTAB_INTERFACE));
> +
> +    RtlZeroMemory(&Fdo->EvtchnInterface,
> +                  sizeof (XENBUS_EVTCHN_INTERFACE));
> +
>      RtlZeroMemory(&Fdo->StoreInterface,
>                    sizeof (XENBUS_STORE_INTERFACE));
> 
> diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
> index c859338..781b1cc 100644
> --- a/src/xeniface/fdo.h
> +++ b/src/xeniface/fdo.h
> @@ -34,6 +34,8 @@
> 
>  #include <ntifs.h>
>  #include <store_interface.h>
> +#include <evtchn_interface.h>
> +#include <gnttab_interface.h>
>  #include <suspend_interface.h>
>  #include <shared_info_interface.h>
> 
> @@ -73,32 +75,44 @@ typedef struct _XENIFACE_FDO {
> 
>      FDO_RESOURCE                    Resource[RESOURCE_COUNT];
> 
> -
>      XENBUS_STORE_INTERFACE          StoreInterface;
> -
>      XENBUS_SUSPEND_INTERFACE        SuspendInterface;
> -
>      XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
> -
> +    XENBUS_EVTCHN_INTERFACE         EvtchnInterface;
> +    XENBUS_GNTTAB_INTERFACE         GnttabInterface;
>      PXENBUS_SUSPEND_CALLBACK        SuspendCallbackLate;
> 
> -    BOOLEAN						    InterfacesAcquired;
> +    BOOLEAN                         InterfacesAcquired;
> +
> +    KSPIN_LOCK                      StoreWatchLock;
> +    LIST_ENTRY                      StoreWatchList;
> +
> +    KSPIN_LOCK                      EvtchnLock;
> +    LIST_ENTRY                      EvtchnList;
> +    PKDPC                           EvtchnDpc;
> +
> +    KSPIN_LOCK                      GnttabCacheLock;
> +
> +    IO_CSQ                          IrpQueue;
> +    KSPIN_LOCK                      IrpQueueLock;
> +    LIST_ENTRY                      IrpList;
> +
> +    PXENBUS_GNTTAB_CACHE            GnttabCache;
> 
>      #define MAX_SESSIONS    (65536)
> 
> -    int							    WmiReady;
> +    int                             WmiReady;
> 
> -    USHORT						    Sessions;
> -    FAST_MUTEX					    SessionLock;
> -    LIST_ENTRY					    SessionHead;
> +    USHORT                          Sessions;
> +    FAST_MUTEX                      SessionLock;
> +    LIST_ENTRY                      SessionHead;
> 
> -    PXENIFACE_THREAD			    registryThread;
> -    KEVENT						    registryWriteEvent;
> +    PXENIFACE_THREAD                registryThread;
> +    KEVENT                          registryWriteEvent;
> 
> +    UNICODE_STRING                  SuggestedInstanceName;
> 
> -    UNICODE_STRING				    SuggestedInstanceName;
> -
> -    UNICODE_STRING				    InterfaceName;
> +    UNICODE_STRING                  InterfaceName;
> 
>  } XENIFACE_FDO, *PXENIFACE_FDO;
> 
> @@ -163,6 +177,4 @@ FdoDispatch(
>      IN  PIRP            Irp
>      );
> 
> -
> -
>  #endif  // _XENIFACE_FDO_H
> diff --git a/src/xeniface/ioctl_evtchn.c b/src/xeniface/ioctl_evtchn.c
> new file mode 100644
> index 0000000..93f1931
> --- /dev/null
> +++ b/src/xeniface/ioctl_evtchn.c
> @@ -0,0 +1,492 @@
> +/* Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
> + * 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 "driver.h"
> +#include "ioctls.h"
> +#include "xeniface_ioctls.h"
> +#include "log.h"
> +
> +_Function_class_(KDEFERRED_ROUTINE)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +_IRQL_requires_same_
> +VOID
> +EvtchnNotificationDpc(
> +    __in      PKDPC Dpc,
> +    __in_opt  PVOID _Context,
> +    __in_opt  PVOID Argument1,
> +    __in_opt  PVOID Argument2
> +    )
> +{
> +    PXENIFACE_EVTCHN_CONTEXT Context = Argument1;
> +
> +    UNREFERENCED_PARAMETER(Dpc);
> +    UNREFERENCED_PARAMETER(_Context);
> +    UNREFERENCED_PARAMETER(Argument2);
> +
> +    ASSERT(Context);
> +
> +#if DBG
> +    XenIfaceDebugPrint(INFO, "Channel %p, LocalPort %d, Cpu %lu\n",
> +                       Context->Channel, Context->LocalPort,
> KeGetCurrentProcessorNumber());
> +#endif
> +    KeSetEvent(Context->Event, 0, FALSE);
> +
> +    XENBUS_EVTCHN(Unmask,
> +                  &Context->Fdo->EvtchnInterface,
> +                  Context->Channel,
> +                  FALSE);
> +}
> +
> +_Function_class_(KSERVICE_ROUTINE)
> +_IRQL_requires_(HIGH_LEVEL)
> +_IRQL_requires_same_
> +static DECLSPEC_NOINLINE
> +BOOLEAN
> +EvtchnInterruptHandler(
> +    __in      PKINTERRUPT Interrupt,
> +    __in_opt  PVOID Argument
> +    )
> +{
> +    PXENIFACE_EVTCHN_CONTEXT Context = Argument;
> +    PROCESSOR_NUMBER ProcNumber;
> +    ULONG ProcIndex;
> +
> +    UNREFERENCED_PARAMETER(Interrupt);
> +    ASSERT(Context);
> +
> +    KeGetCurrentProcessorNumberEx(&ProcNumber);
> +    ProcIndex = KeGetProcessorIndexFromNumber(&ProcNumber);
> +    if (!KeInsertQueueDpc(&Context->Fdo->EvtchnDpc[ProcIndex], Context,
> NULL)) {
> +        XenIfaceDebugPrint(TRACE, "NOT INSERTED: Context %p, Port %lu, FO
> %p, Cpu %lu\n",
> +                           Context, Context->LocalPort, Context->FileObject,
> ProcIndex);
> +    }
> +
> +    return TRUE;
> +}
> +
> +_IRQL_requires_(PASSIVE_LEVEL) // needed for KeFlushQueuedDpcs
> +VOID
> +EvtchnFree(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_EVTCHN_CONTEXT Context
> +    )
> +{
> +    ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
> +
> +    XenIfaceDebugPrint(TRACE, "Context %p, LocalPort %d, FO %p\n",
> +                       Context, Context->LocalPort, Context->FileObject);
> +
> +    XENBUS_EVTCHN(Close,
> +                  &Fdo->EvtchnInterface,
> +                  Context->Channel);
> +
> +    // There may still be a pending event at this time.
> +    // Wait for our DPCs to complete.
> +    KeFlushQueuedDpcs();
> +
> +    ObDereferenceObject(Context->Event);
> +    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +}
> +
> +_Requires_exclusive_lock_held_(Fdo->EvtchnLock)
> +static
> +PXENIFACE_EVTCHN_CONTEXT
> +EvtchnFindChannel(
> +    __in      PXENIFACE_FDO Fdo,
> +    __in      ULONG         LocalPort,
> +    __in_opt  PFILE_OBJECT  FileObject
> +    )
> +{
> +    PXENIFACE_EVTCHN_CONTEXT Context, Found = NULL;
> +    PLIST_ENTRY Node;
> +
> +    Node = Fdo->EvtchnList.Flink;
> +    while (Node->Flink != Fdo->EvtchnList.Flink) {
> +        Context = CONTAINING_RECORD(Node, XENIFACE_EVTCHN_CONTEXT,
> Entry);
> +
> +        Node = Node->Flink;
> +        if (Context->LocalPort != LocalPort)
> +            continue;
> +
> +        if (FileObject != NULL &&
> +            FileObject != Context->FileObject) {
> +            continue;
> +        }
> +
> +        Found = Context;
> +        break;
> +    }
> +
> +    return Found;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnBindUnbound(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_BIND_UNBOUND_IN In = Buffer;
> +    PXENIFACE_EVTCHN_BIND_UNBOUND_OUT Out = Buffer;
> +    PXENIFACE_EVTCHN_CONTEXT Context;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_IN) ||
> +        OutLen != sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_OUT)) {
> +        goto fail1;
> +    }
> +
> +    status = STATUS_NO_MEMORY;
> +    Context = ExAllocatePoolWithTag(NonPagedPool,
> sizeof(XENIFACE_EVTCHN_CONTEXT), XENIFACE_POOL_TAG);
> +    if (Context == NULL)
> +        goto fail2;
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
> +    Context->FileObject = FileObject;
> +
> +    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, Mask %d, FO %p\n",
> +                       In->RemoteDomain, In->Mask, FileObject);
> +
> +    status = ObReferenceObjectByHandle(In->Event,
> +                                       EVENT_MODIFY_STATE,
> +                                       *ExEventObjectType,
> +                                       UserMode,
> +                                       &Context->Event,
> +                                       NULL);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    status = STATUS_UNSUCCESSFUL;
> +    Context->Channel = XENBUS_EVTCHN(Open,
> +                                     &Fdo->EvtchnInterface,
> +                                     XENBUS_EVTCHN_TYPE_UNBOUND,
> +                                     EvtchnInterruptHandler,
> +                                     Context,
> +                                     In->RemoteDomain,
> +                                     TRUE);
> +    if (Context->Channel == NULL)
> +        goto fail4;
> +
> +    Context->LocalPort = XENBUS_EVTCHN(GetPort,
> +                                       &Fdo->EvtchnInterface,
> +                                       Context->Channel);
> +
> +    Context->Fdo = Fdo;
> +
> +    ExInterlockedInsertTailList(&Fdo->EvtchnList, &Context->Entry, &Fdo-
> >EvtchnLock);
> +
> +    Out->LocalPort = Context->LocalPort;
> +    *Info = sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_OUT);
> +
> +    if (!In->Mask) {
> +        XENBUS_EVTCHN(Unmask,
> +                      &Fdo->EvtchnInterface,
> +                      Context->Channel,
> +                      FALSE);
> +    }
> +
> +    XenIfaceDebugPrint(TRACE, "< LocalPort %lu, Context %p\n", Context-
> >LocalPort, Context);
> +    return STATUS_SUCCESS;
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +    ObDereferenceObject(Context->Event);
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnBindInterdomain(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_BIND_INTERDOMAIN_IN In = Buffer;
> +    PXENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT Out = Buffer;
> +    PXENIFACE_EVTCHN_CONTEXT Context;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN) ||
> +        OutLen != sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT)) {
> +        goto fail1;
> +    }
> +
> +    status = STATUS_NO_MEMORY;
> +    Context = ExAllocatePoolWithTag(NonPagedPool,
> sizeof(XENIFACE_EVTCHN_CONTEXT), XENIFACE_POOL_TAG);
> +    if (Context == NULL)
> +        goto fail2;
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
> +    Context->FileObject = FileObject;
> +
> +    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, RemotePort %lu,
> Mask %d, FO %p\n",
> +                       In->RemoteDomain, In->RemotePort, In->Mask, FileObject);
> +
> +    status = ObReferenceObjectByHandle(In->Event,
> +                                       EVENT_MODIFY_STATE,
> +                                       *ExEventObjectType,
> +                                       UserMode,
> +                                       &Context->Event,
> +                                       NULL);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    status = STATUS_UNSUCCESSFUL;
> +    Context->Channel = XENBUS_EVTCHN(Open,
> +                                     &Fdo->EvtchnInterface,
> +                                     XENBUS_EVTCHN_TYPE_INTER_DOMAIN,
> +                                     EvtchnInterruptHandler,
> +                                     Context,
> +                                     In->RemoteDomain,
> +                                     In->RemotePort,
> +                                     TRUE);
> +    if (Context->Channel == NULL)
> +        goto fail4;
> +
> +    Context->LocalPort = XENBUS_EVTCHN(GetPort,
> +                                       &Fdo->EvtchnInterface,
> +                                       Context->Channel);
> +
> +    Context->Fdo = Fdo;
> +
> +    ExInterlockedInsertTailList(&Fdo->EvtchnList, &Context->Entry, &Fdo-
> >EvtchnLock);
> +
> +    Out->LocalPort = Context->LocalPort;
> +    *Info = sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT);
> +
> +    if (!In->Mask) {
> +        XENBUS_EVTCHN(Unmask,
> +                      &Fdo->EvtchnInterface,
> +                      Context->Channel,
> +                      FALSE);
> +    }
> +
> +    XenIfaceDebugPrint(TRACE, "< LocalPort %lu, Context %p\n", Context-
> >LocalPort, Context);
> +
> +    return STATUS_SUCCESS;
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +    ObDereferenceObject(Context->Event);
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +    RtlZeroMemory(Context, sizeof(XENIFACE_EVTCHN_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnClose(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_CLOSE_IN In = Buffer;
> +    PXENIFACE_EVTCHN_CONTEXT Context;
> +    KIRQL Irql;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_EVTCHN_CLOSE_IN) ||
> +        OutLen != 0) {
> +        goto fail1;
> +    }
> +
> +    XenIfaceDebugPrint(TRACE, "> LocalPort %lu, FO %p\n", In->LocalPort,
> FileObject);
> +
> +    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
> +    status = STATUS_NOT_FOUND;
> +    Context = EvtchnFindChannel(Fdo, In->LocalPort, FileObject);
> +    if (Context == NULL)
> +        goto fail2;
> +
> +    RemoveEntryList(&Context->Entry);
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +    EvtchnFree(Fdo, Context);
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +_Requires_lock_not_held_(Fdo->EvtchnLock)
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +EvtchnNotify(
> +    __in      PXENIFACE_FDO Fdo,
> +    __in      ULONG         LocalPort,
> +    __in_opt  PFILE_OBJECT  FileObject
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_CONTEXT Context;
> +    KIRQL Irql;
> +
> +    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
> +
> +    Context = EvtchnFindChannel(Fdo, LocalPort, FileObject);
> +
> +    status = STATUS_NOT_FOUND;
> +    if (Context == NULL)
> +        goto fail1;
> +
> +    XENBUS_EVTCHN(Send,
> +                  &Fdo->EvtchnInterface,
> +                  Context->Channel);
> +
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +
> +    return STATUS_SUCCESS;
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnNotify(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_NOTIFY_IN In = Buffer;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_EVTCHN_NOTIFY_IN) ||
> +        OutLen != 0) {
> +        goto fail1;
> +    }
> +
> +#if DBG
> +    XenIfaceDebugPrint(INFO, "> LocalPort %d, FO %p\n", In->LocalPort,
> FileObject);
> +#endif
> +
> +    return EvtchnNotify(Fdo, In->LocalPort, FileObject);
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnUnmask(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_EVTCHN_UNMASK_IN In = Buffer;
> +    PXENIFACE_EVTCHN_CONTEXT Context;
> +    KIRQL Irql;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_EVTCHN_UNMASK_IN) ||
> +        OutLen != 0) {
> +        goto fail1;
> +    }
> +
> +    XenIfaceDebugPrint(TRACE, "> LocalPort %d, FO %p\n", In->LocalPort,
> FileObject);
> +
> +    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
> +
> +    Context = EvtchnFindChannel(Fdo, In->LocalPort, FileObject);
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (Context == NULL)
> +        goto fail2;
> +
> +    XENBUS_EVTCHN(Unmask,
> +                  &Fdo->EvtchnInterface,
> +                  Context->Channel,
> +                  FALSE);
> +
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> diff --git a/src/xeniface/ioctl_gnttab.c b/src/xeniface/ioctl_gnttab.c
> new file mode 100644
> index 0000000..a24a5ee
> --- /dev/null
> +++ b/src/xeniface/ioctl_gnttab.c
> @@ -0,0 +1,747 @@
> +/* Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
> + * 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 "driver.h"
> +#include "ioctls.h"
> +#include "xeniface_ioctls.h"
> +#include "log.h"
> +#include "irp_queue.h"
> +
> +// Complete a canceled gnttab IRP, cleanup associated grant/map.
> +_Function_class_(IO_WORKITEM_ROUTINE)
> +VOID
> +CompleteGnttabIrp(
> +    __in      PDEVICE_OBJECT DeviceObject,
> +    __in_opt  PVOID          Context
> +    )
> +{
> +    PXENIFACE_DX Dx = (PXENIFACE_DX)DeviceObject->DeviceExtension;
> +    PXENIFACE_FDO Fdo = Dx->Fdo;
> +    PIRP Irp = Context;
> +    PXENIFACE_CONTEXT_ID Id;
> +    PIO_WORKITEM WorkItem;
> +    KAPC_STATE ApcState;
> +    BOOLEAN ChangeProcess;
> +
> +    ASSERT(Context != NULL);
> +
> +    Id = Irp->Tail.Overlay.DriverContext[0];
> +    WorkItem = Irp->Tail.Overlay.DriverContext[1];
> +
> +    // We are not guaranteed to be in the context of the process that
> initiated the IRP,
> +    // but we need to be there to unmap memory.
> +    ChangeProcess = PsGetCurrentProcess() != Id->Process;
> +    if (ChangeProcess) {
> +        XenIfaceDebugPrint(TRACE, "Changing process from %p to %p\n",
> PsGetCurrentProcess(), Id->Process);
> +        KeStackAttachProcess(Id->Process, &ApcState);
> +    }
> +
> +    XenIfaceDebugPrint(TRACE, "Irp %p, Process %p, Id %lu, Type %d, IRQL
> %d\n",
> +                       Irp, Id->Process, Id->RequestId, Id->Type, KeGetCurrentIrql());
> +
> +    switch (Id->Type) {
> +
> +    case XENIFACE_CONTEXT_GRANT:
> +        GnttabFreeGrant(Fdo, CONTAINING_RECORD(Id,
> XENIFACE_GRANT_CONTEXT, Id));
> +        break;
> +
> +    case XENIFACE_CONTEXT_MAP:
> +        GnttabFreeMap(Fdo, CONTAINING_RECORD(Id,
> XENIFACE_MAP_CONTEXT, Id));
> +        break;
> +
> +    default:
> +        ASSERT(FALSE);
> +    }
> +
> +    if (ChangeProcess)
> +        KeUnstackDetachProcess(&ApcState);
> +
> +    IoFreeWorkItem(WorkItem);
> +
> +    Irp->IoStatus.Status = STATUS_CANCELLED;
> +    Irp->IoStatus.Information = 0;
> +    IoCompleteRequest(Irp, IO_NO_INCREMENT);
> +}
> +
> +_Acquires_exclusive_lock_(((PXENIFACE_FDO)Argument)-
> >GnttabCacheLock)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +VOID
> +GnttabAcquireLock(
> +    __in  PVOID Argument
> +    )
> +{
> +    PXENIFACE_FDO Fdo = Argument;
> +
> +    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
> +
> +    KeAcquireSpinLockAtDpcLevel(&Fdo->GnttabCacheLock);
> +}
> +
> +_Releases_exclusive_lock_(((PXENIFACE_FDO)Argument)-
> >GnttabCacheLock)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +VOID
> +GnttabReleaseLock(
> +    __in  PVOID Argument
> +    )
> +{
> +    PXENIFACE_FDO Fdo = Argument;
> +
> +    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
> +
> +    KeReleaseSpinLockFromDpcLevel(&Fdo->GnttabCacheLock);
> +}
> +
> +_Requires_lock_not_held_(Fdo->IrpQueueLock)
> +static
> +PIRP
> +FindGnttabIrp(
> +    __in  PXENIFACE_FDO Fdo,
> +    __in  PXENIFACE_CONTEXT_ID Id
> +    )
> +{
> +    KIRQL Irql;
> +    PIRP Irp;
> +
> +    CsqAcquireLock(&Fdo->IrpQueue, &Irql);
> +    Irp = CsqPeekNextIrp(&Fdo->IrpQueue, NULL, Id);
> +    CsqReleaseLock(&Fdo->IrpQueue, Irql);
> +    return Irp;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabPermitForeignAccess(
> +    __in     PXENIFACE_FDO  Fdo,
> +    __in     PVOID          Buffer,
> +    __in     ULONG          InLen,
> +    __in     ULONG          OutLen,
> +    __inout  PIRP           Irp
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN In;
> +    PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT Out = Irp-
> >UserBuffer;
> +    PXENIFACE_GRANT_CONTEXT Context;
> +    ULONG Page;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN))
> +        goto fail1;
> +
> +    // This IOCTL uses METHOD_NEITHER so we directly access user memory.
> +    status = __CaptureUserBuffer(Buffer, InLen, &In);
> +    if (!NT_SUCCESS(status))
> +        goto fail2;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (In->NumberPages == 0 ||
> +        In->NumberPages > 1024 * 1024) {
> +        goto fail3;
> +    }
> +
> +    if ((In->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) &&
> +        (In->NotifyOffset >= In->NumberPages * PAGE_SIZE)) {
> +        goto fail4;
> +    }
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (OutLen !=
> (ULONG)FIELD_OFFSET(XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OU
> T, References[In->NumberPages]))
> +        goto fail5;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context = ExAllocatePoolWithTag(NonPagedPool,
> sizeof(XENIFACE_GRANT_CONTEXT), XENIFACE_POOL_TAG);
> +    if (Context == NULL)
> +        goto fail6;
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
> +    Context->Id.Type = XENIFACE_CONTEXT_GRANT;
> +    Context->Id.Process = PsGetCurrentProcess();
> +    Context->Id.RequestId = In->RequestId;
> +    Context->RemoteDomain = In->RemoteDomain;
> +    Context->NumberPages = In->NumberPages;
> +    Context->Flags = In->Flags;
> +    Context->NotifyOffset = In->NotifyOffset;
> +    Context->NotifyPort = In->NotifyPort;
> +
> +    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, NumberPages %lu,
> Flags 0x%x, Offset 0x%x, Port %d, Process %p, Id %lu\n",
> +                       Context->RemoteDomain, Context->NumberPages, Context-
> >Flags, Context->NotifyOffset, Context->NotifyPort,
> +                       Context->Id.Process, Context->Id.RequestId);
> +
> +    // Check if the request ID is unique for this process.
> +    // This doesn't protect us from simultaneous requests with the same ID
> arriving here
> +    // but another check for duplicate ID is performed when the context/IRP
> is queued at the end.
> +    // Ideally we would lock the whole section but that's not really an option
> since we touch user memory.
> +    status = STATUS_INVALID_PARAMETER;
> +    if (FindGnttabIrp(Fdo, &Context->Id) != NULL)
> +        goto fail7;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context->Grants = ExAllocatePoolWithTag(NonPagedPool, Context-
> >NumberPages * sizeof(PXENBUS_GNTTAB_ENTRY),
> XENIFACE_POOL_TAG);
> +    if (Context->Grants == NULL)
> +        goto fail8;
> +
> +    RtlZeroMemory(Context->Grants, Context->NumberPages *
> sizeof(PXENBUS_GNTTAB_ENTRY));
> +
> +    // allocate memory to share
> +    status = STATUS_NO_MEMORY;
> +    Context->KernelVa = ExAllocatePoolWithTag(NonPagedPool, Context-
> >NumberPages * PAGE_SIZE, XENIFACE_POOL_TAG);
> +    if (Context->KernelVa == NULL)
> +        goto fail9;
> +
> +    RtlZeroMemory(Context->KernelVa, Context->NumberPages *
> PAGE_SIZE);
> +    Context->Mdl = IoAllocateMdl(Context->KernelVa, Context-
> >NumberPages * PAGE_SIZE, FALSE, FALSE, NULL);
> +    if (Context->Mdl == NULL)
> +        goto fail10;
> +
> +    MmBuildMdlForNonPagedPool(Context->Mdl);
> +    ASSERT(MmGetMdlByteCount(Context->Mdl) == Context-
> >NumberPages * PAGE_SIZE);
> +
> +    // perform sharing
> +    for (Page = 0; Page < Context->NumberPages; Page++) {
> +        status = XENBUS_GNTTAB(PermitForeignAccess,
> +                               &Fdo->GnttabInterface,
> +                               Fdo->GnttabCache,
> +                               FALSE,
> +                               Context->RemoteDomain,
> +                               MmGetMdlPfnArray(Context->Mdl)[Page],
> +                               (Context->Flags & XENIFACE_GNTTAB_READONLY) != 0,
> +                               &(Context->Grants[Page]));
> +
> +// prefast somehow thinks that this call can modify Page...
> +#pragma prefast(suppress:6385)
> +        XenIfaceDebugPrint(INFO, "Grants[%lu] = %p\n", Page, Context-
> >Grants[Page]);
> +        if (!NT_SUCCESS(status))
> +            goto fail11;
> +    }
> +
> +    // map into user mode
> +#pragma prefast(suppress:6320) // we want to catch all exceptions
> +    __try {
> +        Context->UserVa = MmMapLockedPagesSpecifyCache(Context->Mdl,
> +                                                       UserMode,
> +                                                       MmCached,
> +                                                       NULL,
> +                                                       FALSE,
> +                                                       NormalPagePriority);
> +    }
> +    __except (EXCEPTION_EXECUTE_HANDLER) {
> +        status = GetExceptionCode();
> +        goto fail12;
> +    }
> +
> +    status = STATUS_UNSUCCESSFUL;
> +    if (Context->UserVa == NULL)
> +        goto fail13;
> +
> +    XenIfaceDebugPrint(TRACE, "< Context %p, Irp %p, KernelVa %p, UserVa
> %p\n",
> +                       Context, Irp, Context->KernelVa, Context->UserVa);
> +
> +    // Pass the result to user mode.
> +#pragma prefast(suppress: 6320) // we want to catch all exceptions
> +    try {
> +        ProbeForWrite(Out, OutLen, 1);
> +        Out->Address = Context->UserVa;
> +
> +        for (Page = 0; Page < Context->NumberPages; Page++) {
> +            Out->References[Page] = XENBUS_GNTTAB(GetReference,
> +                                                  &Fdo->GnttabInterface,
> +                                                  Context->Grants[Page]);
> +        }
> +    } except(EXCEPTION_EXECUTE_HANDLER) {
> +        status = GetExceptionCode();
> +        XenIfaceDebugPrint(ERROR, "Exception 0x%lx while probing/writing
> output buffer at %p, size 0x%lx\n", status, Out, OutLen);
> +        goto fail14;
> +    }
> +
> +    // Insert the IRP/context into the pending queue.
> +    // This also checks (again) if the request ID is unique for the calling
> process.
> +    Irp->Tail.Overlay.DriverContext[0] = &Context->Id;
> +    status = IoCsqInsertIrpEx(&Fdo->IrpQueue, Irp, NULL, &Context->Id);
> +    if (!NT_SUCCESS(status))
> +        goto fail15;
> +
> +    __FreeCapturedBuffer(In);
> +
> +    return STATUS_PENDING;
> +
> +fail15:
> +    XenIfaceDebugPrint(ERROR, "Fail15\n");
> +
> +fail14:
> +    XenIfaceDebugPrint(ERROR, "Fail14\n");
> +    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
> +
> +fail13:
> +    XenIfaceDebugPrint(ERROR, "Fail13\n");
> +
> +fail12:
> +    XenIfaceDebugPrint(ERROR, "Fail12\n");
> +
> +fail11:
> +    XenIfaceDebugPrint(ERROR, "Fail11: Page = %lu\n", Page);
> +
> +    while (Page > 0) {
> +        ASSERT(NT_SUCCESS(XENBUS_GNTTAB(RevokeForeignAccess,
> +                                        &Fdo->GnttabInterface,
> +                                        Fdo->GnttabCache,
> +                                        FALSE,
> +                                        Context->Grants[Page - 1])));
> +
> +        --Page;
> +    }
> +    IoFreeMdl(Context->Mdl);
> +
> +fail10:
> +    XenIfaceDebugPrint(ERROR, "Fail10\n");
> +    ExFreePoolWithTag(Context->KernelVa, XENIFACE_POOL_TAG);
> +
> +fail9:
> +    XenIfaceDebugPrint(ERROR, "Fail9\n");
> +    ExFreePoolWithTag(Context->Grants, XENIFACE_POOL_TAG);
> +
> +fail8:
> +    XenIfaceDebugPrint(ERROR, "Fail8\n");
> +
> +fail7:
> +    XenIfaceDebugPrint(ERROR, "Fail7\n");
> +    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +
> +fail6:
> +    XenIfaceDebugPrint(ERROR, "Fail6\n");
> +
> +fail5:
> +    XenIfaceDebugPrint(ERROR, "Fail5\n");
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +    __FreeCapturedBuffer(In);
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +_IRQL_requires_max_(APC_LEVEL)
> +VOID
> +GnttabFreeGrant(
> +    __in     PXENIFACE_FDO            Fdo,
> +    __inout  PXENIFACE_GRANT_CONTEXT  Context
> +)
> +{
> +    NTSTATUS status;
> +    ULONG Page;
> +
> +    ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
> +
> +    XenIfaceDebugPrint(TRACE, "Context %p\n", Context);
> +
> +    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) {
> +        ((PCHAR)Context->KernelVa)[Context->NotifyOffset] = 0;
> +    }
> +
> +    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_PORT) {
> +        status = EvtchnNotify(Fdo, Context->NotifyPort, NULL);
> +
> +        if (!NT_SUCCESS(status)) // non-fatal, we must free memory
> +            XenIfaceDebugPrint(ERROR, "failed to notify port %lu: 0x%x\n",
> Context->NotifyPort, status);
> +    }
> +
> +    // unmap from user address space
> +    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
> +
> +    // stop sharing
> +    for (Page = 0; Page < Context->NumberPages; Page++) {
> +        status = XENBUS_GNTTAB(RevokeForeignAccess,
> +                               &Fdo->GnttabInterface,
> +                               Fdo->GnttabCache,
> +                               FALSE,
> +                               Context->Grants[Page]);
> +
> +        ASSERT(NT_SUCCESS(status)); // failure here is fatal, something
> must've gone catastrophically wrong
> +    }
> +
> +    IoFreeMdl(Context->Mdl);
> +
> +    RtlZeroMemory(Context->KernelVa, Context->NumberPages *
> PAGE_SIZE);
> +    ExFreePoolWithTag(Context->KernelVa, XENIFACE_POOL_TAG);
> +
> +    RtlZeroMemory(Context->Grants, Context->NumberPages *
> sizeof(PXENBUS_GNTTAB_ENTRY));
> +    ExFreePoolWithTag(Context->Grants, XENIFACE_POOL_TAG);
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_GRANT_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabRevokeForeignAccess(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN In = Buffer;
> +    PXENIFACE_GRANT_CONTEXT Context = NULL;
> +    XENIFACE_CONTEXT_ID Id;
> +    PIRP PendingIrp;
> +    PXENIFACE_CONTEXT_ID ContextId;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN))
> +        goto fail1;
> +
> +    Id.Type = XENIFACE_CONTEXT_GRANT;
> +    Id.Process = PsGetCurrentProcess();
> +    Id.RequestId = In->RequestId;
> +
> +    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process,
> Id.RequestId);
> +
> +    status = STATUS_NOT_FOUND;
> +    PendingIrp = IoCsqRemoveNextIrp(&Fdo->IrpQueue, &Id);
> +    if (PendingIrp == NULL)
> +        goto fail2;
> +
> +    ContextId = PendingIrp->Tail.Overlay.DriverContext[0];
> +    Context = CONTAINING_RECORD(ContextId,
> XENIFACE_GRANT_CONTEXT, Id);
> +    GnttabFreeGrant(Fdo, Context);
> +
> +    PendingIrp->IoStatus.Status = STATUS_SUCCESS;
> +    PendingIrp->IoStatus.Information = 0;
> +    IoCompleteRequest(PendingIrp, IO_NO_INCREMENT);
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabMapForeignPages(
> +    __in     PXENIFACE_FDO     Fdo,
> +    __in     PVOID             Buffer,
> +    __in     ULONG             InLen,
> +    __in     ULONG             OutLen,
> +    __inout  PIRP              Irp
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN In = Buffer;
> +    PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT Out = Irp-
> >UserBuffer;
> +    ULONG NumberPages;
> +    ULONG PageIndex;
> +    PXENIFACE_MAP_CONTEXT Context;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen < sizeof(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN) ||
> +        OutLen != sizeof(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT)) {
> +        goto fail1;
> +    }
> +
> +    // This IOCTL uses METHOD_NEITHER so we directly access user memory.
> +
> +    // Calculate the expected number of pages based on input buffer size.
> +    NumberPages = (InLen -
> (ULONG)FIELD_OFFSET(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN,
> References)) / sizeof(In->References[0]);
> +
> +    status = __CaptureUserBuffer(Buffer, InLen, &In);
> +    if (!NT_SUCCESS(status))
> +        goto fail2;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (In->NumberPages == 0 ||
> +        In->NumberPages > 1024 * 1024 ||
> +        In->NumberPages != NumberPages) {
> +        goto fail3;
> +    }
> +
> +    if ((In->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) &&
> +        (In->NotifyOffset >= In->NumberPages * PAGE_SIZE)) {
> +        goto fail4;
> +    }
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen !=
> (ULONG)FIELD_OFFSET(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN,
> References[In->NumberPages]))
> +        goto fail5;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context = ExAllocatePoolWithTag(NonPagedPool,
> sizeof(XENIFACE_MAP_CONTEXT), XENIFACE_POOL_TAG);
> +    if (Context == NULL)
> +        goto fail6;
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
> +    Context->Id.Type = XENIFACE_CONTEXT_MAP;
> +    Context->Id.Process = PsGetCurrentProcess();
> +    Context->Id.RequestId = In->RequestId;
> +    Context->RemoteDomain = In->RemoteDomain;
> +    Context->NumberPages = In->NumberPages;
> +    Context->Flags = In->Flags;
> +    Context->NotifyOffset = In->NotifyOffset;
> +    Context->NotifyPort = In->NotifyPort;
> +
> +    XenIfaceDebugPrint(TRACE, "> RemoteDomain %d, NumberPages %lu,
> Flags 0x%x, Offset 0x%x, Port %d, Process %p, Id %lu\n",
> +                       Context->RemoteDomain, Context->NumberPages, Context-
> >Flags, Context->NotifyOffset, Context->NotifyPort,
> +                       Context->Id.Process, Context->Id.RequestId);
> +
> +    for (PageIndex = 0; PageIndex < In->NumberPages; PageIndex++)
> +        XenIfaceDebugPrint(INFO, "> Ref %d\n", In->References[PageIndex]);
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (FindGnttabIrp(Fdo, &Context->Id) != NULL)
> +        goto fail7;
> +
> +    status = XENBUS_GNTTAB(MapForeignPages,
> +                           &Fdo->GnttabInterface,
> +                           Context->RemoteDomain,
> +                           Context->NumberPages,
> +                           In->References,
> +                           Context->Flags & XENIFACE_GNTTAB_READONLY,
> +                           &Context->Address);
> +
> +    if (!NT_SUCCESS(status))
> +        goto fail8;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context->KernelVa = MmMapIoSpace(Context->Address, Context-
> >NumberPages * PAGE_SIZE, MmCached);
> +    if (Context->KernelVa == NULL)
> +        goto fail9;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context->Mdl = IoAllocateMdl(Context->KernelVa, Context-
> >NumberPages * PAGE_SIZE, FALSE, FALSE, NULL);
> +    if (Context->Mdl == NULL)
> +        goto fail10;
> +
> +    MmBuildMdlForNonPagedPool(Context->Mdl);
> +
> +    // map into user mode
> +#pragma prefast(suppress: 6320) // we want to catch all exceptions
> +    __try {
> +        Context->UserVa = MmMapLockedPagesSpecifyCache(Context->Mdl,
> +                                                       UserMode,
> +                                                       MmCached,
> +                                                       NULL,
> +                                                       FALSE,
> +                                                       NormalPagePriority);
> +    }
> +    __except (EXCEPTION_EXECUTE_HANDLER) {
> +        status = GetExceptionCode();
> +        goto fail11;
> +    }
> +
> +    status = STATUS_UNSUCCESSFUL;
> +    if (Context->UserVa == NULL)
> +        goto fail12;
> +
> +    XenIfaceDebugPrint(TRACE, "< Context %p, Irp %p, Address %p, KernelVa
> %p, UserVa %p\n",
> +                       Context, Irp, Context->Address, Context->KernelVa, Context-
> >UserVa);
> +
> +    // Pass the result to user mode.
> +#pragma prefast(suppress: 6320) // we want to catch all exceptions
> +    try {
> +        ProbeForWrite(Out, OutLen, 1);
> +        Out->Address = Context->UserVa;
> +    } except(EXCEPTION_EXECUTE_HANDLER) {
> +        status = GetExceptionCode();
> +        XenIfaceDebugPrint(ERROR, "Exception 0x%lx while probing/writing
> output buffer at %p, size 0x%lx\n", status, Out, OutLen);
> +        goto fail13;
> +    }
> +
> +    // Insert the IRP/context into the pending queue.
> +    // This also checks (again) if the request ID is unique for the calling
> process.
> +    Irp->Tail.Overlay.DriverContext[0] = &Context->Id;
> +    status = IoCsqInsertIrpEx(&Fdo->IrpQueue, Irp, NULL, &Context->Id);
> +    if (!NT_SUCCESS(status))
> +        goto fail14;
> +
> +    __FreeCapturedBuffer(In);
> +
> +    return STATUS_PENDING;
> +
> +fail14:
> +    XenIfaceDebugPrint(ERROR, "Fail14\n");
> +
> +fail13:
> +    XenIfaceDebugPrint(ERROR, "Fail13\n");
> +    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
> +
> +fail12:
> +    XenIfaceDebugPrint(ERROR, "Fail12\n");
> +
> +fail11:
> +    XenIfaceDebugPrint(ERROR, "Fail11\n");
> +    IoFreeMdl(Context->Mdl);
> +
> +fail10:
> +    XenIfaceDebugPrint(ERROR, "Fail10\n");
> +    MmUnmapIoSpace(Context->KernelVa, Context->NumberPages *
> PAGE_SIZE);
> +
> +fail9:
> +    XenIfaceDebugPrint(ERROR, "Fail9\n");
> +    ASSERT(NT_SUCCESS(XENBUS_GNTTAB(UnmapForeignPages,
> +                                    &Fdo->GnttabInterface,
> +                                    Context->Address
> +                                    )));
> +
> +fail8:
> +    XenIfaceDebugPrint(ERROR, "Fail8\n");
> +
> +fail7:
> +    XenIfaceDebugPrint(ERROR, "Fail7\n");
> +    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +
> +fail6:
> +    XenIfaceDebugPrint(ERROR, "Fail6\n");
> +
> +fail5:
> +    XenIfaceDebugPrint(ERROR, "Fail5\n");
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +    __FreeCapturedBuffer(In);
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +_IRQL_requires_max_(APC_LEVEL)
> +DECLSPEC_NOINLINE
> +VOID
> +GnttabFreeMap(
> +    __in     PXENIFACE_FDO            Fdo,
> +    __inout  PXENIFACE_MAP_CONTEXT    Context
> +    )
> +{
> +    NTSTATUS status;
> +
> +    ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
> +
> +    XenIfaceDebugPrint(TRACE, "Context %p\n", Context);
> +
> +    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_OFFSET) {
> +        ((PCHAR)Context->KernelVa)[Context->NotifyOffset] = 0;
> +    }
> +
> +    if (Context->Flags & XENIFACE_GNTTAB_USE_NOTIFY_PORT) {
> +        status = EvtchnNotify(Fdo, Context->NotifyPort, NULL);
> +
> +        if (!NT_SUCCESS(status)) // non-fatal, we must free memory
> +            XenIfaceDebugPrint(ERROR, "failed to notify port %lu: 0x%x\n",
> Context->NotifyPort, status);
> +    }
> +
> +    // unmap from user address space
> +    MmUnmapLockedPages(Context->UserVa, Context->Mdl);
> +
> +    IoFreeMdl(Context->Mdl);
> +
> +    // unmap from system space
> +    MmUnmapIoSpace(Context->KernelVa, Context->NumberPages *
> PAGE_SIZE);
> +
> +    // undo mapping
> +    status = XENBUS_GNTTAB(UnmapForeignPages,
> +                           &Fdo->GnttabInterface,
> +                           Context->Address);
> +
> +    ASSERT(NT_SUCCESS(status));
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_MAP_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabUnmapForeignPages(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN In = Buffer;
> +    PXENIFACE_MAP_CONTEXT Context = NULL;
> +    XENIFACE_CONTEXT_ID Id;
> +    PIRP PendingIrp;
> +    PXENIFACE_CONTEXT_ID ContextId;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN) &&
> +        OutLen != 0) {
> +        goto fail1;
> +    }
> +
> +    Id.Type = XENIFACE_CONTEXT_MAP;
> +    Id.Process = PsGetCurrentProcess();
> +    Id.RequestId = In->RequestId;
> +
> +    XenIfaceDebugPrint(TRACE, "> Process %p, Id %lu\n", Id.Process,
> Id.RequestId);
> +
> +    status = STATUS_NOT_FOUND;
> +    PendingIrp = IoCsqRemoveNextIrp(&Fdo->IrpQueue, &Id);
> +    if (PendingIrp == NULL)
> +        goto fail2;
> +
> +    ContextId = PendingIrp->Tail.Overlay.DriverContext[0];
> +    Context = CONTAINING_RECORD(ContextId, XENIFACE_MAP_CONTEXT,
> Id);
> +    GnttabFreeMap(Fdo, Context);
> +
> +    PendingIrp->IoStatus.Status = STATUS_SUCCESS;
> +    PendingIrp->IoStatus.Information = 0;
> +    IoCompleteRequest(PendingIrp, IO_NO_INCREMENT);
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> diff --git a/src/xeniface/ioctl_store.c b/src/xeniface/ioctl_store.c
> new file mode 100644
> index 0000000..5bd4649
> --- /dev/null
> +++ b/src/xeniface/ioctl_store.c
> @@ -0,0 +1,608 @@
> +/* Copyright (c) Citrix Systems Inc.
> + * Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
> + * 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 "driver.h"
> +#include "ioctls.h"
> +#include "xeniface_ioctls.h"
> +#include "log.h"
> +
> +#define XENSTORE_ABS_PATH_MAX 3072
> +#define XENSTORE_REL_PATH_MAX 2048
> +
> +static FORCEINLINE
> +BOOLEAN
> +__IsValidStr(
> +    __in  PCHAR             Str,
> +    __in  ULONG             Len
> +    )
> +{
> +    for ( ; Len--; ++Str) {
> +        if (*Str == '\0')
> +            return TRUE;
> +        if (!isprint((unsigned char)*Str))
> +            break;
> +    }
> +    return FALSE;
> +}
> +
> +static FORCEINLINE
> +ULONG
> +__MultiSzLen(
> +    __in  PCHAR             Str,
> +    __out PULONG            Count
> +    )
> +{
> +    ULONG Length = 0;
> +    if (Count)  *Count = 0;
> +    do {
> +        for ( ; *Str; ++Str, ++Length) ;
> +        ++Str; ++Length;
> +        if (*Count) ++(*Count);
> +    } while (*Str);
> +    return Length;
> +}
> +
> +static FORCEINLINE
> +VOID
> +__DisplayMultiSz(
> +    __in PCHAR              Caller,
> +    __in PCHAR              Str
> +    )
> +{
> +    PCHAR   Ptr;
> +    ULONG   Idx;
> +    ULONG   Len;
> +
> +    for (Ptr = Str, Idx = 0; *Ptr; ++Idx) {
> +        Len = (ULONG)strlen(Ptr);
> +        XenIfaceDebugPrint(TRACE, "|%s: [%d]=(%d)->\"%s\"\n", Caller, Idx,
> Len, Ptr);
> +        Ptr += (Len + 1);
> +    }
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRead(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS    status;
> +    PCHAR       Value;
> +    ULONG       Length;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen == 0)
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (!__IsValidStr(Buffer, InLen))
> +        goto fail2;
> +
> +    status = XENBUS_STORE(Read, &Fdo->StoreInterface, NULL, NULL,
> Buffer, &Value);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    Length = (ULONG)strlen(Value) + 1;
> +
> +    status = STATUS_BUFFER_OVERFLOW;
> +    if (OutLen == 0) {
> +        XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)\n", Buffer, Length);
> +        goto done;
> +    }
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (OutLen < Length)
> +        goto fail4;
> +
> +    XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)->\"%s\"\n", Buffer, Length,
> Value);
> +
> +    RtlCopyMemory(Buffer, Value, Length);
> +    Buffer[Length - 1] = 0;
> +    status = STATUS_SUCCESS;
> +
> +done:
> +    *Info = (ULONG_PTR)Length;
> +    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> +    return status;
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")=(%d < %d)\n", Buffer,
> OutLen, Length);
> +    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreWrite(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    )
> +{
> +    NTSTATUS    status;
> +    PCHAR       Value;
> +    ULONG       Length;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen == 0 || OutLen != 0)
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (!__IsValidStr(Buffer, InLen))
> +        goto fail2;
> +
> +    Length = (ULONG)strlen(Buffer) + 1;
> +    Value = Buffer + Length;
> +
> +    if (!__IsValidStr(Value, InLen - Length))
> +        goto fail3;
> +
> +    status = XENBUS_STORE(Printf, &Fdo->StoreInterface, NULL, NULL,
> Buffer, Value);
> +    if (!NT_SUCCESS(status))
> +        goto fail4;
> +
> +    XenIfaceDebugPrint(TRACE, "(\"%s\"=\"%s\")\n", Buffer, Value);
> +    return status;
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")\n", Value);
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreDirectory(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS    status;
> +    PCHAR       Value;
> +    ULONG       Length;
> +    ULONG       Count;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen == 0)
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (!__IsValidStr(Buffer, InLen))
> +        goto fail2;
> +
> +    status = XENBUS_STORE(Directory, &Fdo->StoreInterface, NULL, NULL,
> Buffer, &Value);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    Length = __MultiSzLen(Value, &Count) + 1;
> +
> +    status = STATUS_BUFFER_OVERFLOW;
> +    if (OutLen == 0) {
> +        XenIfaceDebugPrint(TRACE, "(\"%s\")=(%d)(%d)\n", Buffer, Length,
> Count);
> +        goto done;
> +    }
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (OutLen < Length)
> +        goto fail4;
> +
> +    XenIfaceDebugPrint(INFO, "(\"%s\")=(%d)(%d)\n", Buffer, Length,
> Count);
> +#if DBG
> +    __DisplayMultiSz(__FUNCTION__, Value);
> +#endif
> +
> +    RtlCopyMemory(Buffer, Value, Length);
> +    Buffer[Length - 2] = 0;
> +    Buffer[Length - 1] = 0;
> +    status = STATUS_SUCCESS;
> +
> +done:
> +    *Info = (ULONG_PTR)Length;
> +    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> +    return status;
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4 (\"%s\")=(%d < %d)\n", Buffer,
> OutLen, Length);
> +    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRemove(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    )
> +{
> +    NTSTATUS    status;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen == 0 || OutLen != 0)
> +        goto fail1;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (!__IsValidStr(Buffer, InLen))
> +        goto fail2;
> +
> +    status = XENBUS_STORE(Remove, &Fdo->StoreInterface, NULL, NULL,
> Buffer);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    XenIfaceDebugPrint(TRACE, "(\"%s\")\n", Buffer);
> +    return status;
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3 (\"%s\")\n", Buffer);
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +static
> +PXENBUS_STORE_PERMISSION
> +__ConvertPermissions(
> +    __in  ULONG                       NumberPermissions,
> +    __in  PXENIFACE_STORE_PERMISSION  XenifacePermissions
> +)
> +{
> +    PXENBUS_STORE_PERMISSION          XenbusPermissions;
> +    ULONG                             Index;
> +
> +    if (NumberPermissions > 255)
> +        goto fail1;
> +
> +    XenbusPermissions = ExAllocatePoolWithTag(NonPagedPool,
> NumberPermissions * sizeof(XENBUS_STORE_PERMISSION),
> XENIFACE_POOL_TAG);
> +    if (XenbusPermissions == NULL)
> +        goto fail2;
> +
> +    // Currently XENIFACE_STORE_PERMISSION is the same as
> XENBUS_STORE_PERMISSION,
> +    // but we convert them here in case something changes in the future.
> +    for (Index = 0; Index < NumberPermissions; Index++) {
> +        if ((XenifacePermissions[Index].Mask &
> ~XENIFACE_STORE_ALLOWED_PERMISSIONS) != 0)
> +            goto fail3;
> +
> +        XenbusPermissions[Index].Domain =
> XenifacePermissions[Index].Domain;
> +        XenbusPermissions[Index].Mask =
> (XENBUS_STORE_PERMISSION_MASK)XenifacePermissions[Index].Mask;
> +    }
> +
> +    return XenbusPermissions;
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +    ExFreePoolWithTag(XenbusPermissions, XENIFACE_POOL_TAG);
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1\n");
> +    return NULL;
> +}
> +
> +static
> +VOID
> +__FreePermissions(
> +    __in  PXENBUS_STORE_PERMISSION    Permissions
> +    )
> +{
> +    ExFreePoolWithTag(Permissions, XENIFACE_POOL_TAG);
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreSetPermissions(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_STORE_SET_PERMISSIONS_IN In = Buffer;
> +    PXENBUS_STORE_PERMISSION Permissions;
> +    ULONG Index;
> +    PCHAR Path;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen < sizeof(XENIFACE_STORE_SET_PERMISSIONS_IN) ||
> +        OutLen != 0) {
> +        goto fail1;
> +    }
> +
> +    if (InLen !=
> (ULONG)FIELD_OFFSET(XENIFACE_STORE_SET_PERMISSIONS_IN,
> Permissions[In->NumberPermissions]))
> +        goto fail2;
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (In->PathLength == 0 ||
> +        In->PathLength > XENSTORE_ABS_PATH_MAX) {
> +        goto fail3;
> +    }
> +
> +    Permissions = __ConvertPermissions(In->NumberPermissions, In-
> >Permissions);
> +    if (Permissions == NULL)
> +        goto fail4;
> +
> +    status = __CaptureUserBuffer(In->Path, In->PathLength, &Path);
> +    if (!NT_SUCCESS(status))
> +        goto fail5;
> +
> +    Path[In->PathLength - 1] = 0;
> +    XenIfaceDebugPrint(TRACE, "> Path '%s', NumberPermissions %lu\n",
> Path, In->NumberPermissions);
> +
> +    for (Index = 0; Index < In->NumberPermissions; Index++) {
> +        XenIfaceDebugPrint(TRACE, "> %lu: Domain %d, Mask 0x%x\n",
> +                           Index, Permissions[Index].Domain,
> Permissions[Index].Mask);
> +    }
> +
> +    status = XENBUS_STORE(PermissionsSet,
> +                          &Fdo->StoreInterface,
> +                          NULL, // transaction
> +                          NULL, // prefix
> +                          Path,
> +                          Permissions,
> +                          In->NumberPermissions);
> +
> +    if (!NT_SUCCESS(status))
> +        goto fail6;
> +
> +    __FreeCapturedBuffer(Path);
> +    return status;
> +
> +fail6:
> +    XenIfaceDebugPrint(ERROR, "Fail6\n");
> +    __FreeCapturedBuffer(Path);
> +
> +fail5:
> +    XenIfaceDebugPrint(ERROR, "Fail5\n");
> +    __FreePermissions(Permissions);
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreAddWatch(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_STORE_ADD_WATCH_IN In = Buffer;
> +    PXENIFACE_STORE_ADD_WATCH_OUT Out = Buffer;
> +    PCHAR Path;
> +    PXENIFACE_STORE_CONTEXT Context;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_STORE_ADD_WATCH_IN) ||
> +        OutLen != sizeof(XENIFACE_STORE_ADD_WATCH_OUT)) {
> +        goto fail1;
> +    }
> +
> +    status = STATUS_INVALID_PARAMETER;
> +    if (In->PathLength == 0 ||
> +        In->PathLength > XENSTORE_ABS_PATH_MAX) {
> +        goto fail2;
> +    }
> +
> +    status = __CaptureUserBuffer(In->Path, In->PathLength, &Path);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    Path[In->PathLength - 1] = 0;
> +
> +    status = STATUS_NO_MEMORY;
> +    Context = ExAllocatePoolWithTag(NonPagedPool,
> sizeof(XENIFACE_STORE_CONTEXT), XENIFACE_POOL_TAG);
> +    if (Context == NULL)
> +        goto fail4;
> +
> +    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
> +
> +    Context->FileObject = FileObject;
> +
> +    status = ObReferenceObjectByHandle(In->Event,
> +                                       EVENT_MODIFY_STATE,
> +                                       *ExEventObjectType,
> +                                       UserMode,
> +                                       &Context->Event,
> +                                       NULL);
> +    if (!NT_SUCCESS(status))
> +        goto fail5;
> +
> +    XenIfaceDebugPrint(TRACE, "> Path '%s', Event %p, FO %p\n", Path, In-
> >Event, FileObject);
> +
> +    status = XENBUS_STORE(WatchAdd,
> +                          &Fdo->StoreInterface,
> +                          NULL, // prefix
> +                          Path,
> +                          Context->Event,
> +                          &Context->Watch);
> +
> +    if (!NT_SUCCESS(status))
> +        goto fail6;
> +
> +    __FreeCapturedBuffer(Path);
> +
> +    ExInterlockedInsertTailList(&Fdo->StoreWatchList, &Context->Entry,
> &Fdo->StoreWatchLock);
> +
> +    XenIfaceDebugPrint(TRACE, "< Context %p, Watch %p\n", Context,
> Context->Watch);
> +
> +    Out->Context = Context;
> +    *Info = sizeof(XENIFACE_STORE_ADD_WATCH_OUT);
> +
> +    return status;
> +
> +fail6:
> +    XenIfaceDebugPrint(ERROR, "Fail6\n");
> +    ObDereferenceObject(Context->Event);
> +
> +fail5:
> +    XenIfaceDebugPrint(ERROR, "Fail5\n");
> +    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +
> +fail4:
> +    XenIfaceDebugPrint(ERROR, "Fail4\n");
> +    __FreeCapturedBuffer(Path);
> +
> +fail3:
> +    XenIfaceDebugPrint(ERROR, "Fail3\n");
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> +
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +VOID
> +StoreFreeWatch(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_STORE_CONTEXT Context
> +    )
> +{
> +    NTSTATUS status;
> +
> +    XenIfaceDebugPrint(TRACE, "Context %p, Watch %p, FO %p\n",
> +                       Context, Context->Watch, Context->FileObject);
> +
> +    status = XENBUS_STORE(WatchRemove,
> +                          &Fdo->StoreInterface,
> +                          Context->Watch);
> +
> +    ASSERT(NT_SUCCESS(status)); // this is fatal since we'd leave an active
> watch without cleaning it up
> +
> +    ObDereferenceObject(Context->Event);
> +    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
> +    ExFreePoolWithTag(Context, XENIFACE_POOL_TAG);
> +}
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRemoveWatch(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    )
> +{
> +    NTSTATUS status;
> +    PXENIFACE_STORE_REMOVE_WATCH_IN In = Buffer;
> +    PXENIFACE_STORE_CONTEXT Context = NULL;
> +    KIRQL Irql;
> +    PLIST_ENTRY Node;
> +
> +    status = STATUS_INVALID_BUFFER_SIZE;
> +    if (InLen != sizeof(XENIFACE_STORE_REMOVE_WATCH_IN) ||
> +        OutLen != 0) {
> +        goto fail1;
> +    }
> +
> +    XenIfaceDebugPrint(TRACE, "> Context %p, FO %p\n", In->Context,
> FileObject);
> +
> +    KeAcquireSpinLock(&Fdo->StoreWatchLock, &Irql);
> +    Node = Fdo->StoreWatchList.Flink;
> +    while (Node->Flink != Fdo->StoreWatchList.Flink) {
> +        Context = CONTAINING_RECORD(Node, XENIFACE_STORE_CONTEXT,
> Entry);
> +
> +        Node = Node->Flink;
> +        if (Context != In->Context ||
> +            Context->FileObject != FileObject) {
> +            continue;
> +        }
> +
> +        RemoveEntryList(&Context->Entry);
> +        break;
> +    }
> +    KeReleaseSpinLock(&Fdo->StoreWatchLock, Irql);
> +
> +    status = STATUS_NOT_FOUND;
> +    if (Context == NULL || Context != In->Context)
> +        goto fail2;
> +
> +    StoreFreeWatch(Fdo, Context);
> +
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    XenIfaceDebugPrint(ERROR, "Fail2\n");
> +
> +fail1:
> +    XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
> +    return status;
> +}
> diff --git a/src/xeniface/ioctls.c b/src/xeniface/ioctls.c
> index ead7f9b..b306a45 100644
> --- a/src/xeniface/ioctls.c
> +++ b/src/xeniface/ioctls.c
> @@ -1,4 +1,5 @@
>  /* Copyright (c) Citrix Systems Inc.
> + * Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
>   * All rights reserved.
>   *
>   * Redistribution and use in source and binary forms,
> @@ -29,266 +30,123 @@
>   * SUCH DAMAGE.
>   */
> 
> -
>  #include "driver.h"
>  #include "ioctls.h"
> -#include "..\..\include\xeniface_ioctls.h"
> +#include "xeniface_ioctls.h"
>  #include "log.h"
> 
> -static FORCEINLINE BOOLEAN
> -__IsValidStr(
> -    __in  PCHAR             Str,
> -    __in  ULONG             Len
> +NTSTATUS
> +__CaptureUserBuffer(
> +    __in  PVOID Buffer,
> +    __in  ULONG Length,
> +    __out PVOID *CapturedBuffer
>      )
>  {
> -    for ( ; Len--; ++Str) {
> -        if (*Str == '\0')
> -            return TRUE;
> -        if (!isprint((unsigned char)*Str))
> -            break;
> +    NTSTATUS Status;
> +    PVOID TempBuffer = NULL;
> +
> +    if (Length == 0) {
> +        *CapturedBuffer = NULL;
> +        return STATUS_SUCCESS;
>      }
> -    return FALSE;
> -}
> -static FORCEINLINE ULONG
> -__MultiSzLen(
> -    __in  PCHAR             Str,
> -    __out PULONG            Count
> -    )
> -{
> -    ULONG Length = 0;
> -    if (Count)  *Count = 0;
> -    do {
> -        for ( ; *Str; ++Str, ++Length) ;
> -        ++Str; ++Length;
> -        if (*Count) ++(*Count);
> -    } while (*Str);
> -    return Length;
> -}
> -static FORCEINLINE VOID
> -__DisplayMultiSz(
> -    __in PCHAR              Caller,
> -    __in PCHAR              Str
> -    )
> -{
> -    PCHAR   Ptr;
> -    ULONG   Idx;
> -    ULONG   Len;
> -
> -    for (Ptr = Str, Idx = 0; *Ptr; ++Idx) {
> -        Len = (ULONG)strlen(Ptr);
> -        XenIfaceDebugPrint(INFO, "|%s: [%d]=(%d)->\"%s\"\n", Caller, Idx,
> Len, Ptr);
> -        Ptr += (Len + 1);
> +
> +    Status = STATUS_NO_MEMORY;
> +    TempBuffer = ExAllocatePoolWithTag(NonPagedPool, Length,
> XENIFACE_POOL_TAG);
> +    if (TempBuffer == NULL)
> +        return STATUS_INSUFFICIENT_RESOURCES;
> +
> +    Status = STATUS_SUCCESS;
> +
> +#pragma prefast(suppress: 6320) // we want to catch all exceptions
> +    try {
> +        ProbeForRead(Buffer, Length, 1);
> +        RtlCopyMemory(TempBuffer, Buffer, Length);
> +    } except(EXCEPTION_EXECUTE_HANDLER) {
> +        XenIfaceDebugPrint(ERROR, "Exception while probing/reading buffer at
> %p, size 0x%lx\n", Buffer, Length);
> +        ExFreePoolWithTag(TempBuffer, XENIFACE_POOL_TAG);
> +        TempBuffer = NULL;
> +        Status = GetExceptionCode();
>      }
> -}
> 
> +    *CapturedBuffer = TempBuffer;
> 
> -static DECLSPEC_NOINLINE NTSTATUS
> -IoctlRead(
> -    __in  PXENIFACE_FDO         Fdo,
> -    __in  PCHAR             Buffer,
> -    __in  ULONG             InLen,
> -    __in  ULONG             OutLen,
> -    __out PULONG_PTR        Info
> -    )
> -{
> -    NTSTATUS    status;
> -    PCHAR       Value;
> -    ULONG       Length;
> -
> -    status = STATUS_INVALID_BUFFER_SIZE;
> -    if (InLen == 0)
> -        goto fail1;
> -
> -    status = STATUS_INVALID_PARAMETER;
> -    if (!__IsValidStr(Buffer, InLen))
> -        goto fail2;
> -
> -    status = XENBUS_STORE(Read, &Fdo->StoreInterface, NULL, NULL,
> Buffer, &Value);
> -    if (!NT_SUCCESS(status))
> -        goto fail3;
> -
> -    Length = (ULONG)strlen(Value) + 1;
> -
> -    status = STATUS_BUFFER_OVERFLOW;
> -    if (OutLen == 0) {
> -        XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)\n", __FUNCTION__,
> Buffer, Length);
> -        goto done;
> -    }
> -
> -    status = STATUS_INVALID_PARAMETER;
> -    if (OutLen < Length)
> -        goto fail4;
> -
> -    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)->\"%s\"\n",
> __FUNCTION__, Buffer, Length, Value);
> -
> -    RtlCopyMemory(Buffer, Value, Length);
> -    Buffer[Length - 1] = 0;
> -    status = STATUS_SUCCESS;
> -
> -done:
> -    *Info = (ULONG_PTR)Length;
> -    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> -    return status;
> -
> -fail4:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")=(%d < %d)\n",
> __FUNCTION__, Buffer, OutLen, Length);
> -    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> -fail3:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__,
> Buffer);
> -fail2:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
> -fail1:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__,
> status);
> -    return status;
> +    return Status;
>  }
> 
> -static DECLSPEC_NOINLINE NTSTATUS
> -IoctlWrite(
> -    __in  PXENIFACE_FDO         Fdo,
> -    __in  PCHAR             Buffer,
> -    __in  ULONG             InLen,
> -    __in  ULONG             OutLen
> +VOID
> +__FreeCapturedBuffer(
> +    __in  PVOID CapturedBuffer
>      )
>  {
> -    NTSTATUS    status;
> -    PCHAR       Value;
> -    ULONG       Length;
> -
> -    status = STATUS_INVALID_BUFFER_SIZE;
> -    if (InLen == 0 || OutLen != 0)
> -        goto fail1;
> -
> -    status = STATUS_INVALID_PARAMETER;
> -    if (!__IsValidStr(Buffer, InLen))
> -        goto fail2;
> -
> -    Length = (ULONG)strlen(Buffer) + 1;
> -    Value = Buffer + Length;
> -
> -    if (!__IsValidStr(Value, InLen - Length))
> -        goto fail3;
> -
> -    status = XENBUS_STORE(Printf, &Fdo->StoreInterface, NULL, NULL,
> Buffer, Value);
> -    if (!NT_SUCCESS(status))
> -        goto fail4;
> -
> -    XenIfaceDebugPrint(INFO, "|%s: (\"%s\"=\"%s\")\n", __FUNCTION__,
> Buffer, Value);
> -    return status;
> -
> -fail4:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")\n", __FUNCTION__,
> Value);
> -fail3:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__,
> Buffer);
> -fail2:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
> -fail1:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__,
> status);
> -    return status;
> +    if (CapturedBuffer != NULL) {
> +        ExFreePoolWithTag(CapturedBuffer, XENIFACE_POOL_TAG);
> +    }
>  }
> 
> -static DECLSPEC_NOINLINE NTSTATUS
> -IoctlDirectory(
> -    __in  PXENIFACE_FDO         Fdo,
> -    __in  PCHAR             Buffer,
> -    __in  ULONG             InLen,
> -    __in  ULONG             OutLen,
> -    __out PULONG_PTR        Info
> +// Cleanup store watches and event channels, called on file object close.
> +_IRQL_requires_(PASSIVE_LEVEL) // EvtchnFree calls KeFlushQueuedDpcs
> +VOID
> +XenIfaceCleanup(
> +    __in  PXENIFACE_FDO Fdo,
> +    __in  PFILE_OBJECT  FileObject
>      )
>  {
> -    NTSTATUS    status;
> -    PCHAR       Value;
> -    ULONG       Length;
> -    ULONG       Count;
> -
> -    status = STATUS_INVALID_BUFFER_SIZE;
> -    if (InLen == 0)
> -        goto fail1;
> -
> -    status = STATUS_INVALID_PARAMETER;
> -    if (!__IsValidStr(Buffer, InLen))
> -        goto fail2;
> -
> -    status = XENBUS_STORE(Directory, &Fdo->StoreInterface, NULL, NULL,
> Buffer, &Value);
> -    if (!NT_SUCCESS(status))
> -        goto fail3;
> -
> -    Length = __MultiSzLen(Value, &Count) + 1;
> -
> -    status = STATUS_BUFFER_OVERFLOW;
> -    if (OutLen == 0) {
> -        XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)(%d)\n",
> __FUNCTION__, Buffer, Length, Count);
> -        goto done;
> -    }
> -
> -    status = STATUS_INVALID_PARAMETER;
> -    if (OutLen < Length)
> -        goto fail4;
> -
> -    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")=(%d)(%d)\n", __FUNCTION__,
> Buffer, Length, Count);
> -#if DBG
> -    __DisplayMultiSz(__FUNCTION__, Value);
> -#endif
> -
> -    RtlCopyMemory(Buffer, Value, Length);
> -    Buffer[Length - 2] = 0;
> -    Buffer[Length - 1] = 0;
> -    status = STATUS_SUCCESS;
> -
> -done:
> -    *Info = (ULONG_PTR)Length;
> -    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> -    return status;
> -
> -fail4:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail4 (\"%s\")=(%d < %d)\n",
> __FUNCTION__, Buffer, OutLen, Length);
> -    XENBUS_STORE(Free, &Fdo->StoreInterface, Value);
> -fail3:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__,
> Buffer);
> -fail2:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
> -fail1:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__,
> status);
> -    return status;
> -}
> +    PLIST_ENTRY Node;
> +    PXENIFACE_STORE_CONTEXT StoreContext;
> +    PXENIFACE_EVTCHN_CONTEXT EvtchnContext;
> +    KIRQL Irql;
> +    LIST_ENTRY ToFree;
> +
> +    XenIfaceDebugPrint(TRACE, "FO %p, IRQL %d, Cpu %lu\n", FileObject,
> KeGetCurrentIrql(), KeGetCurrentProcessorNumber());
> +
> +    // store watches
> +    KeAcquireSpinLock(&Fdo->StoreWatchLock, &Irql);
> +    Node = Fdo->StoreWatchList.Flink;
> +    while (Node->Flink != Fdo->StoreWatchList.Flink) {
> +        StoreContext = CONTAINING_RECORD(Node,
> XENIFACE_STORE_CONTEXT, Entry);
> +
> +        Node = Node->Flink;
> +        if (StoreContext->FileObject != FileObject)
> +            continue;
> +
> +        XenIfaceDebugPrint(TRACE, "Store context %p\n", StoreContext);
> +        RemoveEntryList(&StoreContext->Entry);
> +        StoreFreeWatch(Fdo, StoreContext);
> +    }
> +    KeReleaseSpinLock(&Fdo->StoreWatchLock, Irql);
> +
> +    // event channels
> +    InitializeListHead(&ToFree);
> +    KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql);
> +    Node = Fdo->EvtchnList.Flink;
> +    while (Node->Flink != Fdo->EvtchnList.Flink) {
> +        EvtchnContext = CONTAINING_RECORD(Node,
> XENIFACE_EVTCHN_CONTEXT, Entry);
> +
> +        Node = Node->Flink;
> +        if (EvtchnContext->FileObject != FileObject)
> +            continue;
> +
> +        XenIfaceDebugPrint(TRACE, "Evtchn context %p\n", EvtchnContext);
> +        RemoveEntryList(&EvtchnContext->Entry);
> +        // EvtchnFree requires PASSIVE_LEVEL and we're inside a lock
> +        InsertTailList(&ToFree, &EvtchnContext->Entry);
> +    }
> +    KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
> 
> -static DECLSPEC_NOINLINE NTSTATUS
> -IoctlRemove(
> -    __in  PXENIFACE_FDO         Fdo,
> -    __in  PCHAR             Buffer,
> -    __in  ULONG             InLen,
> -    __in  ULONG             OutLen
> -    )
> -{
> -    NTSTATUS    status;
> -
> -    status = STATUS_INVALID_BUFFER_SIZE;
> -    if (InLen == 0 || OutLen != 0)
> -        goto fail1;
> -
> -    status = STATUS_INVALID_PARAMETER;
> -    if (!__IsValidStr(Buffer, InLen))
> -        goto fail2;
> -
> -    status = XENBUS_STORE(Remove, &Fdo->StoreInterface, NULL, NULL,
> Buffer);
> -    if (!NT_SUCCESS(status))
> -        goto fail3;
> -
> -    XenIfaceDebugPrint(INFO, "|%s: (\"%s\")\n", __FUNCTION__, Buffer);
> -    return status;
> -
> -fail3:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail3 (\"%s\")\n", __FUNCTION__,
> Buffer);
> -fail2:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail2\n", __FUNCTION__);
> -fail1:
> -    XenIfaceDebugPrint(ERROR, "|%s: Fail1 (%08x)\n", __FUNCTION__,
> status);
> -    return status;
> +    Node = ToFree.Flink;
> +    while (Node->Flink != ToFree.Flink) {
> +        EvtchnContext = CONTAINING_RECORD(Node,
> XENIFACE_EVTCHN_CONTEXT, Entry);
> +        Node = Node->Flink;
> +
> +        RemoveEntryList(&EvtchnContext->Entry);
> +        EvtchnFree(Fdo, EvtchnContext);
> +    }
>  }
> 
>  NTSTATUS
> -XenIFaceIoctl(
> -    __in  PXENIFACE_FDO         Fdo,
> -    __in  PIRP              Irp
> +XenIfaceIoctl(
> +    __in     PXENIFACE_FDO     Fdo,
> +    __inout  PIRP              Irp
>      )
>  {
>      NTSTATUS            status;
> @@ -302,20 +160,71 @@ XenIFaceIoctl(
>          goto done;
> 
>      switch (Stack->Parameters.DeviceIoControl.IoControlCode) {
> +        // store
>      case IOCTL_XENIFACE_STORE_READ:
> -        status = IoctlRead(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp-
> >IoStatus.Information);
> +        status = IoctlStoreRead(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp-
> >IoStatus.Information);
>          break;
> 
>      case IOCTL_XENIFACE_STORE_WRITE:
> -        status = IoctlWrite(Fdo, (PCHAR)Buffer, InLen, OutLen);
> +        status = IoctlStoreWrite(Fdo, (PCHAR)Buffer, InLen, OutLen);
>          break;
> 
>      case IOCTL_XENIFACE_STORE_DIRECTORY:
> -        status = IoctlDirectory(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp-
> >IoStatus.Information);
> +        status = IoctlStoreDirectory(Fdo, (PCHAR)Buffer, InLen, OutLen, &Irp-
> >IoStatus.Information);
>          break;
> 
>      case IOCTL_XENIFACE_STORE_REMOVE:
> -        status = IoctlRemove(Fdo, (PCHAR)Buffer, InLen, OutLen);
> +        status = IoctlStoreRemove(Fdo, (PCHAR)Buffer, InLen, OutLen);
> +        break;
> +
> +    case IOCTL_XENIFACE_STORE_SET_PERMISSIONS:
> +        status = IoctlStoreSetPermissions(Fdo, Buffer, InLen, OutLen);
> +        break;
> +
> +    case IOCTL_XENIFACE_STORE_ADD_WATCH:
> +        status = IoctlStoreAddWatch(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject, &Irp->IoStatus.Information);
> +        break;
> +
> +    case IOCTL_XENIFACE_STORE_REMOVE_WATCH:
> +        status = IoctlStoreRemoveWatch(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject);
> +        break;
> +
> +        // evtchn
> +    case IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND:
> +        status = IoctlEvtchnBindUnbound(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject, &Irp->IoStatus.Information);
> +        break;
> +
> +    case IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN:
> +        status = IoctlEvtchnBindInterdomain(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject, &Irp->IoStatus.Information);
> +        break;
> +
> +    case IOCTL_XENIFACE_EVTCHN_CLOSE:
> +        status = IoctlEvtchnClose(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject);
> +        break;
> +
> +    case IOCTL_XENIFACE_EVTCHN_NOTIFY:
> +        status = IoctlEvtchnNotify(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject);
> +        break;
> +
> +    case IOCTL_XENIFACE_EVTCHN_UNMASK:
> +        status = IoctlEvtchnUnmask(Fdo, Buffer, InLen, OutLen, Stack-
> >FileObject);
> +        break;
> +
> +        // gnttab
> +    case IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS: // this is a
> METHOD_NEITHER IOCTL
> +        status = IoctlGnttabPermitForeignAccess(Fdo, Stack-
> >Parameters.DeviceIoControl.Type3InputBuffer, InLen, OutLen, Irp);
> +        break;
> +
> +    case IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS:
> +        status = IoctlGnttabRevokeForeignAccess(Fdo, Buffer, InLen, OutLen);
> +        break;
> +
> +    case IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES: // this is a
> METHOD_NEITHER IOCTL
> +        status = IoctlGnttabMapForeignPages(Fdo, Stack-
> >Parameters.DeviceIoControl.Type3InputBuffer, InLen, OutLen, Irp);
> +        break;
> +
> +    case IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES:
> +        status = IoctlGnttabUnmapForeignPages(Fdo, Buffer, InLen, OutLen);
>          break;
> 
>      default:
> @@ -327,7 +236,8 @@ done:
> 
>      Irp->IoStatus.Status = status;
> 
> -    IoCompleteRequest(Irp, IO_NO_INCREMENT);
> +    if (status != STATUS_PENDING)
> +        IoCompleteRequest(Irp, IO_NO_INCREMENT);
> 
>      return status;
>  }
> diff --git a/src/xeniface/ioctls.h b/src/xeniface/ioctls.h
> index 63de9eb..225ed7f 100644
> --- a/src/xeniface/ioctls.h
> +++ b/src/xeniface/ioctls.h
> @@ -1,4 +1,5 @@
>  /* Copyright (c) Citrix Systems Inc.
> + * Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
>   * All rights reserved.
>   *
>   * Redistribution and use in source and binary forms,
> @@ -32,10 +33,333 @@
>  #ifndef _IOCTLS_H_
>  #define _IOCTLS_H_
> 
> +#include "xeniface_ioctls.h"
> +
> +typedef enum _XENIFACE_CONTEXT_TYPE {
> +    XENIFACE_CONTEXT_GRANT = 1,
> +    XENIFACE_CONTEXT_MAP
> +} XENIFACE_CONTEXT_TYPE;
> +
> +typedef struct _XENIFACE_CONTEXT_ID {
> +    XENIFACE_CONTEXT_TYPE  Type;
> +    ULONG                  RequestId;
> +    PEPROCESS              Process;
> +} XENIFACE_CONTEXT_ID, *PXENIFACE_CONTEXT_ID;
> +
> +typedef struct _XENIFACE_STORE_CONTEXT {
> +    LIST_ENTRY             Entry;
> +    PXENBUS_STORE_WATCH    Watch;
> +    PKEVENT                Event;
> +    PVOID                  FileObject;
> +} XENIFACE_STORE_CONTEXT, *PXENIFACE_STORE_CONTEXT;
> +
> +typedef struct _XENIFACE_EVTCHN_CONTEXT {
> +    LIST_ENTRY             Entry;
> +    PXENBUS_EVTCHN_CHANNEL Channel;
> +    ULONG                  LocalPort;
> +    PKEVENT                Event;
> +    PXENIFACE_FDO          Fdo;
> +    PVOID                  FileObject;
> +} XENIFACE_EVTCHN_CONTEXT, *PXENIFACE_EVTCHN_CONTEXT;
> +
> +typedef struct _XENIFACE_GRANT_CONTEXT {
> +    XENIFACE_CONTEXT_ID        Id;
> +    LIST_ENTRY                 Entry;
> +    PXENBUS_GNTTAB_ENTRY       *Grants;
> +    USHORT                     RemoteDomain;
> +    ULONG                      NumberPages;
> +    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
> +    ULONG                      NotifyOffset;
> +    ULONG                      NotifyPort;
> +    PVOID                      KernelVa;
> +    PVOID                      UserVa;
> +    PMDL                       Mdl;
> +} XENIFACE_GRANT_CONTEXT, *PXENIFACE_GRANT_CONTEXT;
> +
> +typedef struct _XENIFACE_MAP_CONTEXT {
> +    XENIFACE_CONTEXT_ID        Id;
> +    LIST_ENTRY                 Entry;
> +    USHORT                     RemoteDomain;
> +    ULONG                      NumberPages;
> +    XENIFACE_GNTTAB_PAGE_FLAGS Flags;
> +    ULONG                      NotifyOffset;
> +    ULONG                      NotifyPort;
> +    PHYSICAL_ADDRESS           Address;
> +    PVOID                      KernelVa;
> +    PVOID                      UserVa;
> +    PMDL                       Mdl;
> +} XENIFACE_MAP_CONTEXT, *PXENIFACE_MAP_CONTEXT;
> +
>  NTSTATUS
> -XenIFaceIoctl(
> -    __in  PXENIFACE_FDO         Fdo,
> -    __in  PIRP              Irp
> +__CaptureUserBuffer(
> +    __in  PVOID Buffer,
> +    __in  ULONG Length,
> +    __out PVOID *CapturedBuffer
> +    );
> +
> +VOID
> +__FreeCapturedBuffer(
> +    __in  PVOID CapturedBuffer
> +    );
> +
> +NTSTATUS
> +XenIfaceIoctl(
> +    __in     PXENIFACE_FDO     Fdo,
> +    __inout  PIRP              Irp
> +    );
> +
> +_IRQL_requires_(PASSIVE_LEVEL)
> +VOID
> +XenIfaceCleanup(
> +    __in  PXENIFACE_FDO Fdo,
> +    __in  PFILE_OBJECT  FileObject
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRead(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreWrite(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreDirectory(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRemove(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PCHAR             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreSetPermissions(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreAddWatch(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlStoreRemoveWatch(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    );
> +
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +VOID
> +StoreFreeWatch(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_STORE_CONTEXT Context
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnBindUnbound(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnBindInterdomain(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnClose(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnNotify(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlEvtchnUnmask(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __in  PFILE_OBJECT      FileObject
> +    );
> +
> +_Requires_lock_not_held_(Fdo->EvtchnLock)
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +EvtchnNotify(
> +    __in      PXENIFACE_FDO Fdo,
> +    __in      ULONG         LocalPort,
> +    __in_opt  PFILE_OBJECT  FileObject
> +    );
> +
> +_Function_class_(KDEFERRED_ROUTINE)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +_IRQL_requires_same_
> +VOID
> +EvtchnNotificationDpc(
> +    __in      PKDPC Dpc,
> +    __in_opt  PVOID Context,
> +    __in_opt  PVOID Argument1,
> +    __in_opt  PVOID Argument2
> +    );
> +
> +_IRQL_requires_(PASSIVE_LEVEL)
> +VOID
> +EvtchnFree(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_EVTCHN_CONTEXT Context
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabPermitForeignAccess(
> +    __in     PXENIFACE_FDO  Fdo,
> +    __in     PVOID          Buffer,
> +    __in     ULONG          InLen,
> +    __in     ULONG          OutLen,
> +    __inout  PIRP           Irp
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabGetGrantResult(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabRevokeForeignAccess(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabMapForeignPages(
> +    __in     PXENIFACE_FDO     Fdo,
> +    __in     PVOID             Buffer,
> +    __in     ULONG             InLen,
> +    __in     ULONG             OutLen,
> +    __inout  PIRP              Irp
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabGetMapResult(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen,
> +    __out PULONG_PTR        Info
> +    );
> +
> +DECLSPEC_NOINLINE
> +NTSTATUS
> +IoctlGnttabUnmapForeignPages(
> +    __in  PXENIFACE_FDO     Fdo,
> +    __in  PVOID             Buffer,
> +    __in  ULONG             InLen,
> +    __in  ULONG             OutLen
> +    );
> +
> +_Acquires_exclusive_lock_(((PXENIFACE_FDO)Argument)-
> >GnttabCacheLock)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +VOID
> +GnttabAcquireLock(
> +    __in  PVOID Argument
> +    );
> +
> +_Releases_exclusive_lock_(((PXENIFACE_FDO)Argument)-
> >GnttabCacheLock)
> +_IRQL_requires_(DISPATCH_LEVEL)
> +VOID
> +GnttabReleaseLock(
> +    __in  PVOID Argument
> +    );
> +
> +_Function_class_(IO_WORKITEM_ROUTINE)
> +VOID
> +CompleteGnttabIrp(
> +    __in      PDEVICE_OBJECT DeviceObject,
> +    __in_opt  PVOID          Context
> +    );
> +
> +_IRQL_requires_max_(APC_LEVEL)
> +VOID
> +GnttabFreeGrant(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_GRANT_CONTEXT Context
> +    );
> +
> +_IRQL_requires_max_(APC_LEVEL)
> +VOID
> +GnttabFreeMap(
> +    __in     PXENIFACE_FDO Fdo,
> +    __inout  PXENIFACE_MAP_CONTEXT Context
>      );
> 
>  #endif // _IOCTLS_H_
> diff --git a/src/xeniface/irp_queue.c b/src/xeniface/irp_queue.c
> new file mode 100644
> index 0000000..5184726
> --- /dev/null
> +++ b/src/xeniface/irp_queue.c
> @@ -0,0 +1,162 @@
> +/* Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
> + * 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 "driver.h"
> +#include "irp_queue.h"
> +#include "log.h"
> +#include "ioctls.h"
> +
> +// Cancel-safe IRP queue implementation
> +
> +NTSTATUS
> +CsqInsertIrpEx(
> +    _In_  PIO_CSQ Csq,
> +    _In_  PIRP    Irp,
> +    _In_  PVOID   InsertContext // PXENIFACE_CONTEXT_ID
> +    )
> +{
> +    PXENIFACE_FDO Fdo;
> +
> +    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
> +
> +    // Fail if a request with the same ID already exists.
> +    if (CsqPeekNextIrp(Csq, NULL, InsertContext) != NULL)
> +        return STATUS_INVALID_PARAMETER;
> +
> +    InsertTailList(&Fdo->IrpList, &Irp->Tail.Overlay.ListEntry);
> +    return STATUS_SUCCESS;
> +}
> +
> +VOID
> +CsqRemoveIrp(
> +    _In_  PIO_CSQ Csq,
> +    _In_  PIRP    Irp
> +    )
> +{
> +    UNREFERENCED_PARAMETER(Csq);
> +
> +    RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
> +}
> +
> +PIRP
> +CsqPeekNextIrp(
> +    _In_      PIO_CSQ Csq,
> +    _In_opt_  PIRP    Irp,
> +    _In_opt_  PVOID   PeekContext // PXENIFACE_CONTEXT_ID
> +    )
> +{
> +    PXENIFACE_FDO        Fdo;
> +    PIRP                 NextIrp = NULL;
> +    PLIST_ENTRY          Head, NextEntry;
> +    PXENIFACE_CONTEXT_ID Id, TargetId;
> +
> +    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
> +    TargetId = PeekContext;
> +    Head = &Fdo->IrpList;
> +
> +    // If the IRP is NULL, we will start peeking from the list head,
> +    // else we will start from that IRP onwards. This is done under the
> +    // assumption that new IRPs are always inserted at the tail.
> +
> +    if (Irp == NULL) {
> +        NextEntry = Head->Flink;
> +    } else {
> +        NextEntry = Irp->Tail.Overlay.ListEntry.Flink;
> +    }
> +
> +    while (NextEntry != Head) {
> +        NextIrp = CONTAINING_RECORD(NextEntry, IRP, Tail.Overlay.ListEntry);
> +
> +        if (PeekContext) {
> +            Id = NextIrp->Tail.Overlay.DriverContext[0];
> +            if (Id->RequestId == TargetId->RequestId && Id->Process ==
> TargetId->Process)
> +                break;
> +        } else {
> +            break;
> +        }
> +        NextIrp = NULL;
> +        NextEntry = NextEntry->Flink;
> +    }
> +
> +    return NextIrp;
> +}
> +
> +_IRQL_raises_(DISPATCH_LEVEL)
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +_Acquires_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)-
> >IrpQueueLock)
> +VOID
> +CsqAcquireLock(
> +    _In_                                       PIO_CSQ Csq,
> +    _Out_ _At_(*Irql, _Post_ _IRQL_saves_)     PKIRQL  Irql
> +    )
> +{
> +    PXENIFACE_FDO Fdo;
> +
> +    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
> +
> +    KeAcquireSpinLock(&Fdo->IrpQueueLock, Irql);
> +}
> +
> +_IRQL_requires_(DISPATCH_LEVEL)
> +_Releases_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)-
> >IrpQueueLock)
> +VOID
> +CsqReleaseLock(
> +    _In_                    PIO_CSQ Csq,
> +    _In_ _IRQL_restores_    KIRQL   Irql
> +    )
> +{
> +    PXENIFACE_FDO Fdo;
> +
> +    Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue);
> +
> +    KeReleaseSpinLock(&Fdo->IrpQueueLock, Irql);
> +}
> +
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +VOID
> +CsqCompleteCanceledIrp(
> +    _In_  PIO_CSQ Csq,
> +    _In_  PIRP    Irp
> +    )
> +{
> +    PXENIFACE_FDO Fdo = CONTAINING_RECORD(Csq, XENIFACE_FDO,
> IrpQueue);
> +    PIO_WORKITEM WorkItem;
> +
> +    XenIfaceDebugPrint(TRACE, "Irp %p, IRQL %d\n",
> +                       Irp, KeGetCurrentIrql());
> +
> +    // This is not guaranteed to run at PASSIVE_LEVEL, so queue a work item
> +    // to perform actual cleanup/IRP completion.
> +
> +    WorkItem = IoAllocateWorkItem(Fdo->Dx->DeviceObject);
> +    Irp->Tail.Overlay.DriverContext[1] = WorkItem; // store so the work item
> can free it
> +    IoQueueWorkItem(WorkItem, CompleteGnttabIrp, DelayedWorkQueue,
> Irp);
> +}
> diff --git a/src/xeniface/irp_queue.h b/src/xeniface/irp_queue.h
> new file mode 100644
> index 0000000..47c36dc
> --- /dev/null
> +++ b/src/xeniface/irp_queue.h
> @@ -0,0 +1,81 @@
> +/* Copyright (c) Rafal Wojdyla <omeg@invisiblethingslab.com>
> + * 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 _IRP_QUEUE_H_
> +#define _IRP_QUEUE_H_
> +
> +#include <ntddk.h>
> +
> +NTSTATUS
> +CsqInsertIrpEx(
> +    _In_  PIO_CSQ Csq,
> +    _In_  PIRP    Irp,
> +    _In_  PVOID   InsertContext
> +    );
> +
> +VOID
> +CsqRemoveIrp(
> +    _In_  PIO_CSQ Csq,
> +    _In_  PIRP    Irp
> +    );
> +
> +PIRP
> +CsqPeekNextIrp(
> +    _In_      PIO_CSQ Csq,
> +    _In_opt_  PIRP    Irp,
> +    _In_opt_  PVOID   PeekContext // PXENIFACE_CONTEXT_ID
> +    );
> +
> +_IRQL_raises_(DISPATCH_LEVEL)
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +_Acquires_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)-
> >IrpQueueLock)
> +VOID
> +CsqAcquireLock(
> +    _In_                                       PIO_CSQ Csq,
> +    _Out_ _At_(*Irql, _Post_ _IRQL_saves_)     PKIRQL  Irql
> +    );
> +
> +_IRQL_requires_(DISPATCH_LEVEL)
> +_Releases_lock_(CONTAINING_RECORD(Csq, XENIFACE_FDO, IrpQueue)-
> >IrpQueueLock)
> +VOID
> +CsqReleaseLock(
> +    _In_                    PIO_CSQ Csq,
> +    _In_ _IRQL_restores_    KIRQL   Irql
> +    );
> +
> +_IRQL_requires_max_(DISPATCH_LEVEL)
> +VOID
> +CsqCompleteCanceledIrp(
> +    _In_  PIO_CSQ             Csq,
> +    _In_  PIRP                Irp
> +    );
> +
> +#endif
> diff --git a/vs2012/xeniface/xeniface.vcxproj
> b/vs2012/xeniface/xeniface.vcxproj
> index a3472ba..fadc1d1 100644
> --- a/vs2012/xeniface/xeniface.vcxproj
> +++ b/vs2012/xeniface/xeniface.vcxproj
> @@ -73,12 +73,16 @@
>  		<FilesToPackage Include="@(Inf->'%(CopyOutput)')"
> Condition="'@(Inf)'!=''" />
>  	</ItemGroup>
>  	<ItemGroup>
> -	        <ClCompile Include="../../src/xeniface/ioctls.c" />
> -                <ClCompile Include="../../src/xeniface/wmi.c" />
> -                <ClCompile Include="../../src/xeniface/driver.c" />
> -                <ClCompile Include="../../src/xeniface/fdo.c" />
> -                <ClCompile Include="../../src/xeniface/registry.c" />
> -                <ClCompile Include="../../src\xeniface/thread.c" />
> +		<ClCompile Include="..\..\src\xeniface\ioctls.c" />
> +		<ClCompile Include="..\..\src\xeniface\wmi.c" />
> +		<ClCompile Include="..\..\src\xeniface\driver.c" />
> +		<ClCompile Include="..\..\src\xeniface\fdo.c" />
> +		<ClCompile Include="..\..\src\xeniface\registry.c" />
> +		<ClCompile Include="..\..\src\xeniface\thread.c" />
> +		<ClCompile Include="..\..\src\xeniface\ioctl_evtchn.c" />
> +		<ClCompile Include="..\..\src\xeniface\ioctl_gnttab.c" />
> +		<ClCompile Include="..\..\src\xeniface\ioctl_store.c" />
> +		<ClCompile Include="..\..\src\xeniface\irp_queue.c" />
>  	</ItemGroup>
>          <ItemGroup>
>                  <Mofcomp Include="../../src/xeniface/wmi.mof">
> @@ -96,5 +100,19 @@
>  	<ItemGroup>
>  		<Inf Include="..\xeniface.inf" />
>  	</ItemGroup>
> +	<ItemGroup>
> +		<ClInclude Include="..\..\src\xeniface\assert.h" />
> +		<ClInclude Include="..\..\src\xeniface\driver.h" />
> +		<ClInclude Include="..\..\src\xeniface\fdo.h" />
> +		<ClInclude Include="..\..\src\xeniface\ioctls.h" />
> +		<ClInclude Include="..\..\src\xeniface\irp_queue.h" />
> +		<ClInclude Include="..\..\src\xeniface\log.h" />
> +		<ClInclude Include="..\..\src\xeniface\mutex.h" />
> +		<ClInclude Include="..\..\src\xeniface\names.h" />
> +		<ClInclude Include="..\..\src\xeniface\registry.h" />
> +		<ClInclude Include="..\..\src\xeniface\thread.h" />
> +		<ClInclude Include="..\..\src\xeniface\types.h" />
> +		<ClInclude Include="..\..\src\xeniface\wmi.h" />
> +	</ItemGroup>
>  	<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
>  </Project>
> diff --git a/vs2013/xeniface/xeniface.vcxproj
> b/vs2013/xeniface/xeniface.vcxproj
> index fea2ad1..44a1cdf 100644
> --- a/vs2013/xeniface/xeniface.vcxproj
> +++ b/vs2013/xeniface/xeniface.vcxproj
> @@ -125,12 +125,16 @@
>      <FilesToPackage Include="@(Inf->'%(CopyOutput)')"
> Condition="'@(Inf)'!=''" />
>    </ItemGroup>
>    <ItemGroup>
> -    <ClCompile Include="../../src/xeniface/ioctls.c" />
> -    <ClCompile Include="../../src/xeniface/wmi.c" />
> -    <ClCompile Include="../../src/xeniface/driver.c" />
> -    <ClCompile Include="../../src/xeniface/fdo.c" />
> -    <ClCompile Include="../../src/xeniface/registry.c" />
> -    <ClCompile Include="../../src\xeniface/thread.c" />
> +    <ClCompile Include="..\..\src\xeniface\ioctls.c" />
> +    <ClCompile Include="..\..\src\xeniface\wmi.c" />
> +    <ClCompile Include="..\..\src\xeniface\driver.c" />
> +    <ClCompile Include="..\..\src\xeniface\fdo.c" />
> +    <ClCompile Include="..\..\src\xeniface\registry.c" />
> +    <ClCompile Include="..\..\src\xeniface\thread.c" />
> +    <ClCompile Include="..\..\src\xeniface\ioctl_evtchn.c" />
> +    <ClCompile Include="..\..\src\xeniface\ioctl_gnttab.c" />
> +    <ClCompile Include="..\..\src\xeniface\ioctl_store.c" />
> +    <ClCompile Include="..\..\src\xeniface\irp_queue.c" />
>    </ItemGroup>
>    <ItemGroup>
>      <Mofcomp Include="../../src/xeniface/wmi.mof">
> @@ -148,5 +152,19 @@
>    <ItemGroup>
>      <Inf Include="..\xeniface.inf" />
>    </ItemGroup>
> +  <ItemGroup>
> +    <ClInclude Include="..\..\src\xeniface\assert.h" />
> +    <ClInclude Include="..\..\src\xeniface\driver.h" />
> +    <ClInclude Include="..\..\src\xeniface\fdo.h" />
> +    <ClInclude Include="..\..\src\xeniface\ioctls.h" />
> +    <ClInclude Include="..\..\src\xeniface\irp_queue.h" />
> +    <ClInclude Include="..\..\src\xeniface\log.h" />
> +    <ClInclude Include="..\..\src\xeniface\mutex.h" />
> +    <ClInclude Include="..\..\src\xeniface\names.h" />
> +    <ClInclude Include="..\..\src\xeniface\registry.h" />
> +    <ClInclude Include="..\..\src\xeniface\thread.h" />
> +    <ClInclude Include="..\..\src\xeniface\types.h" />
> +    <ClInclude Include="..\..\src\xeniface\wmi.h" />
> +  </ItemGroup>
>    <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
>  </Project>
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Fri Oct 23 14:36:52 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 14:36:52 +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 1ZpdSe-0003aY-HG; Fri, 23 Oct 2015 14:36:52 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7314647ef=Paul.Durrant@citrix.com>)
	id 1ZpdSe-0003aO-1r
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 14:36:52 +0000
Received: from [193.109.254.147] by server-5.bemta-14.messagelabs.com id
	23/B2-00475-3064A265; Fri, 23 Oct 2015 14:36:51 +0000
X-Env-Sender: prvs=7314647ef=Paul.Durrant@citrix.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1445611010!22108789!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22220 invoked from network); 23 Oct 2015 14:36:50 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 14:36:50 -0000
X-IronPort-AV: E=Sophos;i="5.20,186,1444694400"; 
   d="scan'208";a="6005116"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 6/6] Bind to the latest XENBUS revision
Thread-Index: AQHRC8EZoVlT7i5U20qq5OwVIGOAUZ55KO6w
Date: Fri, 23 Oct 2015 14:36:50 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F623249@AMSPEX01CL01.citrite.net>
References: <56272214.8020006@invisiblethingslab.com>
In-Reply-To: <56272214.8020006@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] [PATCH 6/6] Bind to the latest XENBUS revision
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 Rafal Wojdyla
> Sent: 21 October 2015 06:27
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 6/6] Bind to the latest XENBUS revision
> 
> Revision 0x0800000B or later is needed for STORE interface version 2 and
> GNTTAB interface version 2.
> 
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>

Acked-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 b3112b9..df0abf3 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_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_IFACE&R
> EV_08000009
> -%XenIfaceDevice.DeviceDesc% =XenIface_Device,
> XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_IFACE&REV_08000009
> -%XenIfaceDevice.DeviceDesc% =XenIface_Device,
> XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_IFACE&REV_08000009
> +%XenIfaceDevice.DeviceDesc% =XenIface_Device,
> XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_IFACE&R
> EV_0800000B
> +%XenIfaceDevice.DeviceDesc% =XenIface_Device,
> XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_IFACE&REV_0800000B
> +%XenIfaceDevice.DeviceDesc% =XenIface_Device,
> XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_IFACE&REV_0800000B
> 
>  [XenIface_Device.NT$ARCH$]
>  CopyFiles=XenIface_Device.NT.Copy, ServiceDestDir.NT.Copy
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Fri Oct 23 14:36:52 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 14:36:52 +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 1ZpdSe-0003aY-HG; Fri, 23 Oct 2015 14:36:52 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7314647ef=Paul.Durrant@citrix.com>)
	id 1ZpdSe-0003aO-1r
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 14:36:52 +0000
Received: from [193.109.254.147] by server-5.bemta-14.messagelabs.com id
	23/B2-00475-3064A265; Fri, 23 Oct 2015 14:36:51 +0000
X-Env-Sender: prvs=7314647ef=Paul.Durrant@citrix.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1445611010!22108789!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22220 invoked from network); 23 Oct 2015 14:36:50 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 14:36:50 -0000
X-IronPort-AV: E=Sophos;i="5.20,186,1444694400"; 
   d="scan'208";a="6005116"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 6/6] Bind to the latest XENBUS revision
Thread-Index: AQHRC8EZoVlT7i5U20qq5OwVIGOAUZ55KO6w
Date: Fri, 23 Oct 2015 14:36:50 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F623249@AMSPEX01CL01.citrite.net>
References: <56272214.8020006@invisiblethingslab.com>
In-Reply-To: <56272214.8020006@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] [PATCH 6/6] Bind to the latest XENBUS revision
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 Rafal Wojdyla
> Sent: 21 October 2015 06:27
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] [PATCH 6/6] Bind to the latest XENBUS revision
> 
> Revision 0x0800000B or later is needed for STORE interface version 2 and
> GNTTAB interface version 2.
> 
> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com>

Acked-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 b3112b9..df0abf3 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_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_IFACE&R
> EV_08000009
> -%XenIfaceDevice.DeviceDesc% =XenIface_Device,
> XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_IFACE&REV_08000009
> -%XenIfaceDevice.DeviceDesc% =XenIface_Device,
> XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_IFACE&REV_08000009
> +%XenIfaceDevice.DeviceDesc% =XenIface_Device,
> XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_IFACE&R
> EV_0800000B
> +%XenIfaceDevice.DeviceDesc% =XenIface_Device,
> XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_IFACE&REV_0800000B
> +%XenIfaceDevice.DeviceDesc% =XenIface_Device,
> XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_IFACE&REV_0800000B
> 
>  [XenIface_Device.NT$ARCH$]
>  CopyFiles=XenIface_Device.NT.Copy, ServiceDestDir.NT.Copy
> --
> 1.8.1.msysgit.1
> 
> _______________________________________________
> 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 Fri Oct 23 14:50:15 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 14:50: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 1Zpdfa-0004zP-Pr; Fri, 23 Oct 2015 14:50:14 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7314647ef=Paul.Durrant@citrix.com>)
	id 1Zpdfa-0004zJ-88
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 14:50:14 +0000
Received: from [85.158.137.68] by server-12.bemta-3.messagelabs.com id
	05/86-14900-5294A265; Fri, 23 Oct 2015 14:50:13 +0000
X-Env-Sender: prvs=7314647ef=Paul.Durrant@citrix.com
X-Msg-Ref: server-2.tower-31.messagelabs.com!1445611812!24968536!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 13485 invoked from network); 23 Oct 2015 14:50:12 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-2.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 14:50:12 -0000
X-IronPort-AV: E=Sophos;i="5.20,186,1444694400"; 
   d="scan'208";a="6006408"
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] winpv drivers update still don't works
	correctly and domUs unable to boot on next reboot
Thread-Index: AQHRDXNjXLsQhDl5akuQ2SO58eBnM554zt+g///r1ICAACRMYP//49IAgAA5Q4CAACqnEA==
Date: Fri, 23 Oct 2015 14:49:49 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6232F7@AMSPEX01CL01.citrite.net>
References: <5629FAAE.8090700@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622531@AMSPEX01CL01.citrite.net>
	<562A0875.20008@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622850@AMSPEX01CL01.citrite.net>
	<562A0F44.6090403@m2r.biz> <562A3F4D.6090808@m2r.biz>
In-Reply-To: <562A3F4D.6090808@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] winpv drivers update still don't works correctly
 and domUs unable to boot on next reboot
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-----
[snip]
> 
> I now retried with same domU when I had the latest problem reported (I
> returned to status before the winpv update with disk snapshot), I
> removed the winpv drivers from windows control panel (in this case I
> didn't try additional manual clean) and reboot.
> Next boot windows fails to boot and from qemu log winpv things are still
> present and used but boot fails (I suppose because partial as uninstalled).
> Full qemu log with trace in attachment.
> Seems very strange that similar thing happen only to me and in 80-90% of
> my tests with winpv, as already wrote tested on many domUs, W7/8/10,
> different builds of winpv, different versions of dom0 kernel, xen, qemu
> ecc...
> 

The XENVBD you have installed is missing this fix:

commit 59797d160517e47a249e67f030bb5d2943f8177a
Author: Paul Durrant <paul.durrant@citrix.com>
Date:   Thu Sep 3 17:36:43 2015 +0100

    Clear unplug requests from co-installer

    When XENVBD is uninstalled there is no suitable notification in kernel
    which can be used to clear any remaining unplug requests. This leads to
    a certain 0x7B bugcheck on reboot. This patch therefore does the job
    from the co-installer since this seems to be the only way.

    Signed-off-by: Paul Durrant <paul.durrant@citrix.com>

This means, when you try to remove it, the unplug registry remains set. So, to remove the old driver you have you will need to hack the registry manually after removing the driver but before rebooting (or go into safe mode after reboot). The thing you need to shoot is the "DISKS" value under HKLM/System/CurrentControlset/Services/Xen/Unplug.
BTW, it is expected that the XEN export driver and the XENFILT filter will still re-load after boot even after removing all driver packages... Windows never truly removes drivers. From the log though it looks like you've also got an old XENBUS hanging around in DriverStore since XEN, XENFILT and XENBUS now have a version of 8.1.0 and a date of 7th August so you should probably do a 'pnputil -e' and then 'pnputil -d' on any remaining oemX.inf files you find.

  Paul


> If you need more informations/tests tell me and I'll post them.
> 
> Thanks for any reply and sorry for my bad english.
> 
> >
> >>
> >>>>> In my latest test:
> >>>>> Dom0:
> >>>>> Wheezy (debian 7) 64 bit with xen 4.6.0 plus some small additional
> >>> patches:
> >>>>> https://github.com/Fantu/Xen/commits/rebase/m2r-testing-4.6
> >>>>> kernel is custom build of 4.1.8 with .config in attachment
> >>>>> Qemu 2.4 with some small additional patches:
> >>>>> https://github.com/Fantu/qemu/commits/rebase/upstream
> >>>>> Seabios 1.8.2
> >>>>>
> >>>>> DomU:
> >>>>> windows 10 pro 64 bit
> >>>>> xl cfg in attachment
> >>>>>
> >>>>> I updated all winpv components to latest build without saw errors
> >>>>> but on
> >>>>> reboot windows fails to boot, in qemu log I saw a trace about and
> >>>>> also
> >>>>> the still use older build of at least one component.
> >>>>> Full qemu log with trace in attachment.
> >>>>> I had similar problem many time with different versions of xen, qemu,
> >>>>> seabios, winpv, windows ecc...
> >>>>> I also already did at least one other report about time ago if I
> >>>>> remember good.
> >>>>>
> >>>>>
> >>>>> If you need more informations/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 Fri Oct 23 14:50:15 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 14:50: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 1Zpdfa-0004zP-Pr; Fri, 23 Oct 2015 14:50:14 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7314647ef=Paul.Durrant@citrix.com>)
	id 1Zpdfa-0004zJ-88
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 14:50:14 +0000
Received: from [85.158.137.68] by server-12.bemta-3.messagelabs.com id
	05/86-14900-5294A265; Fri, 23 Oct 2015 14:50:13 +0000
X-Env-Sender: prvs=7314647ef=Paul.Durrant@citrix.com
X-Msg-Ref: server-2.tower-31.messagelabs.com!1445611812!24968536!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 13485 invoked from network); 23 Oct 2015 14:50:12 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-2.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2015 14:50:12 -0000
X-IronPort-AV: E=Sophos;i="5.20,186,1444694400"; 
   d="scan'208";a="6006408"
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] winpv drivers update still don't works
	correctly and domUs unable to boot on next reboot
Thread-Index: AQHRDXNjXLsQhDl5akuQ2SO58eBnM554zt+g///r1ICAACRMYP//49IAgAA5Q4CAACqnEA==
Date: Fri, 23 Oct 2015 14:49:49 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6232F7@AMSPEX01CL01.citrite.net>
References: <5629FAAE.8090700@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622531@AMSPEX01CL01.citrite.net>
	<562A0875.20008@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622850@AMSPEX01CL01.citrite.net>
	<562A0F44.6090403@m2r.biz> <562A3F4D.6090808@m2r.biz>
In-Reply-To: <562A3F4D.6090808@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] winpv drivers update still don't works correctly
 and domUs unable to boot on next reboot
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-----
[snip]
> 
> I now retried with same domU when I had the latest problem reported (I
> returned to status before the winpv update with disk snapshot), I
> removed the winpv drivers from windows control panel (in this case I
> didn't try additional manual clean) and reboot.
> Next boot windows fails to boot and from qemu log winpv things are still
> present and used but boot fails (I suppose because partial as uninstalled).
> Full qemu log with trace in attachment.
> Seems very strange that similar thing happen only to me and in 80-90% of
> my tests with winpv, as already wrote tested on many domUs, W7/8/10,
> different builds of winpv, different versions of dom0 kernel, xen, qemu
> ecc...
> 

The XENVBD you have installed is missing this fix:

commit 59797d160517e47a249e67f030bb5d2943f8177a
Author: Paul Durrant <paul.durrant@citrix.com>
Date:   Thu Sep 3 17:36:43 2015 +0100

    Clear unplug requests from co-installer

    When XENVBD is uninstalled there is no suitable notification in kernel
    which can be used to clear any remaining unplug requests. This leads to
    a certain 0x7B bugcheck on reboot. This patch therefore does the job
    from the co-installer since this seems to be the only way.

    Signed-off-by: Paul Durrant <paul.durrant@citrix.com>

This means, when you try to remove it, the unplug registry remains set. So, to remove the old driver you have you will need to hack the registry manually after removing the driver but before rebooting (or go into safe mode after reboot). The thing you need to shoot is the "DISKS" value under HKLM/System/CurrentControlset/Services/Xen/Unplug.
BTW, it is expected that the XEN export driver and the XENFILT filter will still re-load after boot even after removing all driver packages... Windows never truly removes drivers. From the log though it looks like you've also got an old XENBUS hanging around in DriverStore since XEN, XENFILT and XENBUS now have a version of 8.1.0 and a date of 7th August so you should probably do a 'pnputil -e' and then 'pnputil -d' on any remaining oemX.inf files you find.

  Paul


> If you need more informations/tests tell me and I'll post them.
> 
> Thanks for any reply and sorry for my bad english.
> 
> >
> >>
> >>>>> In my latest test:
> >>>>> Dom0:
> >>>>> Wheezy (debian 7) 64 bit with xen 4.6.0 plus some small additional
> >>> patches:
> >>>>> https://github.com/Fantu/Xen/commits/rebase/m2r-testing-4.6
> >>>>> kernel is custom build of 4.1.8 with .config in attachment
> >>>>> Qemu 2.4 with some small additional patches:
> >>>>> https://github.com/Fantu/qemu/commits/rebase/upstream
> >>>>> Seabios 1.8.2
> >>>>>
> >>>>> DomU:
> >>>>> windows 10 pro 64 bit
> >>>>> xl cfg in attachment
> >>>>>
> >>>>> I updated all winpv components to latest build without saw errors
> >>>>> but on
> >>>>> reboot windows fails to boot, in qemu log I saw a trace about and
> >>>>> also
> >>>>> the still use older build of at least one component.
> >>>>> Full qemu log with trace in attachment.
> >>>>> I had similar problem many time with different versions of xen, qemu,
> >>>>> seabios, winpv, windows ecc...
> >>>>> I also already did at least one other report about time ago if I
> >>>>> remember good.
> >>>>>
> >>>>>
> >>>>> If you need more informations/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 Fri Oct 23 15:14:34 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 15:14: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 1Zpe38-0007h4-2l; Fri, 23 Oct 2015 15:14:34 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1Zpe36-0007ga-Tk
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 15:14:33 +0000
Received: from [85.158.139.211] by server-6.bemta-5.messagelabs.com id
	86/0C-22089-8DE4A265; Fri, 23 Oct 2015 15:14:32 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-5.tower-206.messagelabs.com!1445613270!44633421!1
X-Originating-IP: [66.111.4.28]
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 25988 invoked from network); 23 Oct 2015 15:14:31 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-5.tower-206.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 23 Oct 2015 15:14:31 -0000
Received: from compute4.internal (compute4.nyi.internal [10.202.2.44])
	by mailout.nyi.internal (Postfix) with ESMTP id 68BBD20814
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 23 Oct 2015 11:14:30 -0400 (EDT)
Received: from frontend1 ([10.202.2.160])
	by compute4.internal (MEProxy); Fri, 23 Oct 2015 11:14:30 -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=SQMSL7ow6GyOU+Vw
	MPShclMx4NU=; b=DlfHyeOBEYE8kWqEFjVah/OB0yG+iAzWE6cc6USu+HLkQr3C
	v3KM9imHdts764UPxpkbKMfUkXkFVsah7LByAjikCYpYc7tzN/X6enxsZblxu8UL
	rUnkHVAa26Z5Prjx3tkPG4vUsmJR/7edTGhNIBF3mQSoiZiMjd5iJd3xSWQ=
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=SQMSL7ow6GyOU+V
	wMPShclMx4NU=; b=cki1LWJUtynDP/LMGbv3EK5RdOM/ZYU1/YfvQo9KN7lKqzy
	cCUhd0CASWi34jCo6KbsEeQE1LgiTZo0mLeonYSpIlWR72dnw19vP7rcOF13wlib
	ga49s648PkwGqVHhZrzmlLrUnjp67TosoIZWfdVE9UKb2nznnGEVGw60/NeQ=
X-Sasl-enc: vJN87COhTwjD5lcAFwfqFWD++s0StVEANXUWgwQgC8Ig 1445613270
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 9C40DC00019;
	Fri, 23 Oct 2015 11:14:29 -0400 (EDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	Fabio Fantoni <fabio.fantoni@m2r.biz>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <5629FAAE.8090700@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622531@AMSPEX01CL01.citrite.net>
	<562A0875.20008@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622850@AMSPEX01CL01.citrite.net>
	<562A0F44.6090403@m2r.biz> <562A3F4D.6090808@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6232F7@AMSPEX01CL01.citrite.net>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
Message-ID: <562A4ED9.60308@invisiblethingslab.com>
Date: Fri, 23 Oct 2015 17:14:33 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6232F7@AMSPEX01CL01.citrite.net>
Content-Length: 3607
Subject: Re: [win-pv-devel] winpv drivers update still don't works correctly
 and domUs unable to boot on next reboot
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

T24gMjAxNS0xMC0yMyAxNjo0OSwgUGF1bCBEdXJyYW50IHdyb3RlOgo+PiAtLS0tLU9yaWdpbmFs
IE1lc3NhZ2UtLS0tLQo+IFtzbmlwXQo+Pgo+PiBJIG5vdyByZXRyaWVkIHdpdGggc2FtZSBkb21V
IHdoZW4gSSBoYWQgdGhlIGxhdGVzdCBwcm9ibGVtIHJlcG9ydGVkIChJCj4+IHJldHVybmVkIHRv
IHN0YXR1cyBiZWZvcmUgdGhlIHdpbnB2IHVwZGF0ZSB3aXRoIGRpc2sgc25hcHNob3QpLCBJCj4+
IHJlbW92ZWQgdGhlIHdpbnB2IGRyaXZlcnMgZnJvbSB3aW5kb3dzIGNvbnRyb2wgcGFuZWwgKGlu
IHRoaXMgY2FzZSBJCj4+IGRpZG4ndCB0cnkgYWRkaXRpb25hbCBtYW51YWwgY2xlYW4pIGFuZCBy
ZWJvb3QuCj4+IE5leHQgYm9vdCB3aW5kb3dzIGZhaWxzIHRvIGJvb3QgYW5kIGZyb20gcWVtdSBs
b2cgd2lucHYgdGhpbmdzIGFyZSBzdGlsbAo+PiBwcmVzZW50IGFuZCB1c2VkIGJ1dCBib290IGZh
aWxzIChJIHN1cHBvc2UgYmVjYXVzZSBwYXJ0aWFsIGFzIHVuaW5zdGFsbGVkKS4KPj4gRnVsbCBx
ZW11IGxvZyB3aXRoIHRyYWNlIGluIGF0dGFjaG1lbnQuCj4+IFNlZW1zIHZlcnkgc3RyYW5nZSB0
aGF0IHNpbWlsYXIgdGhpbmcgaGFwcGVuIG9ubHkgdG8gbWUgYW5kIGluIDgwLTkwJSBvZgo+PiBt
eSB0ZXN0cyB3aXRoIHdpbnB2LCBhcyBhbHJlYWR5IHdyb3RlIHRlc3RlZCBvbiBtYW55IGRvbVVz
LCBXNy84LzEwLAo+PiBkaWZmZXJlbnQgYnVpbGRzIG9mIHdpbnB2LCBkaWZmZXJlbnQgdmVyc2lv
bnMgb2YgZG9tMCBrZXJuZWwsIHhlbiwgcWVtdQo+PiBlY2MuLi4KPj4KPiAKPiBUaGUgWEVOVkJE
IHlvdSBoYXZlIGluc3RhbGxlZCBpcyBtaXNzaW5nIHRoaXMgZml4Ogo+IAo+IGNvbW1pdCA1OTc5
N2QxNjA1MTdlNDdhMjQ5ZTY3ZjAzMGJiNWQyOTQzZjgxNzdhCj4gQXV0aG9yOiBQYXVsIER1cnJh
bnQgPHBhdWwuZHVycmFudEBjaXRyaXguY29tPgo+IERhdGU6ICAgVGh1IFNlcCAzIDE3OjM2OjQz
IDIwMTUgKzAxMDAKPiAKPiAgICAgQ2xlYXIgdW5wbHVnIHJlcXVlc3RzIGZyb20gY28taW5zdGFs
bGVyCj4gCj4gICAgIFdoZW4gWEVOVkJEIGlzIHVuaW5zdGFsbGVkIHRoZXJlIGlzIG5vIHN1aXRh
YmxlIG5vdGlmaWNhdGlvbiBpbiBrZXJuZWwKPiAgICAgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY2xl
YXIgYW55IHJlbWFpbmluZyB1bnBsdWcgcmVxdWVzdHMuIFRoaXMgbGVhZHMgdG8KPiAgICAgYSBj
ZXJ0YWluIDB4N0IgYnVnY2hlY2sgb24gcmVib290LiBUaGlzIHBhdGNoIHRoZXJlZm9yZSBkb2Vz
IHRoZSBqb2IKPiAgICAgZnJvbSB0aGUgY28taW5zdGFsbGVyIHNpbmNlIHRoaXMgc2VlbXMgdG8g
YmUgdGhlIG9ubHkgd2F5Lgo+IAo+ICAgICBTaWduZWQtb2ZmLWJ5OiBQYXVsIER1cnJhbnQgPHBh
dWwuZHVycmFudEBjaXRyaXguY29tPgo+IAo+IFRoaXMgbWVhbnMsIHdoZW4geW91IHRyeSB0byBy
ZW1vdmUgaXQsIHRoZSB1bnBsdWcgcmVnaXN0cnkgcmVtYWlucyBzZXQuIFNvLCB0byByZW1vdmUg
dGhlIG9sZCBkcml2ZXIgeW91IGhhdmUgeW91IHdpbGwgbmVlZCB0byBoYWNrIHRoZSByZWdpc3Ry
eSBtYW51YWxseSBhZnRlciByZW1vdmluZyB0aGUgZHJpdmVyIGJ1dCBiZWZvcmUgcmVib290aW5n
IChvciBnbyBpbnRvIHNhZmUgbW9kZSBhZnRlciByZWJvb3QpLiBUaGUgdGhpbmcgeW91IG5lZWQg
dG8gc2hvb3QgaXMgdGhlICJESVNLUyIgdmFsdWUgdW5kZXIgSEtMTS9TeXN0ZW0vQ3VycmVudENv
bnRyb2xzZXQvU2VydmljZXMvWGVuL1VucGx1Zy4KPiBCVFcsIGl0IGlzIGV4cGVjdGVkIHRoYXQg
dGhlIFhFTiBleHBvcnQgZHJpdmVyIGFuZCB0aGUgWEVORklMVCBmaWx0ZXIgd2lsbCBzdGlsbCBy
ZS1sb2FkIGFmdGVyIGJvb3QgZXZlbiBhZnRlciByZW1vdmluZyBhbGwgZHJpdmVyIHBhY2thZ2Vz
Li4uIFdpbmRvd3MgbmV2ZXIgdHJ1bHkgcmVtb3ZlcyBkcml2ZXJzLiBGcm9tIHRoZSBsb2cgdGhv
dWdoIGl0IGxvb2tzIGxpa2UgeW91J3ZlIGFsc28gZ290IGFuIG9sZCBYRU5CVVMgaGFuZ2luZyBh
cm91bmQgaW4gRHJpdmVyU3RvcmUgc2luY2UgWEVOLCBYRU5GSUxUIGFuZCBYRU5CVVMgbm93IGhh
dmUgYSB2ZXJzaW9uIG9mIDguMS4wIGFuZCBhIGRhdGUgb2YgN3RoIEF1Z3VzdCBzbyB5b3Ugc2hv
dWxkIHByb2JhYmx5IGRvIGEgJ3BucHV0aWwgLWUnIGFuZCB0aGVuICdwbnB1dGlsIC1kJyBvbiBh
bnkgcmVtYWluaW5nIG9lbVguaW5mIGZpbGVzIHlvdSBmaW5kLgo+IAo+ICAgUGF1bAo+IAo+IApZ
ZWFoLCBJJ20gZG9pbmcgYWxsIG15IHRlc3Rpbmcgb24gYW4gaW1hZ2UgY2xvbmVkIGZyb20gYSAi
dGVtcGxhdGUiIHNvCml0J3MgZXNzZW50aWFsbHkgZnJlc2ggZXZlcnkgdGltZS4gSXQgdGFrZXMg
bW9yZSB0aW1lIGJ1dCBlbnN1cmVzIHRoZXJlCmFyZSBubyByZXNpZHVlcyBvZiBzb21lIHByZXZp
b3VzIGRyaXZlciB2ZXJzaW9ucy4KCi0tIApSYWZhxYIgV29qZHnFgmEKUXViZXMgVG9vbHMgZm9y
IFdpbmRvd3MgZGV2ZWxvcGVyCmh0dHBzOi8vd3d3LnF1YmVzLW9zLm9yZy8KCl9fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCndpbi1wdi1kZXZlbCBtYWlsaW5n
IGxpc3QKd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHA6Ly9saXN0cy54ZW5w
cm9qZWN0Lm9yZy9jZ2ktYmluL21haWxtYW4vbGlzdGluZm8vd2luLXB2LWRldmVs

From win-pv-devel-bounces@lists.xenproject.org Fri Oct 23 15:14:34 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 23 Oct 2015 15:14: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 1Zpe38-0007h4-2l; Fri, 23 Oct 2015 15:14:34 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1Zpe36-0007ga-Tk
	for win-pv-devel@lists.xenproject.org; Fri, 23 Oct 2015 15:14:33 +0000
Received: from [85.158.139.211] by server-6.bemta-5.messagelabs.com id
	86/0C-22089-8DE4A265; Fri, 23 Oct 2015 15:14:32 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-5.tower-206.messagelabs.com!1445613270!44633421!1
X-Originating-IP: [66.111.4.28]
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 25988 invoked from network); 23 Oct 2015 15:14:31 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-5.tower-206.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 23 Oct 2015 15:14:31 -0000
Received: from compute4.internal (compute4.nyi.internal [10.202.2.44])
	by mailout.nyi.internal (Postfix) with ESMTP id 68BBD20814
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 23 Oct 2015 11:14:30 -0400 (EDT)
Received: from frontend1 ([10.202.2.160])
	by compute4.internal (MEProxy); Fri, 23 Oct 2015 11:14:30 -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=SQMSL7ow6GyOU+Vw
	MPShclMx4NU=; b=DlfHyeOBEYE8kWqEFjVah/OB0yG+iAzWE6cc6USu+HLkQr3C
	v3KM9imHdts764UPxpkbKMfUkXkFVsah7LByAjikCYpYc7tzN/X6enxsZblxu8UL
	rUnkHVAa26Z5Prjx3tkPG4vUsmJR/7edTGhNIBF3mQSoiZiMjd5iJd3xSWQ=
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=SQMSL7ow6GyOU+V
	wMPShclMx4NU=; b=cki1LWJUtynDP/LMGbv3EK5RdOM/ZYU1/YfvQo9KN7lKqzy
	cCUhd0CASWi34jCo6KbsEeQE1LgiTZo0mLeonYSpIlWR72dnw19vP7rcOF13wlib
	ga49s648PkwGqVHhZrzmlLrUnjp67TosoIZWfdVE9UKb2nznnGEVGw60/NeQ=
X-Sasl-enc: vJN87COhTwjD5lcAFwfqFWD++s0StVEANXUWgwQgC8Ig 1445613270
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 9C40DC00019;
	Fri, 23 Oct 2015 11:14:29 -0400 (EDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	Fabio Fantoni <fabio.fantoni@m2r.biz>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <5629FAAE.8090700@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622531@AMSPEX01CL01.citrite.net>
	<562A0875.20008@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622850@AMSPEX01CL01.citrite.net>
	<562A0F44.6090403@m2r.biz> <562A3F4D.6090808@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6232F7@AMSPEX01CL01.citrite.net>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
Message-ID: <562A4ED9.60308@invisiblethingslab.com>
Date: Fri, 23 Oct 2015 17:14:33 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6232F7@AMSPEX01CL01.citrite.net>
Content-Length: 3607
Subject: Re: [win-pv-devel] winpv drivers update still don't works correctly
 and domUs unable to boot on next reboot
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

T24gMjAxNS0xMC0yMyAxNjo0OSwgUGF1bCBEdXJyYW50IHdyb3RlOgo+PiAtLS0tLU9yaWdpbmFs
IE1lc3NhZ2UtLS0tLQo+IFtzbmlwXQo+Pgo+PiBJIG5vdyByZXRyaWVkIHdpdGggc2FtZSBkb21V
IHdoZW4gSSBoYWQgdGhlIGxhdGVzdCBwcm9ibGVtIHJlcG9ydGVkIChJCj4+IHJldHVybmVkIHRv
IHN0YXR1cyBiZWZvcmUgdGhlIHdpbnB2IHVwZGF0ZSB3aXRoIGRpc2sgc25hcHNob3QpLCBJCj4+
IHJlbW92ZWQgdGhlIHdpbnB2IGRyaXZlcnMgZnJvbSB3aW5kb3dzIGNvbnRyb2wgcGFuZWwgKGlu
IHRoaXMgY2FzZSBJCj4+IGRpZG4ndCB0cnkgYWRkaXRpb25hbCBtYW51YWwgY2xlYW4pIGFuZCBy
ZWJvb3QuCj4+IE5leHQgYm9vdCB3aW5kb3dzIGZhaWxzIHRvIGJvb3QgYW5kIGZyb20gcWVtdSBs
b2cgd2lucHYgdGhpbmdzIGFyZSBzdGlsbAo+PiBwcmVzZW50IGFuZCB1c2VkIGJ1dCBib290IGZh
aWxzIChJIHN1cHBvc2UgYmVjYXVzZSBwYXJ0aWFsIGFzIHVuaW5zdGFsbGVkKS4KPj4gRnVsbCBx
ZW11IGxvZyB3aXRoIHRyYWNlIGluIGF0dGFjaG1lbnQuCj4+IFNlZW1zIHZlcnkgc3RyYW5nZSB0
aGF0IHNpbWlsYXIgdGhpbmcgaGFwcGVuIG9ubHkgdG8gbWUgYW5kIGluIDgwLTkwJSBvZgo+PiBt
eSB0ZXN0cyB3aXRoIHdpbnB2LCBhcyBhbHJlYWR5IHdyb3RlIHRlc3RlZCBvbiBtYW55IGRvbVVz
LCBXNy84LzEwLAo+PiBkaWZmZXJlbnQgYnVpbGRzIG9mIHdpbnB2LCBkaWZmZXJlbnQgdmVyc2lv
bnMgb2YgZG9tMCBrZXJuZWwsIHhlbiwgcWVtdQo+PiBlY2MuLi4KPj4KPiAKPiBUaGUgWEVOVkJE
IHlvdSBoYXZlIGluc3RhbGxlZCBpcyBtaXNzaW5nIHRoaXMgZml4Ogo+IAo+IGNvbW1pdCA1OTc5
N2QxNjA1MTdlNDdhMjQ5ZTY3ZjAzMGJiNWQyOTQzZjgxNzdhCj4gQXV0aG9yOiBQYXVsIER1cnJh
bnQgPHBhdWwuZHVycmFudEBjaXRyaXguY29tPgo+IERhdGU6ICAgVGh1IFNlcCAzIDE3OjM2OjQz
IDIwMTUgKzAxMDAKPiAKPiAgICAgQ2xlYXIgdW5wbHVnIHJlcXVlc3RzIGZyb20gY28taW5zdGFs
bGVyCj4gCj4gICAgIFdoZW4gWEVOVkJEIGlzIHVuaW5zdGFsbGVkIHRoZXJlIGlzIG5vIHN1aXRh
YmxlIG5vdGlmaWNhdGlvbiBpbiBrZXJuZWwKPiAgICAgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY2xl
YXIgYW55IHJlbWFpbmluZyB1bnBsdWcgcmVxdWVzdHMuIFRoaXMgbGVhZHMgdG8KPiAgICAgYSBj
ZXJ0YWluIDB4N0IgYnVnY2hlY2sgb24gcmVib290LiBUaGlzIHBhdGNoIHRoZXJlZm9yZSBkb2Vz
IHRoZSBqb2IKPiAgICAgZnJvbSB0aGUgY28taW5zdGFsbGVyIHNpbmNlIHRoaXMgc2VlbXMgdG8g
YmUgdGhlIG9ubHkgd2F5Lgo+IAo+ICAgICBTaWduZWQtb2ZmLWJ5OiBQYXVsIER1cnJhbnQgPHBh
dWwuZHVycmFudEBjaXRyaXguY29tPgo+IAo+IFRoaXMgbWVhbnMsIHdoZW4geW91IHRyeSB0byBy
ZW1vdmUgaXQsIHRoZSB1bnBsdWcgcmVnaXN0cnkgcmVtYWlucyBzZXQuIFNvLCB0byByZW1vdmUg
dGhlIG9sZCBkcml2ZXIgeW91IGhhdmUgeW91IHdpbGwgbmVlZCB0byBoYWNrIHRoZSByZWdpc3Ry
eSBtYW51YWxseSBhZnRlciByZW1vdmluZyB0aGUgZHJpdmVyIGJ1dCBiZWZvcmUgcmVib290aW5n
IChvciBnbyBpbnRvIHNhZmUgbW9kZSBhZnRlciByZWJvb3QpLiBUaGUgdGhpbmcgeW91IG5lZWQg
dG8gc2hvb3QgaXMgdGhlICJESVNLUyIgdmFsdWUgdW5kZXIgSEtMTS9TeXN0ZW0vQ3VycmVudENv
bnRyb2xzZXQvU2VydmljZXMvWGVuL1VucGx1Zy4KPiBCVFcsIGl0IGlzIGV4cGVjdGVkIHRoYXQg
dGhlIFhFTiBleHBvcnQgZHJpdmVyIGFuZCB0aGUgWEVORklMVCBmaWx0ZXIgd2lsbCBzdGlsbCBy
ZS1sb2FkIGFmdGVyIGJvb3QgZXZlbiBhZnRlciByZW1vdmluZyBhbGwgZHJpdmVyIHBhY2thZ2Vz
Li4uIFdpbmRvd3MgbmV2ZXIgdHJ1bHkgcmVtb3ZlcyBkcml2ZXJzLiBGcm9tIHRoZSBsb2cgdGhv
dWdoIGl0IGxvb2tzIGxpa2UgeW91J3ZlIGFsc28gZ290IGFuIG9sZCBYRU5CVVMgaGFuZ2luZyBh
cm91bmQgaW4gRHJpdmVyU3RvcmUgc2luY2UgWEVOLCBYRU5GSUxUIGFuZCBYRU5CVVMgbm93IGhh
dmUgYSB2ZXJzaW9uIG9mIDguMS4wIGFuZCBhIGRhdGUgb2YgN3RoIEF1Z3VzdCBzbyB5b3Ugc2hv
dWxkIHByb2JhYmx5IGRvIGEgJ3BucHV0aWwgLWUnIGFuZCB0aGVuICdwbnB1dGlsIC1kJyBvbiBh
bnkgcmVtYWluaW5nIG9lbVguaW5mIGZpbGVzIHlvdSBmaW5kLgo+IAo+ICAgUGF1bAo+IAo+IApZ
ZWFoLCBJJ20gZG9pbmcgYWxsIG15IHRlc3Rpbmcgb24gYW4gaW1hZ2UgY2xvbmVkIGZyb20gYSAi
dGVtcGxhdGUiIHNvCml0J3MgZXNzZW50aWFsbHkgZnJlc2ggZXZlcnkgdGltZS4gSXQgdGFrZXMg
bW9yZSB0aW1lIGJ1dCBlbnN1cmVzIHRoZXJlCmFyZSBubyByZXNpZHVlcyBvZiBzb21lIHByZXZp
b3VzIGRyaXZlciB2ZXJzaW9ucy4KCi0tIApSYWZhxYIgV29qZHnFgmEKUXViZXMgVG9vbHMgZm9y
IFdpbmRvd3MgZGV2ZWxvcGVyCmh0dHBzOi8vd3d3LnF1YmVzLW9zLm9yZy8KCl9fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCndpbi1wdi1kZXZlbCBtYWlsaW5n
IGxpc3QKd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHA6Ly9saXN0cy54ZW5w
cm9qZWN0Lm9yZy9jZ2ktYmluL21haWxtYW4vbGlzdGluZm8vd2luLXB2LWRldmVs

From win-pv-devel-bounces@lists.xenproject.org Mon Oct 26 10:06:55 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 26 Oct 2015 10:06: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 1Zqeg2-0005ch-2V; Mon, 26 Oct 2015 10:06:54 +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 1Zqeg0-0005cU-MR
	for win-pv-devel@lists.xenproject.org; Mon, 26 Oct 2015 10:06:53 +0000
Received: from [193.109.254.147] by server-3.bemta-14.messagelabs.com id
	88/A5-25435-B3BFD265; Mon, 26 Oct 2015 10:06:51 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-11.tower-27.messagelabs.com!1445854010!55355248!1
X-Originating-IP: [209.85.212.173]
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 25673 invoked from network); 26 Oct 2015 10:06:50 -0000
Received: from mail-wi0-f173.google.com (HELO mail-wi0-f173.google.com)
	(209.85.212.173)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2015 10:06:50 -0000
Received: by wicfv8 with SMTP id fv8so107837761wic.0
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 26 Oct 2015 03:06:50 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=m2r_biz.20150623.gappssmtp.com; s=20150623;
	h=subject:to:references:from:message-id:date:user-agent:mime-version
	:in-reply-to:content-type:content-transfer-encoding;
	bh=4H47RZbvvksOgc9+yefl/5cbwVWBHaqsngxW0y8Xlfg=;
	b=gdOQQhEpFLez1NlqkiuMj1KkwJyBP6sB9lKbMDtEjMmbmDAuVUmNEGwbaKwnYVALqA
	OWFUYNDD+VEVoZq3iAI1T3J3tc/a/I+ngLVUxojlF2KQaZnuHSoFuIR4CHZ2F6sbboyS
	XKkjBmfVeIjhPZpeJfXKKLcd/zzST+rdkxhtxkeha4NNnynI5oRu+2B07wb936lw/zAp
	HDZCw+A/7NqiXe4ZNuRFjKYYNwpEj8mhPN3oY9VCcfcQDssyG/akTQ+C7wvYPA2nCliV
	JFISHmLcQkLk1tpnqBKd1TELHyTVNabX0ah3aBlYMEDgE/c0a6cVv0VVrxcgH3b/k9N/
	NK5Q==
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=4H47RZbvvksOgc9+yefl/5cbwVWBHaqsngxW0y8Xlfg=;
	b=GqWv9dNlRREcoCc5IMpEi5XYaCOnW9cSG1bzyPgGIBpO+sebfTNDTEbnftY50dtkEc
	rUrnHeArh8nFoK6BZeo+m+rDiWrM+OTthYCQkL61crX9ziaxrpGSCOmEf05zumrY2vXQ
	fS1qjWWkPJPE/5GPYglio+rh8n5RygmTA87nFHB6p+3wbUEBOdwdV9GlJfMrNzKAk8jp
	Xu8CgDpdD84ud/YTZTdA5+zv85tdgWqdcaqVJzD9BeJzvHY6iMrzAgmM7mwVd107mXob
	AQfWcyon/0hmVmyDYMY0eOUdb2d3is66M5q/QW+oa18LzUwuQmE3eFmJ3nEIa35zEeaM
	wjxA==
X-Gm-Message-State: ALoCoQniuoQYHzpip8lNgbXgd+snam/J1893TRYB3ywlj5g6iZtEEpCK91aY80a/epVWThzmTBVN
X-Received: by 10.180.218.199 with SMTP id pi7mr20338257wic.75.1445854010161; 
	Mon, 26 Oct 2015 03:06:50 -0700 (PDT)
Received: from [192.168.1.37] (ip-73-126.sn2.eutelia.it. [83.211.73.126])
	by smtp.googlemail.com with ESMTPSA id
	gh9sm38093565wjb.27.2015.10.26.03.06.48
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 26 Oct 2015 03:06:49 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <5629FAAE.8090700@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622531@AMSPEX01CL01.citrite.net>
	<562A0875.20008@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622850@AMSPEX01CL01.citrite.net>
	<562A0F44.6090403@m2r.biz> <562A3F4D.6090808@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6232F7@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <562DFB37.1010903@m2r.biz>
Date: Mon, 26 Oct 2015 11:06:47 +0100
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6232F7@AMSPEX01CL01.citrite.net>
Subject: Re: [win-pv-devel] winpv drivers update still don't works correctly
 and domUs unable to boot on next reboot
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 23/10/2015 16:49, Paul Durrant ha scritto:
>> -----Original Message-----
> [snip]
>> I now retried with same domU when I had the latest problem reported (I
>> returned to status before the winpv update with disk snapshot), I
>> removed the winpv drivers from windows control panel (in this case I
>> didn't try additional manual clean) and reboot.
>> Next boot windows fails to boot and from qemu log winpv things are still
>> present and used but boot fails (I suppose because partial as uninstalled).
>> Full qemu log with trace in attachment.
>> Seems very strange that similar thing happen only to me and in 80-90% of
>> my tests with winpv, as already wrote tested on many domUs, W7/8/10,
>> different builds of winpv, different versions of dom0 kernel, xen, qemu
>> ecc...
>>
> The XENVBD you have installed is missing this fix:
>
> commit 59797d160517e47a249e67f030bb5d2943f8177a
> Author: Paul Durrant <paul.durrant@citrix.com>
> Date:   Thu Sep 3 17:36:43 2015 +0100
>
>      Clear unplug requests from co-installer
>
>      When XENVBD is uninstalled there is no suitable notification in kernel
>      which can be used to clear any remaining unplug requests. This leads to
>      a certain 0x7B bugcheck on reboot. This patch therefore does the job
>      from the co-installer since this seems to be the only way.
>
>      Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
>
> This means, when you try to remove it, the unplug registry remains set. So, to remove the old driver you have you will need to hack the registry manually after removing the driver but before rebooting (or go into safe mode after reboot). The thing you need to shoot is the "DISKS" value under HKLM/System/CurrentControlset/Services/Xen/Unplug.
> BTW, it is expected that the XEN export driver and the XENFILT filter will still re-load after boot even after removing all driver packages...
> Windows never truly removes drivers.

I suppose this is the mainly problem :(
I tried the winpv remove on domU created only one week ago and still 
boot correctly after drivers uninstall from windows control panel and 
reboot.
After I also tried to install the latest build and on reboot is still 
working and seems that use all newer components in this case.
Big thanks for all your work.
I suppose that update should be never used and remove->reboot->new 
install is the only options, is it right?
About complete and safe winpv remove I suppose is not possible and I 
must "delete and recreate" any domUs with older winpv builds, is it right?

>  From the log though it looks like you've also got an old XENBUS hanging around in DriverStore since XEN, XENFILT and XENBUS now have a version of 8.1.0 and a date of 7th August so you should probably do a 'pnputil -e' and then 'pnputil -d' on any remaining oemX.inf files you find.

I also tried pnputil many times, long time ago was useful but in latest 
months never showed winpv drivers after uninstall from control panel 
even if was still present in registry, windows folder and in trace after 
reboot (and in many cases with domUs not bootable).

>
>    Paul
>
>
>> If you need more informations/tests tell me and I'll post them.
>>
>> Thanks for any reply and sorry for my bad english.
>>
>>>>>>> In my latest test:
>>>>>>> Dom0:
>>>>>>> Wheezy (debian 7) 64 bit with xen 4.6.0 plus some small additional
>>>>> patches:
>>>>>>> https://github.com/Fantu/Xen/commits/rebase/m2r-testing-4.6
>>>>>>> kernel is custom build of 4.1.8 with .config in attachment
>>>>>>> Qemu 2.4 with some small additional patches:
>>>>>>> https://github.com/Fantu/qemu/commits/rebase/upstream
>>>>>>> Seabios 1.8.2
>>>>>>>
>>>>>>> DomU:
>>>>>>> windows 10 pro 64 bit
>>>>>>> xl cfg in attachment
>>>>>>>
>>>>>>> I updated all winpv components to latest build without saw errors
>>>>>>> but on
>>>>>>> reboot windows fails to boot, in qemu log I saw a trace about and
>>>>>>> also
>>>>>>> the still use older build of at least one component.
>>>>>>> Full qemu log with trace in attachment.
>>>>>>> I had similar problem many time with different versions of xen, qemu,
>>>>>>> seabios, winpv, windows ecc...
>>>>>>> I also already did at least one other report about time ago if I
>>>>>>> remember good.
>>>>>>>
>>>>>>>
>>>>>>> If you need more informations/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 Oct 26 10:06:55 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 26 Oct 2015 10:06: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 1Zqeg2-0005ch-2V; Mon, 26 Oct 2015 10:06:54 +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 1Zqeg0-0005cU-MR
	for win-pv-devel@lists.xenproject.org; Mon, 26 Oct 2015 10:06:53 +0000
Received: from [193.109.254.147] by server-3.bemta-14.messagelabs.com id
	88/A5-25435-B3BFD265; Mon, 26 Oct 2015 10:06:51 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-11.tower-27.messagelabs.com!1445854010!55355248!1
X-Originating-IP: [209.85.212.173]
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 25673 invoked from network); 26 Oct 2015 10:06:50 -0000
Received: from mail-wi0-f173.google.com (HELO mail-wi0-f173.google.com)
	(209.85.212.173)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2015 10:06:50 -0000
Received: by wicfv8 with SMTP id fv8so107837761wic.0
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 26 Oct 2015 03:06:50 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=m2r_biz.20150623.gappssmtp.com; s=20150623;
	h=subject:to:references:from:message-id:date:user-agent:mime-version
	:in-reply-to:content-type:content-transfer-encoding;
	bh=4H47RZbvvksOgc9+yefl/5cbwVWBHaqsngxW0y8Xlfg=;
	b=gdOQQhEpFLez1NlqkiuMj1KkwJyBP6sB9lKbMDtEjMmbmDAuVUmNEGwbaKwnYVALqA
	OWFUYNDD+VEVoZq3iAI1T3J3tc/a/I+ngLVUxojlF2KQaZnuHSoFuIR4CHZ2F6sbboyS
	XKkjBmfVeIjhPZpeJfXKKLcd/zzST+rdkxhtxkeha4NNnynI5oRu+2B07wb936lw/zAp
	HDZCw+A/7NqiXe4ZNuRFjKYYNwpEj8mhPN3oY9VCcfcQDssyG/akTQ+C7wvYPA2nCliV
	JFISHmLcQkLk1tpnqBKd1TELHyTVNabX0ah3aBlYMEDgE/c0a6cVv0VVrxcgH3b/k9N/
	NK5Q==
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=4H47RZbvvksOgc9+yefl/5cbwVWBHaqsngxW0y8Xlfg=;
	b=GqWv9dNlRREcoCc5IMpEi5XYaCOnW9cSG1bzyPgGIBpO+sebfTNDTEbnftY50dtkEc
	rUrnHeArh8nFoK6BZeo+m+rDiWrM+OTthYCQkL61crX9ziaxrpGSCOmEf05zumrY2vXQ
	fS1qjWWkPJPE/5GPYglio+rh8n5RygmTA87nFHB6p+3wbUEBOdwdV9GlJfMrNzKAk8jp
	Xu8CgDpdD84ud/YTZTdA5+zv85tdgWqdcaqVJzD9BeJzvHY6iMrzAgmM7mwVd107mXob
	AQfWcyon/0hmVmyDYMY0eOUdb2d3is66M5q/QW+oa18LzUwuQmE3eFmJ3nEIa35zEeaM
	wjxA==
X-Gm-Message-State: ALoCoQniuoQYHzpip8lNgbXgd+snam/J1893TRYB3ywlj5g6iZtEEpCK91aY80a/epVWThzmTBVN
X-Received: by 10.180.218.199 with SMTP id pi7mr20338257wic.75.1445854010161; 
	Mon, 26 Oct 2015 03:06:50 -0700 (PDT)
Received: from [192.168.1.37] (ip-73-126.sn2.eutelia.it. [83.211.73.126])
	by smtp.googlemail.com with ESMTPSA id
	gh9sm38093565wjb.27.2015.10.26.03.06.48
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 26 Oct 2015 03:06:49 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <5629FAAE.8090700@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622531@AMSPEX01CL01.citrite.net>
	<562A0875.20008@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F622850@AMSPEX01CL01.citrite.net>
	<562A0F44.6090403@m2r.biz> <562A3F4D.6090808@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6232F7@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <562DFB37.1010903@m2r.biz>
Date: Mon, 26 Oct 2015 11:06:47 +0100
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6232F7@AMSPEX01CL01.citrite.net>
Subject: Re: [win-pv-devel] winpv drivers update still don't works correctly
 and domUs unable to boot on next reboot
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 23/10/2015 16:49, Paul Durrant ha scritto:
>> -----Original Message-----
> [snip]
>> I now retried with same domU when I had the latest problem reported (I
>> returned to status before the winpv update with disk snapshot), I
>> removed the winpv drivers from windows control panel (in this case I
>> didn't try additional manual clean) and reboot.
>> Next boot windows fails to boot and from qemu log winpv things are still
>> present and used but boot fails (I suppose because partial as uninstalled).
>> Full qemu log with trace in attachment.
>> Seems very strange that similar thing happen only to me and in 80-90% of
>> my tests with winpv, as already wrote tested on many domUs, W7/8/10,
>> different builds of winpv, different versions of dom0 kernel, xen, qemu
>> ecc...
>>
> The XENVBD you have installed is missing this fix:
>
> commit 59797d160517e47a249e67f030bb5d2943f8177a
> Author: Paul Durrant <paul.durrant@citrix.com>
> Date:   Thu Sep 3 17:36:43 2015 +0100
>
>      Clear unplug requests from co-installer
>
>      When XENVBD is uninstalled there is no suitable notification in kernel
>      which can be used to clear any remaining unplug requests. This leads to
>      a certain 0x7B bugcheck on reboot. This patch therefore does the job
>      from the co-installer since this seems to be the only way.
>
>      Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
>
> This means, when you try to remove it, the unplug registry remains set. So, to remove the old driver you have you will need to hack the registry manually after removing the driver but before rebooting (or go into safe mode after reboot). The thing you need to shoot is the "DISKS" value under HKLM/System/CurrentControlset/Services/Xen/Unplug.
> BTW, it is expected that the XEN export driver and the XENFILT filter will still re-load after boot even after removing all driver packages...
> Windows never truly removes drivers.

I suppose this is the mainly problem :(
I tried the winpv remove on domU created only one week ago and still 
boot correctly after drivers uninstall from windows control panel and 
reboot.
After I also tried to install the latest build and on reboot is still 
working and seems that use all newer components in this case.
Big thanks for all your work.
I suppose that update should be never used and remove->reboot->new 
install is the only options, is it right?
About complete and safe winpv remove I suppose is not possible and I 
must "delete and recreate" any domUs with older winpv builds, is it right?

>  From the log though it looks like you've also got an old XENBUS hanging around in DriverStore since XEN, XENFILT and XENBUS now have a version of 8.1.0 and a date of 7th August so you should probably do a 'pnputil -e' and then 'pnputil -d' on any remaining oemX.inf files you find.

I also tried pnputil many times, long time ago was useful but in latest 
months never showed winpv drivers after uninstall from control panel 
even if was still present in registry, windows folder and in trace after 
reboot (and in many cases with domUs not bootable).

>
>    Paul
>
>
>> If you need more informations/tests tell me and I'll post them.
>>
>> Thanks for any reply and sorry for my bad english.
>>
>>>>>>> In my latest test:
>>>>>>> Dom0:
>>>>>>> Wheezy (debian 7) 64 bit with xen 4.6.0 plus some small additional
>>>>> patches:
>>>>>>> https://github.com/Fantu/Xen/commits/rebase/m2r-testing-4.6
>>>>>>> kernel is custom build of 4.1.8 with .config in attachment
>>>>>>> Qemu 2.4 with some small additional patches:
>>>>>>> https://github.com/Fantu/qemu/commits/rebase/upstream
>>>>>>> Seabios 1.8.2
>>>>>>>
>>>>>>> DomU:
>>>>>>> windows 10 pro 64 bit
>>>>>>> xl cfg in attachment
>>>>>>>
>>>>>>> I updated all winpv components to latest build without saw errors
>>>>>>> but on
>>>>>>> reboot windows fails to boot, in qemu log I saw a trace about and
>>>>>>> also
>>>>>>> the still use older build of at least one component.
>>>>>>> Full qemu log with trace in attachment.
>>>>>>> I had similar problem many time with different versions of xen, qemu,
>>>>>>> seabios, winpv, windows ecc...
>>>>>>> I also already did at least one other report about time ago if I
>>>>>>> remember good.
>>>>>>>
>>>>>>>
>>>>>>> If you need more informations/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 Oct 27 11:16:02 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 11:16:02 +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 1Zr2ET-0003DU-Q8; Tue, 27 Oct 2015 11:16:02 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=735ca0e81=owen.smith@citrix.com>)
	id 1Zr2ES-0003Cx-9p
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 11:16:00 +0000
Received: from [193.109.254.147] by server-4.bemta-14.messagelabs.com id
	77/D3-10715-FEC5F265; Tue, 27 Oct 2015 11:15:59 +0000
X-Env-Sender: prvs=735ca0e81=owen.smith@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1445944557!35264514!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 18831 invoked from network); 27 Oct 2015 11:15:59 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2015 11:15:59 -0000
X-IronPort-AV: E=Sophos;i="5.20,204,1444694400"; d="scan'208";a="313676553"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 27 Oct 2015 11:15:38 +0000
Message-ID: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
MIME-Version: 1.0
X-DLP: MIA2
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 0/8] Fix an issue, cleanup 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>
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

Fixes:
* SRB_FUNCTION_RESET_DEVICE was being failed
* Add XENVBD_INDIRECT context containing Page and Grant contexts
* Refactor code for easier maintenance

Owen Smith (8):
  SRB_FUNCTION_RESET_DEVICE should succeed...
  Refacror - reorder functions in pdo.c
  Refactor - hide default Pnp/Power function pointers
  Remove PdoPnpSrb, since StorPort doesn't call for targets
  Refactor - move more functions
  Prepare calls only need to return success/failure, not an error code
  Add Get/Put for request, segment and indirect(pages)
  Rework indirect context structure

 src/xenvbd/blockring.c |   48 +-
 src/xenvbd/driver.c    |   32 +-
 src/xenvbd/driver.h    |   12 +
 src/xenvbd/fdo.c       |   34 +-
 src/xenvbd/pdo.c       | 1228 ++++++++++++++++++++++++------------------------
 src/xenvbd/pdo.h       |   11 -
 src/xenvbd/srbext.h    |   13 +-
 7 files changed, 703 insertions(+), 675 deletions(-)

-- 
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 Tue Oct 27 11:16:02 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 11:16:02 +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 1Zr2EU-0003Da-7Y; Tue, 27 Oct 2015 11:16:02 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=735ca0e81=owen.smith@citrix.com>)
	id 1Zr2ET-0003DF-7g
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 11:16:01 +0000
Received: from [193.109.254.147] by server-14.bemta-14.messagelabs.com id
	7F/C0-04752-0FC5F265; Tue, 27 Oct 2015 11:16:00 +0000
X-Env-Sender: prvs=735ca0e81=owen.smith@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1445944557!35264514!2
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 18937 invoked from network); 27 Oct 2015 11:15:59 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2015 11:15:59 -0000
X-IronPort-AV: E=Sophos;i="5.20,204,1444694400"; d="scan'208";a="313676554"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 27 Oct 2015 11:15:39 +0000
Message-ID: <1445944546-21500-2-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA2
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 1/8] SRB_FUNCTION_RESET_DEVICE should
	succeed... otherwise the entire controller is reset.
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

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

diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
index f6b47f2..82b7fb6 100644
--- a/src/xenvbd/fdo.c
+++ b/src/xenvbd/fdo.c
@@ -1449,6 +1449,7 @@ FdoResetBus(
 {
     ULONG           TargetId;
 
+    Verbose("====>\n");
     for (TargetId = 0; TargetId < XENVBD_MAX_TARGETS; ++TargetId) {
         PXENVBD_PDO Pdo = __FdoGetPdo(Fdo, TargetId);
         if (Pdo) {
@@ -1456,6 +1457,7 @@ FdoResetBus(
             PdoDereference(Pdo);
         }
     }
+    Verbose("<====\n");
 
     return TRUE;
 }
diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index 198c4d3..de8ba02 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -2242,7 +2242,7 @@ __PdoExecuteScsi(
     return TRUE;
 }
 
-static FORCEINLINE VOID
+static FORCEINLINE BOOLEAN
 __PdoQueueShutdown(
     __in PXENVBD_PDO             Pdo,
     __in PSCSI_REQUEST_BLOCK     Srb
@@ -2253,6 +2253,23 @@ __PdoQueueShutdown(
 
     QueueAppend(&Pdo->ShutdownSrbs, &SrbExt->Entry);
     NotifierKick(Notifier);
+
+    return FALSE;
+}
+
+static FORCEINLINE BOOLEAN
+__PdoReset(
+    __in PXENVBD_PDO             Pdo,
+    __in PSCSI_REQUEST_BLOCK     Srb
+    )
+{
+    Verbose("Target[%u] ====>\n", PdoGetTargetId(Pdo));
+
+    PdoReset(Pdo);
+    Srb->SrbStatus = SRB_STATUS_SUCCESS;
+
+    Verbose("Target[%u] <====\n", PdoGetTargetId(Pdo));
+    return TRUE;
 }
 
 static FORCEINLINE VOID
@@ -2378,13 +2395,11 @@ PdoStartIo(
         return __PdoExecuteScsi(Pdo, Srb);
 
     case SRB_FUNCTION_RESET_DEVICE:
-        PdoReset(Pdo);
-        return TRUE;
+        return __PdoReset(Pdo, Srb);
 
     case SRB_FUNCTION_FLUSH:
     case SRB_FUNCTION_SHUTDOWN:
-        __PdoQueueShutdown(Pdo, Srb);
-        return FALSE;
+        return __PdoQueueShutdown(Pdo, Srb);
 
     default:
         return TRUE;
-- 
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 Tue Oct 27 11:16:02 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 11:16:02 +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 1Zr2ET-0003DU-Q8; Tue, 27 Oct 2015 11:16:02 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=735ca0e81=owen.smith@citrix.com>)
	id 1Zr2ES-0003Cx-9p
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 11:16:00 +0000
Received: from [193.109.254.147] by server-4.bemta-14.messagelabs.com id
	77/D3-10715-FEC5F265; Tue, 27 Oct 2015 11:15:59 +0000
X-Env-Sender: prvs=735ca0e81=owen.smith@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1445944557!35264514!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 18831 invoked from network); 27 Oct 2015 11:15:59 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2015 11:15:59 -0000
X-IronPort-AV: E=Sophos;i="5.20,204,1444694400"; d="scan'208";a="313676553"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 27 Oct 2015 11:15:38 +0000
Message-ID: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
MIME-Version: 1.0
X-DLP: MIA2
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 0/8] Fix an issue, cleanup 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>
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

Fixes:
* SRB_FUNCTION_RESET_DEVICE was being failed
* Add XENVBD_INDIRECT context containing Page and Grant contexts
* Refactor code for easier maintenance

Owen Smith (8):
  SRB_FUNCTION_RESET_DEVICE should succeed...
  Refacror - reorder functions in pdo.c
  Refactor - hide default Pnp/Power function pointers
  Remove PdoPnpSrb, since StorPort doesn't call for targets
  Refactor - move more functions
  Prepare calls only need to return success/failure, not an error code
  Add Get/Put for request, segment and indirect(pages)
  Rework indirect context structure

 src/xenvbd/blockring.c |   48 +-
 src/xenvbd/driver.c    |   32 +-
 src/xenvbd/driver.h    |   12 +
 src/xenvbd/fdo.c       |   34 +-
 src/xenvbd/pdo.c       | 1228 ++++++++++++++++++++++++------------------------
 src/xenvbd/pdo.h       |   11 -
 src/xenvbd/srbext.h    |   13 +-
 7 files changed, 703 insertions(+), 675 deletions(-)

-- 
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 Tue Oct 27 11:16:02 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 11:16:02 +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 1Zr2EU-0003Da-7Y; Tue, 27 Oct 2015 11:16:02 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=735ca0e81=owen.smith@citrix.com>)
	id 1Zr2ET-0003DF-7g
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 11:16:01 +0000
Received: from [193.109.254.147] by server-14.bemta-14.messagelabs.com id
	7F/C0-04752-0FC5F265; Tue, 27 Oct 2015 11:16:00 +0000
X-Env-Sender: prvs=735ca0e81=owen.smith@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1445944557!35264514!2
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 18937 invoked from network); 27 Oct 2015 11:15:59 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2015 11:15:59 -0000
X-IronPort-AV: E=Sophos;i="5.20,204,1444694400"; d="scan'208";a="313676554"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 27 Oct 2015 11:15:39 +0000
Message-ID: <1445944546-21500-2-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA2
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 1/8] SRB_FUNCTION_RESET_DEVICE should
	succeed... otherwise the entire controller is reset.
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

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

diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
index f6b47f2..82b7fb6 100644
--- a/src/xenvbd/fdo.c
+++ b/src/xenvbd/fdo.c
@@ -1449,6 +1449,7 @@ FdoResetBus(
 {
     ULONG           TargetId;
 
+    Verbose("====>\n");
     for (TargetId = 0; TargetId < XENVBD_MAX_TARGETS; ++TargetId) {
         PXENVBD_PDO Pdo = __FdoGetPdo(Fdo, TargetId);
         if (Pdo) {
@@ -1456,6 +1457,7 @@ FdoResetBus(
             PdoDereference(Pdo);
         }
     }
+    Verbose("<====\n");
 
     return TRUE;
 }
diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index 198c4d3..de8ba02 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -2242,7 +2242,7 @@ __PdoExecuteScsi(
     return TRUE;
 }
 
-static FORCEINLINE VOID
+static FORCEINLINE BOOLEAN
 __PdoQueueShutdown(
     __in PXENVBD_PDO             Pdo,
     __in PSCSI_REQUEST_BLOCK     Srb
@@ -2253,6 +2253,23 @@ __PdoQueueShutdown(
 
     QueueAppend(&Pdo->ShutdownSrbs, &SrbExt->Entry);
     NotifierKick(Notifier);
+
+    return FALSE;
+}
+
+static FORCEINLINE BOOLEAN
+__PdoReset(
+    __in PXENVBD_PDO             Pdo,
+    __in PSCSI_REQUEST_BLOCK     Srb
+    )
+{
+    Verbose("Target[%u] ====>\n", PdoGetTargetId(Pdo));
+
+    PdoReset(Pdo);
+    Srb->SrbStatus = SRB_STATUS_SUCCESS;
+
+    Verbose("Target[%u] <====\n", PdoGetTargetId(Pdo));
+    return TRUE;
 }
 
 static FORCEINLINE VOID
@@ -2378,13 +2395,11 @@ PdoStartIo(
         return __PdoExecuteScsi(Pdo, Srb);
 
     case SRB_FUNCTION_RESET_DEVICE:
-        PdoReset(Pdo);
-        return TRUE;
+        return __PdoReset(Pdo, Srb);
 
     case SRB_FUNCTION_FLUSH:
     case SRB_FUNCTION_SHUTDOWN:
-        __PdoQueueShutdown(Pdo, Srb);
-        return FALSE;
+        return __PdoQueueShutdown(Pdo, Srb);
 
     default:
         return TRUE;
-- 
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 Tue Oct 27 11:16:03 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 11:16:03 +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 1Zr2EV-0003ES-8o; Tue, 27 Oct 2015 11:16:03 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=735ca0e81=owen.smith@citrix.com>)
	id 1Zr2ET-0003DK-OM
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 11:16:02 +0000
Received: from [193.109.254.147] by server-6.bemta-14.messagelabs.com id
	5F/E9-16618-1FC5F265; Tue, 27 Oct 2015 11:16:01 +0000
X-Env-Sender: prvs=735ca0e81=owen.smith@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1445944557!35264514!3
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 19119 invoked from network); 27 Oct 2015 11:16:00 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2015 11:16:00 -0000
X-IronPort-AV: E=Sophos;i="5.20,204,1444694400"; d="scan'208";a="313676555"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 27 Oct 2015 11:15:43 +0000
Message-ID: <1445944546-21500-6-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA2
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 5/8] Refactor - move more functions
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

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

diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index 172fa67..4e88302 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -2077,66 +2077,6 @@ __PdoReset(
     return TRUE;
 }
 
-static FORCEINLINE VOID
-__PdoCleanupSubmittedReqs(
-    IN  PXENVBD_PDO             Pdo
-    )
-{
-    // Fail PreparedReqs
-    for (;;) {
-        PXENVBD_SRBEXT  SrbExt;
-        PXENVBD_REQUEST Request;
-        PLIST_ENTRY     Entry = QueuePop(&Pdo->SubmittedReqs);
-        if (Entry == NULL)
-            break;
-        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
-        SrbExt = GetSrbExt(Request->Srb);
-
-        Verbose("Target[%d] : SubmittedReq 0x%p -> FAILED\n", PdoGetTargetId(Pdo), Request);
-
-        RequestCleanup(Pdo, Request);
-        __LookasideFree(&Pdo->RequestList, Request);
-
-        if (InterlockedDecrement(&SrbExt->Count) == 0) {
-            SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
-            SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
-            FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
-        }
-    }
-}
-
-VOID
-PdoReset(
-    __in PXENVBD_PDO             Pdo
-    )
-{
-    NTSTATUS        Status;
-
-    Trace("Target[%d] ====> (Irql=%d)\n", PdoGetTargetId(Pdo), KeGetCurrentIrql());
-
-    __PdoPauseDataPath(Pdo, TRUE);
-
-    if (QueueCount(&Pdo->SubmittedReqs)) {
-        Error("Target[%d] : backend has %u outstanding requests after a PdoReset\n",
-                PdoGetTargetId(Pdo), QueueCount(&Pdo->SubmittedReqs));
-    }
-
-    Status = FrontendSetState(Pdo->Frontend, XENVBD_CLOSING);
-    ASSERT(NT_SUCCESS(Status));
-
-    __PdoCleanupSubmittedReqs(Pdo);
-
-    Status = FrontendSetState(Pdo->Frontend, XENVBD_CLOSED);
-    ASSERT(NT_SUCCESS(Status));
-
-    Status = FrontendSetState(Pdo->Frontend, XENVBD_ENABLED);
-    ASSERT(NT_SUCCESS(Status));
-
-    __PdoUnpauseDataPath(Pdo);
-
-    Trace("Target[%d] <==== (Irql=%d)\n", PdoGetTargetId(Pdo), KeGetCurrentIrql());
-}
-
 __checkReturn
 static FORCEINLINE BOOLEAN
 __ValidateSrbForPdo(
@@ -2210,6 +2150,66 @@ PdoStartIo(
     }
 }
 
+static FORCEINLINE VOID
+__PdoCleanupSubmittedReqs(
+    IN  PXENVBD_PDO             Pdo
+    )
+{
+    // Fail PreparedReqs
+    for (;;) {
+        PXENVBD_SRBEXT  SrbExt;
+        PXENVBD_REQUEST Request;
+        PLIST_ENTRY     Entry = QueuePop(&Pdo->SubmittedReqs);
+        if (Entry == NULL)
+            break;
+        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
+        SrbExt = GetSrbExt(Request->Srb);
+
+        Verbose("Target[%d] : SubmittedReq 0x%p -> FAILED\n", PdoGetTargetId(Pdo), Request);
+
+        RequestCleanup(Pdo, Request);
+        __LookasideFree(&Pdo->RequestList, Request);
+
+        if (InterlockedDecrement(&SrbExt->Count) == 0) {
+            SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
+            SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
+            FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
+        }
+    }
+}
+
+VOID
+PdoReset(
+    __in PXENVBD_PDO             Pdo
+    )
+{
+    NTSTATUS        Status;
+
+    Trace("Target[%d] ====> (Irql=%d)\n", PdoGetTargetId(Pdo), KeGetCurrentIrql());
+
+    __PdoPauseDataPath(Pdo, TRUE);
+
+    if (QueueCount(&Pdo->SubmittedReqs)) {
+        Error("Target[%d] : backend has %u outstanding requests after a PdoReset\n",
+                PdoGetTargetId(Pdo), QueueCount(&Pdo->SubmittedReqs));
+    }
+
+    Status = FrontendSetState(Pdo->Frontend, XENVBD_CLOSING);
+    ASSERT(NT_SUCCESS(Status));
+
+    __PdoCleanupSubmittedReqs(Pdo);
+
+    Status = FrontendSetState(Pdo->Frontend, XENVBD_CLOSED);
+    ASSERT(NT_SUCCESS(Status));
+
+    Status = FrontendSetState(Pdo->Frontend, XENVBD_ENABLED);
+    ASSERT(NT_SUCCESS(Status));
+
+    __PdoUnpauseDataPath(Pdo);
+
+    Trace("Target[%d] <==== (Irql=%d)\n", PdoGetTargetId(Pdo), KeGetCurrentIrql());
+}
+
 //=============================================================================
 // PnP Handler
 static FORCEINLINE VOID
-- 
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 Tue Oct 27 11:16:03 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 11:16:03 +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 1Zr2EV-0003ES-8o; Tue, 27 Oct 2015 11:16:03 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=735ca0e81=owen.smith@citrix.com>)
	id 1Zr2ET-0003DK-OM
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 11:16:02 +0000
Received: from [193.109.254.147] by server-6.bemta-14.messagelabs.com id
	5F/E9-16618-1FC5F265; Tue, 27 Oct 2015 11:16:01 +0000
X-Env-Sender: prvs=735ca0e81=owen.smith@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1445944557!35264514!3
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 19119 invoked from network); 27 Oct 2015 11:16:00 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2015 11:16:00 -0000
X-IronPort-AV: E=Sophos;i="5.20,204,1444694400"; d="scan'208";a="313676555"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 27 Oct 2015 11:15:43 +0000
Message-ID: <1445944546-21500-6-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA2
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 5/8] Refactor - move more functions
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

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

diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index 172fa67..4e88302 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -2077,66 +2077,6 @@ __PdoReset(
     return TRUE;
 }
 
-static FORCEINLINE VOID
-__PdoCleanupSubmittedReqs(
-    IN  PXENVBD_PDO             Pdo
-    )
-{
-    // Fail PreparedReqs
-    for (;;) {
-        PXENVBD_SRBEXT  SrbExt;
-        PXENVBD_REQUEST Request;
-        PLIST_ENTRY     Entry = QueuePop(&Pdo->SubmittedReqs);
-        if (Entry == NULL)
-            break;
-        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
-        SrbExt = GetSrbExt(Request->Srb);
-
-        Verbose("Target[%d] : SubmittedReq 0x%p -> FAILED\n", PdoGetTargetId(Pdo), Request);
-
-        RequestCleanup(Pdo, Request);
-        __LookasideFree(&Pdo->RequestList, Request);
-
-        if (InterlockedDecrement(&SrbExt->Count) == 0) {
-            SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
-            SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
-            FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
-        }
-    }
-}
-
-VOID
-PdoReset(
-    __in PXENVBD_PDO             Pdo
-    )
-{
-    NTSTATUS        Status;
-
-    Trace("Target[%d] ====> (Irql=%d)\n", PdoGetTargetId(Pdo), KeGetCurrentIrql());
-
-    __PdoPauseDataPath(Pdo, TRUE);
-
-    if (QueueCount(&Pdo->SubmittedReqs)) {
-        Error("Target[%d] : backend has %u outstanding requests after a PdoReset\n",
-                PdoGetTargetId(Pdo), QueueCount(&Pdo->SubmittedReqs));
-    }
-
-    Status = FrontendSetState(Pdo->Frontend, XENVBD_CLOSING);
-    ASSERT(NT_SUCCESS(Status));
-
-    __PdoCleanupSubmittedReqs(Pdo);
-
-    Status = FrontendSetState(Pdo->Frontend, XENVBD_CLOSED);
-    ASSERT(NT_SUCCESS(Status));
-
-    Status = FrontendSetState(Pdo->Frontend, XENVBD_ENABLED);
-    ASSERT(NT_SUCCESS(Status));
-
-    __PdoUnpauseDataPath(Pdo);
-
-    Trace("Target[%d] <==== (Irql=%d)\n", PdoGetTargetId(Pdo), KeGetCurrentIrql());
-}
-
 __checkReturn
 static FORCEINLINE BOOLEAN
 __ValidateSrbForPdo(
@@ -2210,6 +2150,66 @@ PdoStartIo(
     }
 }
 
+static FORCEINLINE VOID
+__PdoCleanupSubmittedReqs(
+    IN  PXENVBD_PDO             Pdo
+    )
+{
+    // Fail PreparedReqs
+    for (;;) {
+        PXENVBD_SRBEXT  SrbExt;
+        PXENVBD_REQUEST Request;
+        PLIST_ENTRY     Entry = QueuePop(&Pdo->SubmittedReqs);
+        if (Entry == NULL)
+            break;
+        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
+        SrbExt = GetSrbExt(Request->Srb);
+
+        Verbose("Target[%d] : SubmittedReq 0x%p -> FAILED\n", PdoGetTargetId(Pdo), Request);
+
+        RequestCleanup(Pdo, Request);
+        __LookasideFree(&Pdo->RequestList, Request);
+
+        if (InterlockedDecrement(&SrbExt->Count) == 0) {
+            SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
+            SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
+            FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
+        }
+    }
+}
+
+VOID
+PdoReset(
+    __in PXENVBD_PDO             Pdo
+    )
+{
+    NTSTATUS        Status;
+
+    Trace("Target[%d] ====> (Irql=%d)\n", PdoGetTargetId(Pdo), KeGetCurrentIrql());
+
+    __PdoPauseDataPath(Pdo, TRUE);
+
+    if (QueueCount(&Pdo->SubmittedReqs)) {
+        Error("Target[%d] : backend has %u outstanding requests after a PdoReset\n",
+                PdoGetTargetId(Pdo), QueueCount(&Pdo->SubmittedReqs));
+    }
+
+    Status = FrontendSetState(Pdo->Frontend, XENVBD_CLOSING);
+    ASSERT(NT_SUCCESS(Status));
+
+    __PdoCleanupSubmittedReqs(Pdo);
+
+    Status = FrontendSetState(Pdo->Frontend, XENVBD_CLOSED);
+    ASSERT(NT_SUCCESS(Status));
+
+    Status = FrontendSetState(Pdo->Frontend, XENVBD_ENABLED);
+    ASSERT(NT_SUCCESS(Status));
+
+    __PdoUnpauseDataPath(Pdo);
+
+    Trace("Target[%d] <==== (Irql=%d)\n", PdoGetTargetId(Pdo), KeGetCurrentIrql());
+}
+
 //=============================================================================
 // PnP Handler
 static FORCEINLINE VOID
-- 
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 Tue Oct 27 11:16:03 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 11:16:03 +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 1Zr2EV-0003Ea-9z; Tue, 27 Oct 2015 11:16:03 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=735ca0e81=owen.smith@citrix.com>)
	id 1Zr2EU-0003DI-1I
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 11:16:02 +0000
Received: from [193.109.254.147] by server-13.bemta-14.messagelabs.com id
	24/B3-12371-0FC5F265; Tue, 27 Oct 2015 11:16:00 +0000
X-Env-Sender: prvs=735ca0e81=owen.smith@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1445944558!50420260!1
X-Originating-IP: [66.165.176.89]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20730 invoked from network); 27 Oct 2015 11:15:59 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2015 11:15:59 -0000
X-IronPort-AV: E=Sophos;i="5.20,204,1444694400"; d="scan'208";a="308442328"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 27 Oct 2015 11:15:46 +0000
Message-ID: <1445944546-21500-9-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA2
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 8/8] Rework indirect context structure
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

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/blockring.c | 48 ++++++++++++++++-----------------
 src/xenvbd/pdo.c       | 72 ++++++++++++++++++++++++++++++++------------------
 src/xenvbd/srbext.h    | 13 ++++++---
 3 files changed, 79 insertions(+), 54 deletions(-)

diff --git a/src/xenvbd/blockring.c b/src/xenvbd/blockring.c
index 28f1393..6ca9cb2 100644
--- a/src/xenvbd/blockring.c
+++ b/src/xenvbd/blockring.c
@@ -152,9 +152,10 @@ __BlockRingInsert(
     case BLKIF_OP_WRITE:
         if (Request->NrSegments > BLKIF_MAX_SEGMENTS_PER_REQUEST) {
             // Indirect
-            ULONG                       PageIndex;
-            ULONG                       SegmentIndex;
-            PLIST_ENTRY                 Entry;
+            ULONG                       PageIdx;
+            ULONG                       SegIdx;
+            PLIST_ENTRY                 PageEntry;
+            PLIST_ENTRY                 SegEntry;
             blkif_request_indirect_t*   req_indirect;
 
             req_indirect = (blkif_request_indirect_t*)req;
@@ -165,29 +166,28 @@ __BlockRingInsert(
             req_indirect->sector_number     = Request->FirstSector;
             req_indirect->handle            = (USHORT)BlockRing->DeviceId;
 
-            for (PageIndex = 0, SegmentIndex = 0, Entry = Request->Segments.Flink;
-                    PageIndex < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
-                    Entry != &Request->Segments;
-                        Entry = Entry->Flink) {
-                PBLKIF_SEGMENT  Indirect = Request->Pages[PageIndex];
-                PXENVBD_SEGMENT Segment = CONTAINING_RECORD(Entry, XENVBD_SEGMENT, Entry);
-
-                Indirect[SegmentIndex].GrantRef = GranterReference(Granter, Segment->Grant);
-                Indirect[SegmentIndex].First    = Segment->FirstSector;
-                Indirect[SegmentIndex].Last     = Segment->LastSector;
-
-                ++SegmentIndex;
-                if (SegmentIndex >= XENVBD_MAX_SEGMENTS_PER_PAGE) {
-                    ++PageIndex;
-                    SegmentIndex = 0;
+            for (PageIdx = 0,
+                 PageEntry = Request->Indirects.Flink,
+                 SegEntry = Request->Segments.Flink;
+                    PageIdx < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
+                    PageEntry != &Request->Indirects &&
+                    SegEntry != &Request->Segments;
+                        ++PageIdx, PageEntry = PageEntry->Flink) {
+                PXENVBD_INDIRECT Page = CONTAINING_RECORD(PageEntry, XENVBD_INDIRECT, Entry);
+
+                req_indirect->indirect_grefs[PageIdx] = GranterReference(Granter, Page->Grant);
+
+                for (SegIdx = 0;
+                        SegIdx < XENVBD_MAX_SEGMENTS_PER_PAGE &&
+                        SegEntry != &Request->Segments;
+                            ++SegIdx, SegEntry = SegEntry->Flink) {
+                    PXENVBD_SEGMENT Segment = CONTAINING_RECORD(SegEntry, XENVBD_SEGMENT, Entry);
+
+                    Page->Page[SegIdx].GrantRef = GranterReference(Granter, Segment->Grant);
+                    Page->Page[SegIdx].First    = Segment->FirstSector;
+                    Page->Page[SegIdx].Last     = Segment->LastSector;
                 }
             }
-            for (PageIndex = 0;
-                    PageIndex < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
-                    Request->Grants[PageIndex] != NULL;
-                        ++PageIndex) {
-                req_indirect->indirect_grefs[PageIndex] = GranterReference(Granter, Request->Grants[PageIndex]);
-            }
         } else {
             // Direct
             ULONG           Index;
diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index e8d94cb..3c429b2 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -567,20 +567,38 @@ PdoSectorSize(
 }
 
 //=============================================================================
-static PVOID
+static PXENVBD_INDIRECT
 PdoGetIndirect(
     IN  PXENVBD_PDO             Pdo
     )
 {
-    PVOID                       Indirect;
+    PXENVBD_INDIRECT    Indirect;
+    NTSTATUS            status;
+    PXENVBD_GRANTER     Granter = FrontendGetGranter(Pdo->Frontend);
 
     Indirect = __LookasideAlloc(&Pdo->IndirectList);
     if (Indirect == NULL)
         goto fail1;
 
-    RtlZeroMemory(Indirect, PAGE_SIZE);
+    RtlZeroMemory(Indirect, sizeof(XENVBD_INDIRECT));
+
+    Indirect->Page = __AllocPages(PAGE_SIZE, &Indirect->Mdl);
+    if (Indirect->Page == NULL)
+        goto fail2;
+
+    status = GranterGet(Granter,
+                        MmGetMdlPfnArray(Indirect->Mdl)[0],
+                        TRUE,
+                        &Indirect->Grant);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
     return Indirect;
 
+fail3:
+    __FreePages(Indirect->Page, Indirect->Mdl);
+fail2:
+    __LookasideFree(&Pdo->IndirectList, Indirect);
 fail1:
     return NULL;
 }
@@ -588,10 +606,17 @@ fail1:
 static VOID
 PdoPutIndirect(
     IN  PXENVBD_PDO             Pdo,
-    IN  PVOID                   Indirect
+    IN  PXENVBD_INDIRECT        Indirect
     )
 {
-    RtlZeroMemory(Indirect, PAGE_SIZE);
+    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
+
+    if (Indirect->Grant)
+        GranterPut(Granter, Indirect->Grant);
+    if (Indirect->Page)
+        __FreePages(Indirect->Page, Indirect->Mdl);
+
+    RtlZeroMemory(Indirect, sizeof(XENVBD_INDIRECT));
     __LookasideFree(&Pdo->IndirectList, Indirect);
 }
 
@@ -648,6 +673,7 @@ PdoGetRequest(
     RtlZeroMemory(Request, sizeof(XENVBD_REQUEST));
     Request->Id = (ULONG)InterlockedIncrement((PLONG)&Pdo->NextTag);
     InitializeListHead(&Request->Segments);
+    InitializeListHead(&Request->Indirects);
 
     return Request;
 
@@ -661,11 +687,9 @@ PdoPutRequest(
     IN  PXENVBD_REQUEST         Request
     )
 {
-    ULONG           Index;
-    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
+    PLIST_ENTRY     Entry;
 
     for (;;) {
-        PLIST_ENTRY     Entry;
         PXENVBD_SEGMENT Segment;
 
         Entry = RemoveHeadList(&Request->Segments);
@@ -675,11 +699,14 @@ PdoPutRequest(
         PdoPutSegment(Pdo, Segment);
     }
 
-    for (Index = 0; Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST; ++Index) {
-        if (Request->Grants[Index])
-            GranterPut(Granter, Request->Grants[Index]);
-        if (Request->Pages[Index])
-            PdoPutIndirect(Pdo, Request->Pages[Index]);
+    for (;;) {
+        PXENVBD_INDIRECT    Indirect;
+
+        Entry = RemoveHeadList(&Request->Indirects);
+        if (Entry == &Request->Indirects)
+            break;
+        Indirect = CONTAINING_RECORD(Entry, XENVBD_INDIRECT, Entry);
+        PdoPutIndirect(Pdo, Indirect);
     }
 
     RtlZeroMemory(Request, sizeof(XENVBD_REQUEST));
@@ -1052,32 +1079,25 @@ PrepareBlkifIndirect(
     IN  PXENVBD_REQUEST         Request
     )
 {
-    NTSTATUS        status;
     ULONG           Index;
     ULONG           NrSegments = 0;
-    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
 
     for (Index = 0;
             Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
             NrSegments < Request->NrSegments;
                 ++Index) {
-        Request->Pages[Index] = PdoGetIndirect(Pdo);
-        if (Request->Pages[Index] == NULL)
-            goto fail1;
+        PXENVBD_INDIRECT    Indirect;
 
-        status = GranterGet(Granter,
-                            __Virt2Pfn(Request->Pages[Index]),
-                            TRUE,
-                            &Request->Grants[Index]);
-        if (!NT_SUCCESS(status))
-            goto fail2;
+        Indirect = PdoGetIndirect(Pdo);
+        if (Indirect == NULL)
+            goto fail1;
+        InsertTailList(&Request->Indirects, &Indirect->Entry);
 
         NrSegments += XENVBD_MAX_SEGMENTS_PER_PAGE;
     }
 
     return TRUE;
 
-fail2:
 fail1:
     return FALSE;
 }
@@ -2583,7 +2603,7 @@ PdoCreate(
 
     __LookasideInit(&Pdo->RequestList, sizeof(XENVBD_REQUEST), REQUEST_POOL_TAG);
     __LookasideInit(&Pdo->SegmentList, sizeof(XENVBD_SEGMENT), SEGMENT_POOL_TAG);
-    __LookasideInit(&Pdo->IndirectList, PAGE_SIZE, INDIRECT_POOL_TAG);
+    __LookasideInit(&Pdo->IndirectList, sizeof(XENVBD_INDIRECT), INDIRECT_POOL_TAG);
 
     Status = PdoD3ToD0(Pdo);
     if (!NT_SUCCESS(Status))
diff --git a/src/xenvbd/srbext.h b/src/xenvbd/srbext.h
index 6550b72..6b41475 100644
--- a/src/xenvbd/srbext.h
+++ b/src/xenvbd/srbext.h
@@ -48,6 +48,14 @@ typedef struct _BLKIF_SEGMENT {
 
 #define XENVBD_MAX_SEGMENTS_PER_PAGE    (PAGE_SIZE / sizeof(BLKIF_SEGMENT))
 
+// Internal indirect context
+typedef struct _XENVBD_INDIRECT {
+    LIST_ENTRY              Entry;
+    PBLKIF_SEGMENT          Page;
+    PVOID                   Grant;
+    PMDL                    Mdl;
+} XENVBD_INDIRECT, *PXENVBD_INDIRECT;
+
 // Internal segment context
 typedef struct _XENVBD_SEGMENT {
     LIST_ENTRY              Entry;
@@ -74,10 +82,7 @@ typedef struct _XENVBD_REQUEST {
 
     ULONG64                 FirstSector;
     ULONG64                 NrSectors;  // BLKIF_OP_DISCARD only
-
-    // BLKIF_OP_{READ/WRITE} with NrSegments > 11 only
-    PVOID                   Pages[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST];
-    PVOID                   Grants[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST];
+    LIST_ENTRY              Indirects;  // BLKIF_OP_{READ/WRITE} with NrSegments > 11 only
 } XENVBD_REQUEST, *PXENVBD_REQUEST;
 
 // SRBExtension - context for SRBs
-- 
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 Tue Oct 27 11:16:03 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 11:16:03 +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 1Zr2EV-0003Ea-9z; Tue, 27 Oct 2015 11:16:03 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=735ca0e81=owen.smith@citrix.com>)
	id 1Zr2EU-0003DI-1I
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 11:16:02 +0000
Received: from [193.109.254.147] by server-13.bemta-14.messagelabs.com id
	24/B3-12371-0FC5F265; Tue, 27 Oct 2015 11:16:00 +0000
X-Env-Sender: prvs=735ca0e81=owen.smith@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1445944558!50420260!1
X-Originating-IP: [66.165.176.89]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20730 invoked from network); 27 Oct 2015 11:15:59 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2015 11:15:59 -0000
X-IronPort-AV: E=Sophos;i="5.20,204,1444694400"; d="scan'208";a="308442328"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 27 Oct 2015 11:15:46 +0000
Message-ID: <1445944546-21500-9-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA2
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 8/8] Rework indirect context structure
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

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/blockring.c | 48 ++++++++++++++++-----------------
 src/xenvbd/pdo.c       | 72 ++++++++++++++++++++++++++++++++------------------
 src/xenvbd/srbext.h    | 13 ++++++---
 3 files changed, 79 insertions(+), 54 deletions(-)

diff --git a/src/xenvbd/blockring.c b/src/xenvbd/blockring.c
index 28f1393..6ca9cb2 100644
--- a/src/xenvbd/blockring.c
+++ b/src/xenvbd/blockring.c
@@ -152,9 +152,10 @@ __BlockRingInsert(
     case BLKIF_OP_WRITE:
         if (Request->NrSegments > BLKIF_MAX_SEGMENTS_PER_REQUEST) {
             // Indirect
-            ULONG                       PageIndex;
-            ULONG                       SegmentIndex;
-            PLIST_ENTRY                 Entry;
+            ULONG                       PageIdx;
+            ULONG                       SegIdx;
+            PLIST_ENTRY                 PageEntry;
+            PLIST_ENTRY                 SegEntry;
             blkif_request_indirect_t*   req_indirect;
 
             req_indirect = (blkif_request_indirect_t*)req;
@@ -165,29 +166,28 @@ __BlockRingInsert(
             req_indirect->sector_number     = Request->FirstSector;
             req_indirect->handle            = (USHORT)BlockRing->DeviceId;
 
-            for (PageIndex = 0, SegmentIndex = 0, Entry = Request->Segments.Flink;
-                    PageIndex < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
-                    Entry != &Request->Segments;
-                        Entry = Entry->Flink) {
-                PBLKIF_SEGMENT  Indirect = Request->Pages[PageIndex];
-                PXENVBD_SEGMENT Segment = CONTAINING_RECORD(Entry, XENVBD_SEGMENT, Entry);
-
-                Indirect[SegmentIndex].GrantRef = GranterReference(Granter, Segment->Grant);
-                Indirect[SegmentIndex].First    = Segment->FirstSector;
-                Indirect[SegmentIndex].Last     = Segment->LastSector;
-
-                ++SegmentIndex;
-                if (SegmentIndex >= XENVBD_MAX_SEGMENTS_PER_PAGE) {
-                    ++PageIndex;
-                    SegmentIndex = 0;
+            for (PageIdx = 0,
+                 PageEntry = Request->Indirects.Flink,
+                 SegEntry = Request->Segments.Flink;
+                    PageIdx < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
+                    PageEntry != &Request->Indirects &&
+                    SegEntry != &Request->Segments;
+                        ++PageIdx, PageEntry = PageEntry->Flink) {
+                PXENVBD_INDIRECT Page = CONTAINING_RECORD(PageEntry, XENVBD_INDIRECT, Entry);
+
+                req_indirect->indirect_grefs[PageIdx] = GranterReference(Granter, Page->Grant);
+
+                for (SegIdx = 0;
+                        SegIdx < XENVBD_MAX_SEGMENTS_PER_PAGE &&
+                        SegEntry != &Request->Segments;
+                            ++SegIdx, SegEntry = SegEntry->Flink) {
+                    PXENVBD_SEGMENT Segment = CONTAINING_RECORD(SegEntry, XENVBD_SEGMENT, Entry);
+
+                    Page->Page[SegIdx].GrantRef = GranterReference(Granter, Segment->Grant);
+                    Page->Page[SegIdx].First    = Segment->FirstSector;
+                    Page->Page[SegIdx].Last     = Segment->LastSector;
                 }
             }
-            for (PageIndex = 0;
-                    PageIndex < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
-                    Request->Grants[PageIndex] != NULL;
-                        ++PageIndex) {
-                req_indirect->indirect_grefs[PageIndex] = GranterReference(Granter, Request->Grants[PageIndex]);
-            }
         } else {
             // Direct
             ULONG           Index;
diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index e8d94cb..3c429b2 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -567,20 +567,38 @@ PdoSectorSize(
 }
 
 //=============================================================================
-static PVOID
+static PXENVBD_INDIRECT
 PdoGetIndirect(
     IN  PXENVBD_PDO             Pdo
     )
 {
-    PVOID                       Indirect;
+    PXENVBD_INDIRECT    Indirect;
+    NTSTATUS            status;
+    PXENVBD_GRANTER     Granter = FrontendGetGranter(Pdo->Frontend);
 
     Indirect = __LookasideAlloc(&Pdo->IndirectList);
     if (Indirect == NULL)
         goto fail1;
 
-    RtlZeroMemory(Indirect, PAGE_SIZE);
+    RtlZeroMemory(Indirect, sizeof(XENVBD_INDIRECT));
+
+    Indirect->Page = __AllocPages(PAGE_SIZE, &Indirect->Mdl);
+    if (Indirect->Page == NULL)
+        goto fail2;
+
+    status = GranterGet(Granter,
+                        MmGetMdlPfnArray(Indirect->Mdl)[0],
+                        TRUE,
+                        &Indirect->Grant);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
     return Indirect;
 
+fail3:
+    __FreePages(Indirect->Page, Indirect->Mdl);
+fail2:
+    __LookasideFree(&Pdo->IndirectList, Indirect);
 fail1:
     return NULL;
 }
@@ -588,10 +606,17 @@ fail1:
 static VOID
 PdoPutIndirect(
     IN  PXENVBD_PDO             Pdo,
-    IN  PVOID                   Indirect
+    IN  PXENVBD_INDIRECT        Indirect
     )
 {
-    RtlZeroMemory(Indirect, PAGE_SIZE);
+    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
+
+    if (Indirect->Grant)
+        GranterPut(Granter, Indirect->Grant);
+    if (Indirect->Page)
+        __FreePages(Indirect->Page, Indirect->Mdl);
+
+    RtlZeroMemory(Indirect, sizeof(XENVBD_INDIRECT));
     __LookasideFree(&Pdo->IndirectList, Indirect);
 }
 
@@ -648,6 +673,7 @@ PdoGetRequest(
     RtlZeroMemory(Request, sizeof(XENVBD_REQUEST));
     Request->Id = (ULONG)InterlockedIncrement((PLONG)&Pdo->NextTag);
     InitializeListHead(&Request->Segments);
+    InitializeListHead(&Request->Indirects);
 
     return Request;
 
@@ -661,11 +687,9 @@ PdoPutRequest(
     IN  PXENVBD_REQUEST         Request
     )
 {
-    ULONG           Index;
-    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
+    PLIST_ENTRY     Entry;
 
     for (;;) {
-        PLIST_ENTRY     Entry;
         PXENVBD_SEGMENT Segment;
 
         Entry = RemoveHeadList(&Request->Segments);
@@ -675,11 +699,14 @@ PdoPutRequest(
         PdoPutSegment(Pdo, Segment);
     }
 
-    for (Index = 0; Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST; ++Index) {
-        if (Request->Grants[Index])
-            GranterPut(Granter, Request->Grants[Index]);
-        if (Request->Pages[Index])
-            PdoPutIndirect(Pdo, Request->Pages[Index]);
+    for (;;) {
+        PXENVBD_INDIRECT    Indirect;
+
+        Entry = RemoveHeadList(&Request->Indirects);
+        if (Entry == &Request->Indirects)
+            break;
+        Indirect = CONTAINING_RECORD(Entry, XENVBD_INDIRECT, Entry);
+        PdoPutIndirect(Pdo, Indirect);
     }
 
     RtlZeroMemory(Request, sizeof(XENVBD_REQUEST));
@@ -1052,32 +1079,25 @@ PrepareBlkifIndirect(
     IN  PXENVBD_REQUEST         Request
     )
 {
-    NTSTATUS        status;
     ULONG           Index;
     ULONG           NrSegments = 0;
-    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
 
     for (Index = 0;
             Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
             NrSegments < Request->NrSegments;
                 ++Index) {
-        Request->Pages[Index] = PdoGetIndirect(Pdo);
-        if (Request->Pages[Index] == NULL)
-            goto fail1;
+        PXENVBD_INDIRECT    Indirect;
 
-        status = GranterGet(Granter,
-                            __Virt2Pfn(Request->Pages[Index]),
-                            TRUE,
-                            &Request->Grants[Index]);
-        if (!NT_SUCCESS(status))
-            goto fail2;
+        Indirect = PdoGetIndirect(Pdo);
+        if (Indirect == NULL)
+            goto fail1;
+        InsertTailList(&Request->Indirects, &Indirect->Entry);
 
         NrSegments += XENVBD_MAX_SEGMENTS_PER_PAGE;
     }
 
     return TRUE;
 
-fail2:
 fail1:
     return FALSE;
 }
@@ -2583,7 +2603,7 @@ PdoCreate(
 
     __LookasideInit(&Pdo->RequestList, sizeof(XENVBD_REQUEST), REQUEST_POOL_TAG);
     __LookasideInit(&Pdo->SegmentList, sizeof(XENVBD_SEGMENT), SEGMENT_POOL_TAG);
-    __LookasideInit(&Pdo->IndirectList, PAGE_SIZE, INDIRECT_POOL_TAG);
+    __LookasideInit(&Pdo->IndirectList, sizeof(XENVBD_INDIRECT), INDIRECT_POOL_TAG);
 
     Status = PdoD3ToD0(Pdo);
     if (!NT_SUCCESS(Status))
diff --git a/src/xenvbd/srbext.h b/src/xenvbd/srbext.h
index 6550b72..6b41475 100644
--- a/src/xenvbd/srbext.h
+++ b/src/xenvbd/srbext.h
@@ -48,6 +48,14 @@ typedef struct _BLKIF_SEGMENT {
 
 #define XENVBD_MAX_SEGMENTS_PER_PAGE    (PAGE_SIZE / sizeof(BLKIF_SEGMENT))
 
+// Internal indirect context
+typedef struct _XENVBD_INDIRECT {
+    LIST_ENTRY              Entry;
+    PBLKIF_SEGMENT          Page;
+    PVOID                   Grant;
+    PMDL                    Mdl;
+} XENVBD_INDIRECT, *PXENVBD_INDIRECT;
+
 // Internal segment context
 typedef struct _XENVBD_SEGMENT {
     LIST_ENTRY              Entry;
@@ -74,10 +82,7 @@ typedef struct _XENVBD_REQUEST {
 
     ULONG64                 FirstSector;
     ULONG64                 NrSectors;  // BLKIF_OP_DISCARD only
-
-    // BLKIF_OP_{READ/WRITE} with NrSegments > 11 only
-    PVOID                   Pages[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST];
-    PVOID                   Grants[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST];
+    LIST_ENTRY              Indirects;  // BLKIF_OP_{READ/WRITE} with NrSegments > 11 only
 } XENVBD_REQUEST, *PXENVBD_REQUEST;
 
 // SRBExtension - context for SRBs
-- 
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 Tue Oct 27 11:16:04 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 11:16: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 1Zr2EW-0003FP-BQ; Tue, 27 Oct 2015 11:16:04 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=735ca0e81=owen.smith@citrix.com>)
	id 1Zr2EU-0003DT-Bt
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 11:16:02 +0000
Received: from [85.158.137.68] by server-3.bemta-3.messagelabs.com id
	7C/F3-01753-1FC5F265; Tue, 27 Oct 2015 11:16:01 +0000
X-Env-Sender: prvs=735ca0e81=owen.smith@citrix.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1445944559!11036676!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 10186 invoked from network); 27 Oct 2015 11:16:00 -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 Oct 2015 11:16:00 -0000
X-IronPort-AV: E=Sophos;i="5.20,204,1444694400"; d="scan'208";a="313676556"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 27 Oct 2015 11:15:41 +0000
Message-ID: <1445944546-21500-4-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 3/8] Refactor - hide default Pnp/Power
	function pointers
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

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/driver.c | 32 +++++++++++++++++++++++++-------
 src/xenvbd/driver.h | 12 ++++++++++++
 src/xenvbd/fdo.c    | 14 +++++---------
 src/xenvbd/pdo.c    |  4 +---
 4 files changed, 43 insertions(+), 19 deletions(-)

diff --git a/src/xenvbd/driver.c b/src/xenvbd/driver.c
index 2a41c8c..2f13ba6 100644
--- a/src/xenvbd/driver.c
+++ b/src/xenvbd/driver.c
@@ -208,10 +208,28 @@ __DriverParseParameterKey(
 }
 
 //=============================================================================
+static PDRIVER_DISPATCH     StorPortDispatchPnp;
+static PDRIVER_DISPATCH     StorPortDispatchPower;
+static PDRIVER_UNLOAD       StorPortDriverUnload;
+
+NTSTATUS
+DriverDispatchPnp(
+    IN  PDEVICE_OBJECT  DeviceObject,
+    IN  PIRP            Irp
+    )
+{
+    return StorPortDispatchPnp(DeviceObject, Irp);
+}
+
+NTSTATUS
+DriverDispatchPower(
+    IN  PDEVICE_OBJECT  DeviceObject,
+    IN  PIRP            Irp
+    )
+{
+    return StorPortDispatchPower(DeviceObject, Irp);
+}
 
-PDRIVER_DISPATCH     StorPortDispatchPnp;
-PDRIVER_DISPATCH     StorPortDispatchPower;
-PDRIVER_UNLOAD       StorPortDriverUnload;
 //=============================================================================
 // Fdo Device Extension management
 static PXENVBD_FDO              __XenvbdFdo;
@@ -298,7 +316,7 @@ DriverMapPdo(
         }
     }
     KeReleaseSpinLock(&__XenvbdLock, Irql);
-    Status = StorPortDispatchPnp(DeviceObject, Irp);
+    Status = DriverDispatchPnp(DeviceObject, Irp);
 
 done:
     return Status;
@@ -555,7 +573,7 @@ DispatchPnp(
     case IS_NULL:
     default:
         Warning("DeviceObject 0x%p is not FDO (0x%p) or a PDO\n", DeviceObject, __XenvbdFdo);
-        Status = StorPortDispatchPnp(DeviceObject, Irp);
+        Status = DriverDispatchPnp(DeviceObject, Irp);
         break;
     }
 
@@ -589,13 +607,13 @@ DispatchPower(
         if (Pdo) {
             PdoDereference(Pdo); // drops Pdo reference
         }
-        Status = StorPortDispatchPower(DeviceObject, Irp);
+        Status = DriverDispatchPower(DeviceObject, Irp);
         break;
 
     case IS_NULL:
     default:
         Warning("DeviceObject 0x%p is not FDO (0x%p) or a PDO\n", DeviceObject, __XenvbdFdo);
-        Status = StorPortDispatchPower(DeviceObject, Irp);
+        Status = DriverDispatchPower(DeviceObject, Irp);
         break;
     }
 
diff --git a/src/xenvbd/driver.h b/src/xenvbd/driver.h
index d59f053..560dd4e 100644
--- a/src/xenvbd/driver.h
+++ b/src/xenvbd/driver.h
@@ -59,6 +59,18 @@ extern XENVBD_PARAMETERS    DriverParameters;
 
 extern HANDLE               DriverStatusKey;
 
+extern NTSTATUS
+DriverDispatchPnp(
+    IN  PDEVICE_OBJECT  DeviceObject,
+    IN  PIRP            Irp
+    );
+
+extern NTSTATUS
+DriverDispatchPower(
+    IN  PDEVICE_OBJECT  DeviceObject,
+    IN  PIRP            Irp
+    );
+
 // Fdo Device Extension management
 extern VOID
 DriverLinkFdo(
diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
index 82b7fb6..724d8ea 100644
--- a/src/xenvbd/fdo.c
+++ b/src/xenvbd/fdo.c
@@ -98,8 +98,6 @@ struct _XENVBD_FDO {
     LONG                        TotalSrbs;
 };
 
-extern PDRIVER_DISPATCH StorPortDispatchPower;
-
 //=============================================================================
 static FORCEINLINE BOOLEAN
 __FdoSetDevicePowerState(
@@ -1215,7 +1213,7 @@ FdoDevicePower(
             break;
         }
         FdoDereference(Fdo);
-        Status = StorPortDispatchPower(Fdo->DeviceObject, Irp);
+        Status = DriverDispatchPower(Fdo->DeviceObject, Irp);
         if (!NT_SUCCESS(Status)) {
             Warning("StorPort failed PowerIRP with %08x\n", Status);
         }
@@ -1644,8 +1642,6 @@ FdoStartIo(
 
 //=============================================================================
 // PnP Handler
-extern PDRIVER_DISPATCH StorPortDispatchPnp;
-
 __checkReturn
 NTSTATUS
 FdoDispatchPnp(
@@ -1699,7 +1695,7 @@ FdoDispatchPnp(
         break;
     }
 
-    Status = StorPortDispatchPnp(DeviceObject, Irp);
+    Status = DriverDispatchPnp(DeviceObject, Irp);
     if (!NT_SUCCESS(Status)) {
         Verbose("%02x:%s -> %08x\n", Minor, PnpMinorFunctionName(Minor), Status);
     }
@@ -1847,7 +1843,7 @@ FdoMapDeviceObjectToPdo(
     ExFreePool(String);
 
 done:
-    Status = StorPortDispatchPnp(DeviceObject, Irp);;
+    Status = DriverDispatchPnp(DeviceObject, Irp);;
     if (!NT_SUCCESS(Status)) {
         Verbose("%02x:%s -> %08x\n", Minor, PnpMinorFunctionName(Minor), Status);
     }
@@ -1876,7 +1872,7 @@ FdoDispatchPower(
         if (Fdo->DevicePowerThread == NULL) {
             Verbose("DevicePower IRP before DevicePowerThread ready\n");
             FdoDereference(Fdo);
-            status = StorPortDispatchPower(DeviceObject, Irp);
+            status = DriverDispatchPower(DeviceObject, Irp);
             break;
         }
 
@@ -1894,7 +1890,7 @@ FdoDispatchPower(
     case SystemPowerState:
     default:
         FdoDereference(Fdo);
-        status = StorPortDispatchPower(DeviceObject, Irp);
+        status = DriverDispatchPower(DeviceObject, Irp);
         break;
     }
 
diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index 9387742..c0447db 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -2239,8 +2239,6 @@ PdoSrbPnp(
 
 //=============================================================================
 // PnP Handler
-extern PDRIVER_DISPATCH StorPortDispatchPnp;
-
 static FORCEINLINE VOID
 __PdoDeviceUsageNotification(
     __in PXENVBD_PDO             Pdo,
@@ -2419,7 +2417,7 @@ PdoDispatchPnp(
         break;
     }
     PdoDereference(Pdo);
-    Status = StorPortDispatchPnp(DeviceObject, Irp);
+    Status = DriverDispatchPnp(DeviceObject, Irp);
     if (!NT_SUCCESS(Status)) {
         Verbose("Target[%d] : %02x:%s -> %08x\n", TargetId, Minor, PnpMinorFunctionName(Minor), Status);
     }
-- 
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 Tue Oct 27 11:16:04 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 11:16: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 1Zr2EW-0003FP-BQ; Tue, 27 Oct 2015 11:16:04 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=735ca0e81=owen.smith@citrix.com>)
	id 1Zr2EU-0003DT-Bt
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 11:16:02 +0000
Received: from [85.158.137.68] by server-3.bemta-3.messagelabs.com id
	7C/F3-01753-1FC5F265; Tue, 27 Oct 2015 11:16:01 +0000
X-Env-Sender: prvs=735ca0e81=owen.smith@citrix.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1445944559!11036676!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 10186 invoked from network); 27 Oct 2015 11:16:00 -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 Oct 2015 11:16:00 -0000
X-IronPort-AV: E=Sophos;i="5.20,204,1444694400"; d="scan'208";a="313676556"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 27 Oct 2015 11:15:41 +0000
Message-ID: <1445944546-21500-4-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 3/8] Refactor - hide default Pnp/Power
	function pointers
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

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/driver.c | 32 +++++++++++++++++++++++++-------
 src/xenvbd/driver.h | 12 ++++++++++++
 src/xenvbd/fdo.c    | 14 +++++---------
 src/xenvbd/pdo.c    |  4 +---
 4 files changed, 43 insertions(+), 19 deletions(-)

diff --git a/src/xenvbd/driver.c b/src/xenvbd/driver.c
index 2a41c8c..2f13ba6 100644
--- a/src/xenvbd/driver.c
+++ b/src/xenvbd/driver.c
@@ -208,10 +208,28 @@ __DriverParseParameterKey(
 }
 
 //=============================================================================
+static PDRIVER_DISPATCH     StorPortDispatchPnp;
+static PDRIVER_DISPATCH     StorPortDispatchPower;
+static PDRIVER_UNLOAD       StorPortDriverUnload;
+
+NTSTATUS
+DriverDispatchPnp(
+    IN  PDEVICE_OBJECT  DeviceObject,
+    IN  PIRP            Irp
+    )
+{
+    return StorPortDispatchPnp(DeviceObject, Irp);
+}
+
+NTSTATUS
+DriverDispatchPower(
+    IN  PDEVICE_OBJECT  DeviceObject,
+    IN  PIRP            Irp
+    )
+{
+    return StorPortDispatchPower(DeviceObject, Irp);
+}
 
-PDRIVER_DISPATCH     StorPortDispatchPnp;
-PDRIVER_DISPATCH     StorPortDispatchPower;
-PDRIVER_UNLOAD       StorPortDriverUnload;
 //=============================================================================
 // Fdo Device Extension management
 static PXENVBD_FDO              __XenvbdFdo;
@@ -298,7 +316,7 @@ DriverMapPdo(
         }
     }
     KeReleaseSpinLock(&__XenvbdLock, Irql);
-    Status = StorPortDispatchPnp(DeviceObject, Irp);
+    Status = DriverDispatchPnp(DeviceObject, Irp);
 
 done:
     return Status;
@@ -555,7 +573,7 @@ DispatchPnp(
     case IS_NULL:
     default:
         Warning("DeviceObject 0x%p is not FDO (0x%p) or a PDO\n", DeviceObject, __XenvbdFdo);
-        Status = StorPortDispatchPnp(DeviceObject, Irp);
+        Status = DriverDispatchPnp(DeviceObject, Irp);
         break;
     }
 
@@ -589,13 +607,13 @@ DispatchPower(
         if (Pdo) {
             PdoDereference(Pdo); // drops Pdo reference
         }
-        Status = StorPortDispatchPower(DeviceObject, Irp);
+        Status = DriverDispatchPower(DeviceObject, Irp);
         break;
 
     case IS_NULL:
     default:
         Warning("DeviceObject 0x%p is not FDO (0x%p) or a PDO\n", DeviceObject, __XenvbdFdo);
-        Status = StorPortDispatchPower(DeviceObject, Irp);
+        Status = DriverDispatchPower(DeviceObject, Irp);
         break;
     }
 
diff --git a/src/xenvbd/driver.h b/src/xenvbd/driver.h
index d59f053..560dd4e 100644
--- a/src/xenvbd/driver.h
+++ b/src/xenvbd/driver.h
@@ -59,6 +59,18 @@ extern XENVBD_PARAMETERS    DriverParameters;
 
 extern HANDLE               DriverStatusKey;
 
+extern NTSTATUS
+DriverDispatchPnp(
+    IN  PDEVICE_OBJECT  DeviceObject,
+    IN  PIRP            Irp
+    );
+
+extern NTSTATUS
+DriverDispatchPower(
+    IN  PDEVICE_OBJECT  DeviceObject,
+    IN  PIRP            Irp
+    );
+
 // Fdo Device Extension management
 extern VOID
 DriverLinkFdo(
diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
index 82b7fb6..724d8ea 100644
--- a/src/xenvbd/fdo.c
+++ b/src/xenvbd/fdo.c
@@ -98,8 +98,6 @@ struct _XENVBD_FDO {
     LONG                        TotalSrbs;
 };
 
-extern PDRIVER_DISPATCH StorPortDispatchPower;
-
 //=============================================================================
 static FORCEINLINE BOOLEAN
 __FdoSetDevicePowerState(
@@ -1215,7 +1213,7 @@ FdoDevicePower(
             break;
         }
         FdoDereference(Fdo);
-        Status = StorPortDispatchPower(Fdo->DeviceObject, Irp);
+        Status = DriverDispatchPower(Fdo->DeviceObject, Irp);
         if (!NT_SUCCESS(Status)) {
             Warning("StorPort failed PowerIRP with %08x\n", Status);
         }
@@ -1644,8 +1642,6 @@ FdoStartIo(
 
 //=============================================================================
 // PnP Handler
-extern PDRIVER_DISPATCH StorPortDispatchPnp;
-
 __checkReturn
 NTSTATUS
 FdoDispatchPnp(
@@ -1699,7 +1695,7 @@ FdoDispatchPnp(
         break;
     }
 
-    Status = StorPortDispatchPnp(DeviceObject, Irp);
+    Status = DriverDispatchPnp(DeviceObject, Irp);
     if (!NT_SUCCESS(Status)) {
         Verbose("%02x:%s -> %08x\n", Minor, PnpMinorFunctionName(Minor), Status);
     }
@@ -1847,7 +1843,7 @@ FdoMapDeviceObjectToPdo(
     ExFreePool(String);
 
 done:
-    Status = StorPortDispatchPnp(DeviceObject, Irp);;
+    Status = DriverDispatchPnp(DeviceObject, Irp);;
     if (!NT_SUCCESS(Status)) {
         Verbose("%02x:%s -> %08x\n", Minor, PnpMinorFunctionName(Minor), Status);
     }
@@ -1876,7 +1872,7 @@ FdoDispatchPower(
         if (Fdo->DevicePowerThread == NULL) {
             Verbose("DevicePower IRP before DevicePowerThread ready\n");
             FdoDereference(Fdo);
-            status = StorPortDispatchPower(DeviceObject, Irp);
+            status = DriverDispatchPower(DeviceObject, Irp);
             break;
         }
 
@@ -1894,7 +1890,7 @@ FdoDispatchPower(
     case SystemPowerState:
     default:
         FdoDereference(Fdo);
-        status = StorPortDispatchPower(DeviceObject, Irp);
+        status = DriverDispatchPower(DeviceObject, Irp);
         break;
     }
 
diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index 9387742..c0447db 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -2239,8 +2239,6 @@ PdoSrbPnp(
 
 //=============================================================================
 // PnP Handler
-extern PDRIVER_DISPATCH StorPortDispatchPnp;
-
 static FORCEINLINE VOID
 __PdoDeviceUsageNotification(
     __in PXENVBD_PDO             Pdo,
@@ -2419,7 +2417,7 @@ PdoDispatchPnp(
         break;
     }
     PdoDereference(Pdo);
-    Status = StorPortDispatchPnp(DeviceObject, Irp);
+    Status = DriverDispatchPnp(DeviceObject, Irp);
     if (!NT_SUCCESS(Status)) {
         Verbose("Target[%d] : %02x:%s -> %08x\n", TargetId, Minor, PnpMinorFunctionName(Minor), Status);
     }
-- 
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 Tue Oct 27 11:16:04 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 11:16: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 1Zr2EW-0003FW-Cb; Tue, 27 Oct 2015 11:16:04 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=735ca0e81=owen.smith@citrix.com>)
	id 1Zr2EU-0003DV-Ih
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 11:16:02 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	63/93-12889-1FC5F265; Tue, 27 Oct 2015 11:16:01 +0000
X-Env-Sender: prvs=735ca0e81=owen.smith@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1445944557!35264514!4
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 19227 invoked from network); 27 Oct 2015 11:16:00 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2015 11:16:00 -0000
X-IronPort-AV: E=Sophos;i="5.20,204,1444694400"; d="scan'208";a="313676557"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 27 Oct 2015 11:15:42 +0000
Message-ID: <1445944546-21500-5-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 4/8] Remove PdoPnpSrb,
	since StorPort doesn't call for targets
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

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/fdo.c | 18 ------------------
 src/xenvbd/pdo.c | 27 ---------------------------
 src/xenvbd/pdo.h |  6 ------
 3 files changed, 51 deletions(-)

diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
index 724d8ea..593875e 100644
--- a/src/xenvbd/fdo.c
+++ b/src/xenvbd/fdo.c
@@ -1565,23 +1565,6 @@ FdoFindAdapter(
     return SP_RETURN_FOUND;
 }
 
-static FORCEINLINE VOID
-__FdoSrbPnp(
-    __in PXENVBD_FDO                 Fdo,
-    __in PSCSI_PNP_REQUEST_BLOCK     Srb
-    )
-{
-    if (!(Srb->SrbPnPFlags & SRB_PNP_FLAGS_ADAPTER_REQUEST)) {
-        PXENVBD_PDO     Pdo;
-
-        Pdo = __FdoGetPdo(Fdo, Srb->TargetId);
-        if (Pdo) {
-            PdoSrbPnp(Pdo, Srb);
-            PdoDereference(Pdo);
-        }
-    }
-}
-
 BOOLEAN 
 FdoBuildIo(
     __in PXENVBD_FDO                 Fdo,
@@ -1600,7 +1583,6 @@ FdoBuildIo(
 
         // dont pass to StartIo
     case SRB_FUNCTION_PNP:
-        __FdoSrbPnp(Fdo, (PSCSI_PNP_REQUEST_BLOCK)Srb);
         Srb->SrbStatus = SRB_STATUS_SUCCESS;
         break;
     case SRB_FUNCTION_ABORT_COMMAND:
diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index c0447db..172fa67 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -2210,33 +2210,6 @@ PdoStartIo(
     }
 }
 
-VOID
-PdoSrbPnp(
-    __in PXENVBD_PDO             Pdo,
-    __in PSCSI_PNP_REQUEST_BLOCK Srb
-    )
-{
-    switch (Srb->PnPAction) {
-    case StorQueryCapabilities: {
-        PSTOR_DEVICE_CAPABILITIES DeviceCaps = Srb->DataBuffer;
-        PXENVBD_CAPS    Caps = FrontendGetCaps(Pdo->Frontend);
-
-        if (Caps->Removable)
-            DeviceCaps->Removable = 1;
-        if (Caps->Removable)
-            DeviceCaps->EjectSupported = 1;
-        if (Caps->SurpriseRemovable)
-            DeviceCaps->SurpriseRemovalOK = 1;
-    
-        DeviceCaps->UniqueID = 1;
-
-        } break;
-
-    default:
-        break;
-    }
-}
-
 //=============================================================================
 // PnP Handler
 static FORCEINLINE VOID
diff --git a/src/xenvbd/pdo.h b/src/xenvbd/pdo.h
index fbd6681..1211174 100644
--- a/src/xenvbd/pdo.h
+++ b/src/xenvbd/pdo.h
@@ -212,12 +212,6 @@ PdoStartIo(
     __in PSCSI_REQUEST_BLOCK     Srb
     );
 
-extern VOID
-PdoSrbPnp(
-    __in PXENVBD_PDO             Pdo,
-    __in PSCSI_PNP_REQUEST_BLOCK Srb
-    );
-
 // PnP Handler
 __checkReturn
 extern NTSTATUS
-- 
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 Tue Oct 27 11:16:04 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 11:16: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 1Zr2EW-0003Fl-E7; Tue, 27 Oct 2015 11:16:04 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=735ca0e81=owen.smith@citrix.com>)
	id 1Zr2EV-0003DI-3j
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 11:16:03 +0000
Received: from [193.109.254.147] by server-13.bemta-14.messagelabs.com id
	D2/C3-12371-2FC5F265; Tue, 27 Oct 2015 11:16:02 +0000
X-Env-Sender: prvs=735ca0e81=owen.smith@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1445944557!35264514!5
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 19664 invoked from network); 27 Oct 2015 11:16:01 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2015 11:16:01 -0000
X-IronPort-AV: E=Sophos;i="5.20,204,1444694400"; d="scan'208";a="313676559"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 27 Oct 2015 11:15:45 +0000
Message-ID: <1445944546-21500-8-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 7/8] Add Get/Put for request,
	segment and indirect(pages)
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

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

diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index 5023a93..e8d94cb 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -567,17 +567,127 @@ PdoSectorSize(
 }
 
 //=============================================================================
+static PVOID
+PdoGetIndirect(
+    IN  PXENVBD_PDO             Pdo
+    )
+{
+    PVOID                       Indirect;
 
-static FORCEINLINE ULONG
-PdoGetTag(
+    Indirect = __LookasideAlloc(&Pdo->IndirectList);
+    if (Indirect == NULL)
+        goto fail1;
+
+    RtlZeroMemory(Indirect, PAGE_SIZE);
+    return Indirect;
+
+fail1:
+    return NULL;
+}
+
+static VOID
+PdoPutIndirect(
+    IN  PXENVBD_PDO             Pdo,
+    IN  PVOID                   Indirect
+    )
+{
+    RtlZeroMemory(Indirect, PAGE_SIZE);
+    __LookasideFree(&Pdo->IndirectList, Indirect);
+}
+
+static PXENVBD_SEGMENT
+PdoGetSegment(
+    IN  PXENVBD_PDO             Pdo
+    )
+{
+    PXENVBD_SEGMENT             Segment;
+
+    Segment = __LookasideAlloc(&Pdo->SegmentList);
+    if (Segment == NULL)
+        goto fail1;
+
+    RtlZeroMemory(Segment, sizeof(XENVBD_SEGMENT));
+    return Segment;
+
+fail1:
+    return NULL;
+}
+
+static VOID
+PdoPutSegment(
+    IN  PXENVBD_PDO             Pdo,
+    IN  PXENVBD_SEGMENT         Segment
+    )
+{
+    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
+
+    if (Segment->Grant)
+        GranterPut(Granter, Segment->Grant);
+
+    if (Segment->BufferId)
+        BufferPut(Segment->BufferId);
+
+    if (Segment->Buffer)
+        MmUnmapLockedPages(Segment->Buffer, &Segment->Mdl);
+
+    RtlZeroMemory(Segment, sizeof(XENVBD_SEGMENT));
+    __LookasideFree(&Pdo->SegmentList, Segment);
+}
+
+static PXENVBD_REQUEST
+PdoGetRequest(
     IN  PXENVBD_PDO             Pdo
     )
 {
-    return (ULONG)InterlockedIncrement((PLONG)&Pdo->NextTag);
+    PXENVBD_REQUEST             Request;
+
+    Request = __LookasideAlloc(&Pdo->RequestList);
+    if (Request == NULL)
+        goto fail1;
+
+    RtlZeroMemory(Request, sizeof(XENVBD_REQUEST));
+    Request->Id = (ULONG)InterlockedIncrement((PLONG)&Pdo->NextTag);
+    InitializeListHead(&Request->Segments);
+
+    return Request;
+
+fail1:
+    return NULL;
+}
+
+static VOID
+PdoPutRequest(
+    IN  PXENVBD_PDO             Pdo,
+    IN  PXENVBD_REQUEST         Request
+    )
+{
+    ULONG           Index;
+    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
+
+    for (;;) {
+        PLIST_ENTRY     Entry;
+        PXENVBD_SEGMENT Segment;
+
+        Entry = RemoveHeadList(&Request->Segments);
+        if (Entry == &Request->Segments)
+            break;
+        Segment = CONTAINING_RECORD(Entry, XENVBD_SEGMENT, Entry);
+        PdoPutSegment(Pdo, Segment);
+    }
+
+    for (Index = 0; Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST; ++Index) {
+        if (Request->Grants[Index])
+            GranterPut(Granter, Request->Grants[Index]);
+        if (Request->Pages[Index])
+            PdoPutIndirect(Pdo, Request->Pages[Index]);
+    }
+
+    RtlZeroMemory(Request, sizeof(XENVBD_REQUEST));
+    __LookasideFree(&Pdo->RequestList, Request);
 }
 
 static FORCEINLINE PXENVBD_REQUEST
-PdoPutTag(
+PdoRequestFromTag(
     IN  PXENVBD_PDO             Pdo,
     IN  ULONG                   Tag
     )
@@ -793,63 +903,6 @@ fail:
 }
 
 static FORCEINLINE VOID
-UnmapSegmentBuffer(
-    IN  PXENVBD_SEGMENT         Segment
-    )
-{
-    MmUnmapLockedPages(Segment->Buffer, &Segment->Mdl);
-    RtlZeroMemory(&Segment->Mdl, sizeof(Segment->Mdl));
-    RtlZeroMemory(Segment->Pfn, sizeof(Segment->Pfn));
-    Segment->Buffer = NULL;
-    Segment->Length = 0;
-}
-
-static FORCEINLINE VOID
-RequestCleanup(
-    IN  PXENVBD_PDO             Pdo,
-    IN  PXENVBD_REQUEST         Request
-    )
-{
-    ULONG           Index;
-    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
-
-    for (;;) {
-        PLIST_ENTRY     Entry;
-        PXENVBD_SEGMENT Segment;
-
-        Entry = RemoveHeadList(&Request->Segments);
-        if (Entry == &Request->Segments)
-            break;
-
-        Segment = CONTAINING_RECORD(Entry, XENVBD_SEGMENT, Entry);
-        --Request->NrSegments;
-
-        if (Segment->Grant)
-            GranterPut(Granter, Segment->Grant);
-        Segment->Grant = NULL;
-
-        if (Segment->BufferId)
-            BufferPut(Segment->BufferId);
-        Segment->BufferId = NULL;
-
-        if (Segment->Buffer)
-            UnmapSegmentBuffer(Segment);
-
-        __LookasideFree(&Pdo->SegmentList, Segment);
-    }
-
-    for (Index = 0; Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST; ++Index) {
-        if (Request->Grants[Index])
-            GranterPut(Granter, Request->Grants[Index]);
-        Request->Grants[Index] = NULL;
-
-        if (Request->Pages[Index])
-            __LookasideFree(&Pdo->IndirectList, Request->Pages[Index]);
-        Request->Pages[Index] = NULL;
-    }
-}
-
-static FORCEINLINE VOID
 RequestCopyOutput(
     __in PXENVBD_REQUEST         Request
     )
@@ -965,7 +1018,7 @@ PrepareBlkifReadWrite(
         PXENVBD_SEGMENT Segment;
         ULONG           SectorsNow;
 
-        Segment = __LookasideAlloc(&Pdo->SegmentList);
+        Segment = PdoGetSegment(Pdo);
         if (Segment == NULL)
             goto fail1;
 
@@ -1008,7 +1061,7 @@ PrepareBlkifIndirect(
             Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
             NrSegments < Request->NrSegments;
                 ++Index) {
-        Request->Pages[Index] = __LookasideAlloc(&Pdo->IndirectList);
+        Request->Pages[Index] = PdoGetIndirect(Pdo);
         if (Request->Pages[Index] == NULL)
             goto fail1;
 
@@ -1085,7 +1138,7 @@ PdoCancelRequestList(
             break;
 
         Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
-        __LookasideFree(&Pdo->RequestList, Request);
+        PdoPutRequest(Pdo, Request);
     }
 }
 
@@ -1114,15 +1167,12 @@ PrepareReadWrite(
         ULONG           SectorsDone = 0;
         PXENVBD_REQUEST Request;
 
-        Request = __LookasideAlloc(&Pdo->RequestList);
+        Request = PdoGetRequest(Pdo);
         if (Request == NULL) 
             goto fail1;
         InsertTailList(&List, &Request->Entry);
         
         Request->Srb    = Srb;
-        Request->Id     = PdoGetTag(Pdo);
-        InitializeListHead(&Request->Segments);
-
         MaxSegments = UseIndirect(Pdo, SectorsLeft);
 
         if (!PrepareBlkifReadWrite(Pdo,
@@ -1168,16 +1218,14 @@ PrepareSyncCache(
     SrbExt->Count = 0;
     Srb->SrbStatus = SRB_STATUS_PENDING;
 
-    Request = __LookasideAlloc(&Pdo->RequestList);
+    Request = PdoGetRequest(Pdo);
     if (Request == NULL)
         goto fail1;
     InsertTailList(&List, &Request->Entry);
     
     Request->Srb        = Srb;
-    Request->Id         = PdoGetTag(Pdo);
     Request->Operation  = BLKIF_OP_WRITE_BARRIER;
     Request->FirstSector = Cdb_LogicalBlock(Srb);
-    InitializeListHead(&Request->Segments);
 
     SrbExt->Count = PdoQueueRequestList(Pdo, &List);
     return TRUE;
@@ -1209,18 +1257,16 @@ PrepareUnmap(
         PUNMAP_BLOCK_DESCRIPTOR Descr = &Unmap->Descriptors[Index];
         PXENVBD_REQUEST         Request;
 
-        Request = __LookasideAlloc(&Pdo->RequestList);
+        Request = PdoGetRequest(Pdo);
         if (Request == NULL)
             goto fail1;
         InsertTailList(&List, &Request->Entry);
 
         Request->Srb            = Srb;
-        Request->Id             = PdoGetTag(Pdo);
         Request->Operation      = BLKIF_OP_DISCARD;
         Request->FirstSector    = _byteswap_uint64(*(PULONG64)Descr->StartingLba);
         Request->NrSectors      = _byteswap_ulong(*(PULONG)Descr->LbaCount);
         Request->Flags          = 0;
-        InitializeListHead(&Request->Segments);
     }
 
     SrbExt->Count = PdoQueueRequestList(Pdo, &List);
@@ -1296,8 +1342,7 @@ __PdoPauseDataPath(
         Verbose("Target[%d] : PreparedReq 0x%p -> FAILED\n", PdoGetTargetId(Pdo), Request);
 
         SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
-        RequestCleanup(Pdo, Request);
-        __LookasideFree(&Pdo->RequestList, Request);
+        PdoPutRequest(Pdo, Request);
 
         if (InterlockedDecrement(&SrbExt->Count) == 0) {
             SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
@@ -1460,7 +1505,7 @@ PdoCompleteResponse(
     PSCSI_REQUEST_BLOCK Srb;
     PXENVBD_SRBEXT      SrbExt;
 
-    Request = PdoPutTag(Pdo, Tag);
+    Request = PdoRequestFromTag(Pdo, Tag);
     if (Request == NULL)
         return;
 
@@ -1489,8 +1534,7 @@ PdoCompleteResponse(
         break;
     }
 
-    RequestCleanup(Pdo, Request);
-    __LookasideFree(&Pdo->RequestList, Request);
+    PdoPutRequest(Pdo, Request);
 
     // complete srb
     if (InterlockedDecrement(&SrbExt->Count) == 0) {
@@ -1529,8 +1573,7 @@ PdoPreResume(
         SrbExt = GetSrbExt(Request->Srb);
 
         BlockRingAbort(BlockRing, Request);
-        RequestCleanup(Pdo, Request);
-        __LookasideFree(&Pdo->RequestList, Request);
+        PdoPutRequest(Pdo, Request);
 
         if (InterlockedDecrement(&SrbExt->Count) == 0) {
             InsertTailList(&List, &SrbExt->Entry);
@@ -1547,8 +1590,7 @@ PdoPreResume(
         Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
         SrbExt = GetSrbExt(Request->Srb);
 
-        RequestCleanup(Pdo, Request);
-        __LookasideFree(&Pdo->RequestList, Request);
+        PdoPutRequest(Pdo, Request);
 
         if (InterlockedDecrement(&SrbExt->Count) == 0) {
             InsertTailList(&List, &SrbExt->Entry);
@@ -2155,8 +2197,7 @@ __PdoCleanupSubmittedReqs(
 
         Verbose("Target[%d] : SubmittedReq 0x%p -> FAILED\n", PdoGetTargetId(Pdo), Request);
 
-        RequestCleanup(Pdo, Request);
-        __LookasideFree(&Pdo->RequestList, Request);
+        PdoPutRequest(Pdo, Request);
 
         if (InterlockedDecrement(&SrbExt->Count) == 0) {
             SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
-- 
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 Tue Oct 27 11:16:04 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 11:16: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 1Zr2EW-0003FW-Cb; Tue, 27 Oct 2015 11:16:04 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=735ca0e81=owen.smith@citrix.com>)
	id 1Zr2EU-0003DV-Ih
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 11:16:02 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	63/93-12889-1FC5F265; Tue, 27 Oct 2015 11:16:01 +0000
X-Env-Sender: prvs=735ca0e81=owen.smith@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1445944557!35264514!4
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 19227 invoked from network); 27 Oct 2015 11:16:00 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2015 11:16:00 -0000
X-IronPort-AV: E=Sophos;i="5.20,204,1444694400"; d="scan'208";a="313676557"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 27 Oct 2015 11:15:42 +0000
Message-ID: <1445944546-21500-5-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 4/8] Remove PdoPnpSrb,
	since StorPort doesn't call for targets
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

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/fdo.c | 18 ------------------
 src/xenvbd/pdo.c | 27 ---------------------------
 src/xenvbd/pdo.h |  6 ------
 3 files changed, 51 deletions(-)

diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
index 724d8ea..593875e 100644
--- a/src/xenvbd/fdo.c
+++ b/src/xenvbd/fdo.c
@@ -1565,23 +1565,6 @@ FdoFindAdapter(
     return SP_RETURN_FOUND;
 }
 
-static FORCEINLINE VOID
-__FdoSrbPnp(
-    __in PXENVBD_FDO                 Fdo,
-    __in PSCSI_PNP_REQUEST_BLOCK     Srb
-    )
-{
-    if (!(Srb->SrbPnPFlags & SRB_PNP_FLAGS_ADAPTER_REQUEST)) {
-        PXENVBD_PDO     Pdo;
-
-        Pdo = __FdoGetPdo(Fdo, Srb->TargetId);
-        if (Pdo) {
-            PdoSrbPnp(Pdo, Srb);
-            PdoDereference(Pdo);
-        }
-    }
-}
-
 BOOLEAN 
 FdoBuildIo(
     __in PXENVBD_FDO                 Fdo,
@@ -1600,7 +1583,6 @@ FdoBuildIo(
 
         // dont pass to StartIo
     case SRB_FUNCTION_PNP:
-        __FdoSrbPnp(Fdo, (PSCSI_PNP_REQUEST_BLOCK)Srb);
         Srb->SrbStatus = SRB_STATUS_SUCCESS;
         break;
     case SRB_FUNCTION_ABORT_COMMAND:
diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index c0447db..172fa67 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -2210,33 +2210,6 @@ PdoStartIo(
     }
 }
 
-VOID
-PdoSrbPnp(
-    __in PXENVBD_PDO             Pdo,
-    __in PSCSI_PNP_REQUEST_BLOCK Srb
-    )
-{
-    switch (Srb->PnPAction) {
-    case StorQueryCapabilities: {
-        PSTOR_DEVICE_CAPABILITIES DeviceCaps = Srb->DataBuffer;
-        PXENVBD_CAPS    Caps = FrontendGetCaps(Pdo->Frontend);
-
-        if (Caps->Removable)
-            DeviceCaps->Removable = 1;
-        if (Caps->Removable)
-            DeviceCaps->EjectSupported = 1;
-        if (Caps->SurpriseRemovable)
-            DeviceCaps->SurpriseRemovalOK = 1;
-    
-        DeviceCaps->UniqueID = 1;
-
-        } break;
-
-    default:
-        break;
-    }
-}
-
 //=============================================================================
 // PnP Handler
 static FORCEINLINE VOID
diff --git a/src/xenvbd/pdo.h b/src/xenvbd/pdo.h
index fbd6681..1211174 100644
--- a/src/xenvbd/pdo.h
+++ b/src/xenvbd/pdo.h
@@ -212,12 +212,6 @@ PdoStartIo(
     __in PSCSI_REQUEST_BLOCK     Srb
     );
 
-extern VOID
-PdoSrbPnp(
-    __in PXENVBD_PDO             Pdo,
-    __in PSCSI_PNP_REQUEST_BLOCK Srb
-    );
-
 // PnP Handler
 __checkReturn
 extern NTSTATUS
-- 
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 Tue Oct 27 11:16:04 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 11:16: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 1Zr2EW-0003Fl-E7; Tue, 27 Oct 2015 11:16:04 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=735ca0e81=owen.smith@citrix.com>)
	id 1Zr2EV-0003DI-3j
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 11:16:03 +0000
Received: from [193.109.254.147] by server-13.bemta-14.messagelabs.com id
	D2/C3-12371-2FC5F265; Tue, 27 Oct 2015 11:16:02 +0000
X-Env-Sender: prvs=735ca0e81=owen.smith@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1445944557!35264514!5
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 19664 invoked from network); 27 Oct 2015 11:16:01 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2015 11:16:01 -0000
X-IronPort-AV: E=Sophos;i="5.20,204,1444694400"; d="scan'208";a="313676559"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 27 Oct 2015 11:15:45 +0000
Message-ID: <1445944546-21500-8-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 7/8] Add Get/Put for request,
	segment and indirect(pages)
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

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

diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index 5023a93..e8d94cb 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -567,17 +567,127 @@ PdoSectorSize(
 }
 
 //=============================================================================
+static PVOID
+PdoGetIndirect(
+    IN  PXENVBD_PDO             Pdo
+    )
+{
+    PVOID                       Indirect;
 
-static FORCEINLINE ULONG
-PdoGetTag(
+    Indirect = __LookasideAlloc(&Pdo->IndirectList);
+    if (Indirect == NULL)
+        goto fail1;
+
+    RtlZeroMemory(Indirect, PAGE_SIZE);
+    return Indirect;
+
+fail1:
+    return NULL;
+}
+
+static VOID
+PdoPutIndirect(
+    IN  PXENVBD_PDO             Pdo,
+    IN  PVOID                   Indirect
+    )
+{
+    RtlZeroMemory(Indirect, PAGE_SIZE);
+    __LookasideFree(&Pdo->IndirectList, Indirect);
+}
+
+static PXENVBD_SEGMENT
+PdoGetSegment(
+    IN  PXENVBD_PDO             Pdo
+    )
+{
+    PXENVBD_SEGMENT             Segment;
+
+    Segment = __LookasideAlloc(&Pdo->SegmentList);
+    if (Segment == NULL)
+        goto fail1;
+
+    RtlZeroMemory(Segment, sizeof(XENVBD_SEGMENT));
+    return Segment;
+
+fail1:
+    return NULL;
+}
+
+static VOID
+PdoPutSegment(
+    IN  PXENVBD_PDO             Pdo,
+    IN  PXENVBD_SEGMENT         Segment
+    )
+{
+    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
+
+    if (Segment->Grant)
+        GranterPut(Granter, Segment->Grant);
+
+    if (Segment->BufferId)
+        BufferPut(Segment->BufferId);
+
+    if (Segment->Buffer)
+        MmUnmapLockedPages(Segment->Buffer, &Segment->Mdl);
+
+    RtlZeroMemory(Segment, sizeof(XENVBD_SEGMENT));
+    __LookasideFree(&Pdo->SegmentList, Segment);
+}
+
+static PXENVBD_REQUEST
+PdoGetRequest(
     IN  PXENVBD_PDO             Pdo
     )
 {
-    return (ULONG)InterlockedIncrement((PLONG)&Pdo->NextTag);
+    PXENVBD_REQUEST             Request;
+
+    Request = __LookasideAlloc(&Pdo->RequestList);
+    if (Request == NULL)
+        goto fail1;
+
+    RtlZeroMemory(Request, sizeof(XENVBD_REQUEST));
+    Request->Id = (ULONG)InterlockedIncrement((PLONG)&Pdo->NextTag);
+    InitializeListHead(&Request->Segments);
+
+    return Request;
+
+fail1:
+    return NULL;
+}
+
+static VOID
+PdoPutRequest(
+    IN  PXENVBD_PDO             Pdo,
+    IN  PXENVBD_REQUEST         Request
+    )
+{
+    ULONG           Index;
+    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
+
+    for (;;) {
+        PLIST_ENTRY     Entry;
+        PXENVBD_SEGMENT Segment;
+
+        Entry = RemoveHeadList(&Request->Segments);
+        if (Entry == &Request->Segments)
+            break;
+        Segment = CONTAINING_RECORD(Entry, XENVBD_SEGMENT, Entry);
+        PdoPutSegment(Pdo, Segment);
+    }
+
+    for (Index = 0; Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST; ++Index) {
+        if (Request->Grants[Index])
+            GranterPut(Granter, Request->Grants[Index]);
+        if (Request->Pages[Index])
+            PdoPutIndirect(Pdo, Request->Pages[Index]);
+    }
+
+    RtlZeroMemory(Request, sizeof(XENVBD_REQUEST));
+    __LookasideFree(&Pdo->RequestList, Request);
 }
 
 static FORCEINLINE PXENVBD_REQUEST
-PdoPutTag(
+PdoRequestFromTag(
     IN  PXENVBD_PDO             Pdo,
     IN  ULONG                   Tag
     )
@@ -793,63 +903,6 @@ fail:
 }
 
 static FORCEINLINE VOID
-UnmapSegmentBuffer(
-    IN  PXENVBD_SEGMENT         Segment
-    )
-{
-    MmUnmapLockedPages(Segment->Buffer, &Segment->Mdl);
-    RtlZeroMemory(&Segment->Mdl, sizeof(Segment->Mdl));
-    RtlZeroMemory(Segment->Pfn, sizeof(Segment->Pfn));
-    Segment->Buffer = NULL;
-    Segment->Length = 0;
-}
-
-static FORCEINLINE VOID
-RequestCleanup(
-    IN  PXENVBD_PDO             Pdo,
-    IN  PXENVBD_REQUEST         Request
-    )
-{
-    ULONG           Index;
-    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
-
-    for (;;) {
-        PLIST_ENTRY     Entry;
-        PXENVBD_SEGMENT Segment;
-
-        Entry = RemoveHeadList(&Request->Segments);
-        if (Entry == &Request->Segments)
-            break;
-
-        Segment = CONTAINING_RECORD(Entry, XENVBD_SEGMENT, Entry);
-        --Request->NrSegments;
-
-        if (Segment->Grant)
-            GranterPut(Granter, Segment->Grant);
-        Segment->Grant = NULL;
-
-        if (Segment->BufferId)
-            BufferPut(Segment->BufferId);
-        Segment->BufferId = NULL;
-
-        if (Segment->Buffer)
-            UnmapSegmentBuffer(Segment);
-
-        __LookasideFree(&Pdo->SegmentList, Segment);
-    }
-
-    for (Index = 0; Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST; ++Index) {
-        if (Request->Grants[Index])
-            GranterPut(Granter, Request->Grants[Index]);
-        Request->Grants[Index] = NULL;
-
-        if (Request->Pages[Index])
-            __LookasideFree(&Pdo->IndirectList, Request->Pages[Index]);
-        Request->Pages[Index] = NULL;
-    }
-}
-
-static FORCEINLINE VOID
 RequestCopyOutput(
     __in PXENVBD_REQUEST         Request
     )
@@ -965,7 +1018,7 @@ PrepareBlkifReadWrite(
         PXENVBD_SEGMENT Segment;
         ULONG           SectorsNow;
 
-        Segment = __LookasideAlloc(&Pdo->SegmentList);
+        Segment = PdoGetSegment(Pdo);
         if (Segment == NULL)
             goto fail1;
 
@@ -1008,7 +1061,7 @@ PrepareBlkifIndirect(
             Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
             NrSegments < Request->NrSegments;
                 ++Index) {
-        Request->Pages[Index] = __LookasideAlloc(&Pdo->IndirectList);
+        Request->Pages[Index] = PdoGetIndirect(Pdo);
         if (Request->Pages[Index] == NULL)
             goto fail1;
 
@@ -1085,7 +1138,7 @@ PdoCancelRequestList(
             break;
 
         Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
-        __LookasideFree(&Pdo->RequestList, Request);
+        PdoPutRequest(Pdo, Request);
     }
 }
 
@@ -1114,15 +1167,12 @@ PrepareReadWrite(
         ULONG           SectorsDone = 0;
         PXENVBD_REQUEST Request;
 
-        Request = __LookasideAlloc(&Pdo->RequestList);
+        Request = PdoGetRequest(Pdo);
         if (Request == NULL) 
             goto fail1;
         InsertTailList(&List, &Request->Entry);
         
         Request->Srb    = Srb;
-        Request->Id     = PdoGetTag(Pdo);
-        InitializeListHead(&Request->Segments);
-
         MaxSegments = UseIndirect(Pdo, SectorsLeft);
 
         if (!PrepareBlkifReadWrite(Pdo,
@@ -1168,16 +1218,14 @@ PrepareSyncCache(
     SrbExt->Count = 0;
     Srb->SrbStatus = SRB_STATUS_PENDING;
 
-    Request = __LookasideAlloc(&Pdo->RequestList);
+    Request = PdoGetRequest(Pdo);
     if (Request == NULL)
         goto fail1;
     InsertTailList(&List, &Request->Entry);
     
     Request->Srb        = Srb;
-    Request->Id         = PdoGetTag(Pdo);
     Request->Operation  = BLKIF_OP_WRITE_BARRIER;
     Request->FirstSector = Cdb_LogicalBlock(Srb);
-    InitializeListHead(&Request->Segments);
 
     SrbExt->Count = PdoQueueRequestList(Pdo, &List);
     return TRUE;
@@ -1209,18 +1257,16 @@ PrepareUnmap(
         PUNMAP_BLOCK_DESCRIPTOR Descr = &Unmap->Descriptors[Index];
         PXENVBD_REQUEST         Request;
 
-        Request = __LookasideAlloc(&Pdo->RequestList);
+        Request = PdoGetRequest(Pdo);
         if (Request == NULL)
             goto fail1;
         InsertTailList(&List, &Request->Entry);
 
         Request->Srb            = Srb;
-        Request->Id             = PdoGetTag(Pdo);
         Request->Operation      = BLKIF_OP_DISCARD;
         Request->FirstSector    = _byteswap_uint64(*(PULONG64)Descr->StartingLba);
         Request->NrSectors      = _byteswap_ulong(*(PULONG)Descr->LbaCount);
         Request->Flags          = 0;
-        InitializeListHead(&Request->Segments);
     }
 
     SrbExt->Count = PdoQueueRequestList(Pdo, &List);
@@ -1296,8 +1342,7 @@ __PdoPauseDataPath(
         Verbose("Target[%d] : PreparedReq 0x%p -> FAILED\n", PdoGetTargetId(Pdo), Request);
 
         SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
-        RequestCleanup(Pdo, Request);
-        __LookasideFree(&Pdo->RequestList, Request);
+        PdoPutRequest(Pdo, Request);
 
         if (InterlockedDecrement(&SrbExt->Count) == 0) {
             SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
@@ -1460,7 +1505,7 @@ PdoCompleteResponse(
     PSCSI_REQUEST_BLOCK Srb;
     PXENVBD_SRBEXT      SrbExt;
 
-    Request = PdoPutTag(Pdo, Tag);
+    Request = PdoRequestFromTag(Pdo, Tag);
     if (Request == NULL)
         return;
 
@@ -1489,8 +1534,7 @@ PdoCompleteResponse(
         break;
     }
 
-    RequestCleanup(Pdo, Request);
-    __LookasideFree(&Pdo->RequestList, Request);
+    PdoPutRequest(Pdo, Request);
 
     // complete srb
     if (InterlockedDecrement(&SrbExt->Count) == 0) {
@@ -1529,8 +1573,7 @@ PdoPreResume(
         SrbExt = GetSrbExt(Request->Srb);
 
         BlockRingAbort(BlockRing, Request);
-        RequestCleanup(Pdo, Request);
-        __LookasideFree(&Pdo->RequestList, Request);
+        PdoPutRequest(Pdo, Request);
 
         if (InterlockedDecrement(&SrbExt->Count) == 0) {
             InsertTailList(&List, &SrbExt->Entry);
@@ -1547,8 +1590,7 @@ PdoPreResume(
         Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
         SrbExt = GetSrbExt(Request->Srb);
 
-        RequestCleanup(Pdo, Request);
-        __LookasideFree(&Pdo->RequestList, Request);
+        PdoPutRequest(Pdo, Request);
 
         if (InterlockedDecrement(&SrbExt->Count) == 0) {
             InsertTailList(&List, &SrbExt->Entry);
@@ -2155,8 +2197,7 @@ __PdoCleanupSubmittedReqs(
 
         Verbose("Target[%d] : SubmittedReq 0x%p -> FAILED\n", PdoGetTargetId(Pdo), Request);
 
-        RequestCleanup(Pdo, Request);
-        __LookasideFree(&Pdo->RequestList, Request);
+        PdoPutRequest(Pdo, Request);
 
         if (InterlockedDecrement(&SrbExt->Count) == 0) {
             SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
-- 
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 Tue Oct 27 11:16:06 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 11:16:06 +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 1Zr2EY-0003Gt-Gs; Tue, 27 Oct 2015 11:16:06 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=735ca0e81=owen.smith@citrix.com>)
	id 1Zr2EW-0003FA-56
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 11:16:04 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	83/70-10678-3FC5F265; Tue, 27 Oct 2015 11:16:03 +0000
X-Env-Sender: prvs=735ca0e81=owen.smith@citrix.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1445944559!11036676!2
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 10359 invoked from network); 27 Oct 2015 11:16:01 -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 Oct 2015 11:16:01 -0000
X-IronPort-AV: E=Sophos;i="5.20,204,1444694400"; d="scan'208";a="313676558"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 27 Oct 2015 11:15:40 +0000
Message-ID: <1445944546-21500-3-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 2/8] Refacror - reorder functions in pdo.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>
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: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/pdo.c | 657 +++++++++++++++++++++++++++----------------------------
 src/xenvbd/pdo.h |   5 -
 2 files changed, 323 insertions(+), 339 deletions(-)

diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index de8ba02..9387742 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -448,286 +448,6 @@ __PdoRestoreDevicePnpState(
     }
 }
 
-static FORCEINLINE VOID
-__PdoPauseDataPath(
-    __in PXENVBD_PDO             Pdo,
-    __in BOOLEAN                 Timeout
-    )
-{
-    KIRQL               Irql;
-    ULONG               Requests;
-    ULONG               Count = 0;
-    PXENVBD_NOTIFIER    Notifier = FrontendGetNotifier(Pdo->Frontend);
-    PXENVBD_BLOCKRING   BlockRing = FrontendGetBlockRing(Pdo->Frontend);
-
-    KeAcquireSpinLock(&Pdo->Lock, &Irql);
-    ++Pdo->Paused;
-    KeReleaseSpinLock(&Pdo->Lock, Irql);
-
-    Requests = QueueCount(&Pdo->SubmittedReqs);
-    KeMemoryBarrier();
-
-    Verbose("Target[%d] : Waiting for %d Submitted requests\n", PdoGetTargetId(Pdo), Requests);
-
-    // poll ring and send event channel notification every 1ms (for up to 3 minutes)
-    while (QueueCount(&Pdo->SubmittedReqs)) {
-        if (Timeout && Count > 180000)
-            break;
-        KeRaiseIrql(DISPATCH_LEVEL, &Irql);
-        BlockRingPoll(BlockRing);
-        KeLowerIrql(Irql);
-        NotifierSend(Notifier);         // let backend know it needs to do some work
-        StorPortStallExecution(1000);   // 1000 micro-seconds
-        ++Count;
-    }
-
-    Verbose("Target[%d] : %u/%u Submitted requests left (%u iterrations)\n",
-            PdoGetTargetId(Pdo), QueueCount(&Pdo->SubmittedReqs), Requests, Count);
-}
-
-static FORCEINLINE VOID
-__PdoUnpauseDataPath(
-    __in PXENVBD_PDO             Pdo
-    )
-{
-    KIRQL   Irql;
-
-    KeAcquireSpinLock(&Pdo->Lock, &Irql);
-    --Pdo->Paused;
-    KeReleaseSpinLock(&Pdo->Lock, Irql);
-}
-
-//=============================================================================
-// Creation/Deletion
-__checkReturn
-NTSTATUS
-PdoCreate(
-    __in PXENVBD_FDO             Fdo,
-    __in __nullterminated PCHAR  DeviceId,
-    __in ULONG                   TargetId,
-    __in BOOLEAN                 EmulatedUnplugged,
-    __in PKEVENT                 FrontendEvent,
-    __in XENVBD_DEVICE_TYPE      DeviceType
-    )
-{
-    NTSTATUS    Status;
-    PXENVBD_PDO Pdo;
-
-    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
-
-    Status = STATUS_INSUFFICIENT_RESOURCES;
-#pragma warning(suppress: 6014)
-    Pdo = __PdoAlloc(sizeof(XENVBD_PDO));
-    if (!Pdo)
-        goto fail1;
-
-    Verbose("Target[%d] : Creating (%s)\n", TargetId, EmulatedUnplugged ? "PV" : "Emulated");
-    Pdo->Signature      = PDO_SIGNATURE;
-    Pdo->Fdo            = Fdo;
-    Pdo->DeviceObject   = NULL; // filled in later
-    KeInitializeEvent(&Pdo->RemoveEvent, SynchronizationEvent, FALSE);
-    Pdo->ReferenceCount = 1;
-    Pdo->Paused         = 1; // Paused until D3->D0 transition
-    Pdo->DevicePnpState = Present;
-    Pdo->DevicePowerState = PowerDeviceD3;
-    Pdo->EmulatedUnplugged = EmulatedUnplugged;
-    Pdo->DeviceType     = DeviceType;
-
-    KeInitializeSpinLock(&Pdo->Lock);
-    QueueInit(&Pdo->FreshSrbs);
-    QueueInit(&Pdo->PreparedReqs);
-    QueueInit(&Pdo->SubmittedReqs);
-    QueueInit(&Pdo->ShutdownSrbs);
-
-    Status = FrontendCreate(Pdo, DeviceId, TargetId, FrontendEvent, &Pdo->Frontend);
-    if (!NT_SUCCESS(Status))
-        goto fail2;
-
-    __LookasideInit(&Pdo->RequestList, sizeof(XENVBD_REQUEST), REQUEST_POOL_TAG);
-    __LookasideInit(&Pdo->SegmentList, sizeof(XENVBD_SEGMENT), SEGMENT_POOL_TAG);
-    __LookasideInit(&Pdo->IndirectList, PAGE_SIZE, INDIRECT_POOL_TAG);
-
-    Status = PdoD3ToD0(Pdo);
-    if (!NT_SUCCESS(Status))
-        goto fail3;
-
-    if (!FdoLinkPdo(Fdo, Pdo))
-        goto fail4;
-
-    Verbose("Target[%d] : Created (%s)\n", TargetId, EmulatedUnplugged ? "PV" : "Emulated");
-    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
-    return STATUS_SUCCESS;
-
-fail4:
-    Error("Fail4\n");
-    PdoD0ToD3(Pdo);
-
-fail3:
-    Error("Fail3\n");
-    __LookasideTerm(&Pdo->IndirectList);
-    __LookasideTerm(&Pdo->SegmentList);
-    __LookasideTerm(&Pdo->RequestList);
-    FrontendDestroy(Pdo->Frontend);
-    Pdo->Frontend = NULL;
-
-fail2:
-    Error("Fail2\n");
-    __PdoFree(Pdo);
-
-fail1:
-    Error("Fail1 (%08x)\n", Status);
-    return Status;
-}
-
-VOID
-PdoDestroy(
-    __in PXENVBD_PDO    Pdo
-    )
-{
-    const ULONG         TargetId = PdoGetTargetId(Pdo);
-    PVOID               Objects[4];
-    PKWAIT_BLOCK        WaitBlock;
-
-    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
-    Verbose("Target[%d] : Destroying\n", TargetId);
-
-    ASSERT3U(Pdo->Signature, ==, PDO_SIGNATURE);
-    if (!FdoUnlinkPdo(PdoGetFdo(Pdo), Pdo)) {
-        Error("Target[%d] : PDO 0x%p not linked to FDO 0x%p\n", TargetId, Pdo, PdoGetFdo(Pdo));
-    }
-
-    PdoD0ToD3(Pdo);
-    PdoDereference(Pdo); // drop initial ref count
-
-    // Wait for ReferenceCount == 0 and RequestListUsed == 0
-    Verbose("Target[%d] : ReferenceCount %d, RequestListUsed %d\n", TargetId, Pdo->ReferenceCount, Pdo->RequestList.Used);
-    Objects[0] = &Pdo->RemoveEvent;
-    Objects[1] = &Pdo->RequestList.Empty;
-    Objects[2] = &Pdo->SegmentList.Empty;
-    Objects[3] = &Pdo->IndirectList.Empty;
-
-    WaitBlock = (PKWAIT_BLOCK)__PdoAlloc(sizeof(KWAIT_BLOCK) * ARRAYSIZE(Objects));
-    if (WaitBlock == NULL) {
-        ULONG   Index;
-
-        Error("Unable to allocate resources for KWAIT_BLOCK\n");
-
-        for (Index = 0; Index < ARRAYSIZE(Objects); Index++)
-            KeWaitForSingleObject(Objects[Index],
-                                  Executive,
-                                  KernelMode,
-                                  FALSE,
-                                  NULL);
-    } else {
-        KeWaitForMultipleObjects(ARRAYSIZE(Objects),
-                                 Objects,
-                                 WaitAll,
-                                 Executive,
-                                 KernelMode,
-                                 FALSE,
-                                 NULL,
-                                 WaitBlock);
-#pragma prefast(suppress:6102)
-        __PdoFree(WaitBlock);
-    }
-
-    ASSERT3S(Pdo->ReferenceCount, ==, 0);
-    ASSERT3U(PdoGetDevicePnpState(Pdo), ==, Deleted);
-
-    __LookasideTerm(&Pdo->IndirectList);
-    __LookasideTerm(&Pdo->SegmentList);
-    __LookasideTerm(&Pdo->RequestList);
-
-    FrontendDestroy(Pdo->Frontend);
-    Pdo->Frontend = NULL;
-
-    ASSERT3U(Pdo->Signature, ==, PDO_SIGNATURE);
-    RtlZeroMemory(Pdo, sizeof(XENVBD_PDO));
-    __PdoFree(Pdo);
-
-    Verbose("Target[%d] : Destroyed\n", TargetId);
-    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
-}
-
-__checkReturn
-NTSTATUS
-PdoD3ToD0(
-    __in PXENVBD_PDO            Pdo
-    )
-{
-    NTSTATUS                    Status;
-    const ULONG                 TargetId = PdoGetTargetId(Pdo);
-
-    if (!PdoSetDevicePowerState(Pdo, PowerDeviceD0))
-        return STATUS_SUCCESS;
-
-    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
-    Verbose("Target[%d] : D3->D0 (%s)\n", TargetId, Pdo->EmulatedUnplugged ? "PV" : "Emulated");
-
-    // power up frontend
-    Status = FrontendD3ToD0(Pdo->Frontend);
-    if (!NT_SUCCESS(Status))
-        goto fail1;
-    
-    // connect frontend
-    if (Pdo->EmulatedUnplugged) {
-        Status = FrontendSetState(Pdo->Frontend, XENVBD_ENABLED);
-        if (!NT_SUCCESS(Status))
-            goto fail2;
-        __PdoUnpauseDataPath(Pdo);
-    }
-
-    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
-    return STATUS_SUCCESS;
-
-fail2:
-    Error("Fail2\n");
-    FrontendD0ToD3(Pdo->Frontend);
-
-fail1:
-    Error("Fail1 (%08x)\n", Status);
-
-    Pdo->DevicePowerState = PowerDeviceD3;
-
-    return Status;
-}
-
-VOID
-PdoD0ToD3(
-    __in PXENVBD_PDO            Pdo
-    )
-{
-    const ULONG                 TargetId = PdoGetTargetId(Pdo);
-
-    if (!PdoSetDevicePowerState(Pdo, PowerDeviceD3))
-        return;
-
-    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
-    Verbose("Target[%d] : D0->D3 (%s)\n", TargetId, Pdo->EmulatedUnplugged ? "PV" : "Emulated");
-
-    // close frontend
-    if (Pdo->EmulatedUnplugged) {
-        __PdoPauseDataPath(Pdo, FALSE);
-        PdoAbortAllSrbs(Pdo);
-        (VOID) FrontendSetState(Pdo->Frontend, XENVBD_CLOSED);
-        ASSERT3U(QueueCount(&Pdo->SubmittedReqs), ==, 0);
-    }
-
-    // power down frontend
-    FrontendD0ToD3(Pdo->Frontend);
-
-    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
-}
-
-__drv_requiresIRQL(DISPATCH_LEVEL)
-VOID
-PdoBackendPathChanged(
-    __in PXENVBD_PDO             Pdo
-    )
-{
-    FrontendBackendPathChanged(Pdo->Frontend);
-}
-
 //=============================================================================
 // Reference Counting
 FORCEINLINE LONG
@@ -1522,6 +1242,91 @@ fail1:
 
 //=============================================================================
 // Queue-Related
+static FORCEINLINE VOID
+__PdoPauseDataPath(
+    __in PXENVBD_PDO             Pdo,
+    __in BOOLEAN                 Timeout
+    )
+{
+    KIRQL               Irql;
+    ULONG               Requests;
+    ULONG               Count = 0;
+    PXENVBD_NOTIFIER    Notifier = FrontendGetNotifier(Pdo->Frontend);
+    PXENVBD_BLOCKRING   BlockRing = FrontendGetBlockRing(Pdo->Frontend);
+
+    KeAcquireSpinLock(&Pdo->Lock, &Irql);
+    ++Pdo->Paused;
+    KeReleaseSpinLock(&Pdo->Lock, Irql);
+
+    Requests = QueueCount(&Pdo->SubmittedReqs);
+    KeMemoryBarrier();
+
+    Verbose("Target[%d] : Waiting for %d Submitted requests\n", PdoGetTargetId(Pdo), Requests);
+
+    // poll ring and send event channel notification every 1ms (for up to 3 minutes)
+    while (QueueCount(&Pdo->SubmittedReqs)) {
+        if (Timeout && Count > 180000)
+            break;
+        KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+        BlockRingPoll(BlockRing);
+        KeLowerIrql(Irql);
+        NotifierSend(Notifier);         // let backend know it needs to do some work
+        StorPortStallExecution(1000);   // 1000 micro-seconds
+        ++Count;
+    }
+
+    Verbose("Target[%d] : %u/%u Submitted requests left (%u iterrations)\n",
+            PdoGetTargetId(Pdo), QueueCount(&Pdo->SubmittedReqs), Requests, Count);
+
+    // Abort Fresh SRBs
+    for (;;) {
+        PXENVBD_SRBEXT  SrbExt;
+        PLIST_ENTRY     Entry = QueuePop(&Pdo->FreshSrbs);
+        if (Entry == NULL)
+            break;
+        SrbExt = CONTAINING_RECORD(Entry, XENVBD_SRBEXT, Entry);
+
+        Verbose("Target[%d] : FreshSrb 0x%p -> SCSI_ABORTED\n", PdoGetTargetId(Pdo), SrbExt->Srb);
+        SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
+        SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED;
+        FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
+    }
+
+    // Fail PreparedReqs
+    for (;;) {
+        PXENVBD_SRBEXT  SrbExt;
+        PXENVBD_REQUEST Request;
+        PLIST_ENTRY     Entry = QueuePop(&Pdo->PreparedReqs);
+        if (Entry == NULL)
+            break;
+        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
+        SrbExt = GetSrbExt(Request->Srb);
+
+        Verbose("Target[%d] : PreparedReq 0x%p -> FAILED\n", PdoGetTargetId(Pdo), Request);
+
+        SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
+        RequestCleanup(Pdo, Request);
+        __LookasideFree(&Pdo->RequestList, Request);
+
+        if (InterlockedDecrement(&SrbExt->Count) == 0) {
+            SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
+            FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
+        }
+    }
+}
+
+static FORCEINLINE VOID
+__PdoUnpauseDataPath(
+    __in PXENVBD_PDO             Pdo
+    )
+{
+    KIRQL   Irql;
+
+    KeAcquireSpinLock(&Pdo->Lock, &Irql);
+    --Pdo->Paused;
+    KeReleaseSpinLock(&Pdo->Lock, Irql);
+}
+
 static FORCEINLINE BOOLEAN
 PdoPrepareFresh(
     __in PXENVBD_PDO             Pdo
@@ -2310,7 +2115,6 @@ PdoReset(
     Trace("Target[%d] ====> (Irql=%d)\n", PdoGetTargetId(Pdo), KeGetCurrentIrql());
 
     __PdoPauseDataPath(Pdo, TRUE);
-    PdoAbortAllSrbs(Pdo);
 
     if (QueueCount(&Pdo->SubmittedReqs)) {
         Error("Target[%d] : backend has %u outstanding requests after a PdoReset\n",
@@ -2390,61 +2194,19 @@ PdoStartIo(
     if (!__ValidateSrbForPdo(Pdo, Srb))
         return TRUE;
 
-    switch (Srb->Function) {
-    case SRB_FUNCTION_EXECUTE_SCSI:
-        return __PdoExecuteScsi(Pdo, Srb);
-
-    case SRB_FUNCTION_RESET_DEVICE:
-        return __PdoReset(Pdo, Srb);
-
-    case SRB_FUNCTION_FLUSH:
-    case SRB_FUNCTION_SHUTDOWN:
-        return __PdoQueueShutdown(Pdo, Srb);
-
-    default:
-        return TRUE;
-    }
-}
-
-VOID
-PdoAbortAllSrbs(
-    __in PXENVBD_PDO             Pdo
-    )
-{
-    // Abort Fresh SRBs
-    for (;;) {
-        PXENVBD_SRBEXT  SrbExt;
-        PLIST_ENTRY     Entry = QueuePop(&Pdo->FreshSrbs);
-        if (Entry == NULL)
-            break;
-        SrbExt = CONTAINING_RECORD(Entry, XENVBD_SRBEXT, Entry);
-
-        Verbose("Target[%d] : FreshSrb 0x%p -> SCSI_ABORTED\n", PdoGetTargetId(Pdo), SrbExt->Srb);
-        SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
-        SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED;
-        FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
-    }
-
-    // Fail PreparedReqs
-    for (;;) {
-        PXENVBD_SRBEXT  SrbExt;
-        PXENVBD_REQUEST Request;
-        PLIST_ENTRY     Entry = QueuePop(&Pdo->PreparedReqs);
-        if (Entry == NULL)
-            break;
-        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
-        SrbExt = GetSrbExt(Request->Srb);
+    switch (Srb->Function) {
+    case SRB_FUNCTION_EXECUTE_SCSI:
+        return __PdoExecuteScsi(Pdo, Srb);
 
-        Verbose("Target[%d] : PreparedReq 0x%p -> FAILED\n", PdoGetTargetId(Pdo), Request);
-        
-        SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
-        RequestCleanup(Pdo, Request);
-        __LookasideFree(&Pdo->RequestList, Request);
+    case SRB_FUNCTION_RESET_DEVICE:
+        return __PdoReset(Pdo, Srb);
 
-        if (InterlockedDecrement(&SrbExt->Count) == 0) {
-            SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
-            FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
-        }
+    case SRB_FUNCTION_FLUSH:
+    case SRB_FUNCTION_SHUTDOWN:
+        return __PdoQueueShutdown(Pdo, Srb);
+
+    default:
+        return TRUE;
     }
 }
 
@@ -2697,3 +2459,230 @@ PdoIssueDeviceEject(
     }
 }
 
+__drv_requiresIRQL(DISPATCH_LEVEL)
+VOID
+PdoBackendPathChanged(
+    __in PXENVBD_PDO             Pdo
+    )
+{
+    FrontendBackendPathChanged(Pdo->Frontend);
+}
+
+__checkReturn
+NTSTATUS
+PdoD3ToD0(
+    __in PXENVBD_PDO            Pdo
+    )
+{
+    NTSTATUS                    Status;
+    const ULONG                 TargetId = PdoGetTargetId(Pdo);
+
+    if (!PdoSetDevicePowerState(Pdo, PowerDeviceD0))
+        return STATUS_SUCCESS;
+
+    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
+    Verbose("Target[%d] : D3->D0 (%s)\n", TargetId, Pdo->EmulatedUnplugged ? "PV" : "Emulated");
+
+    // power up frontend
+    Status = FrontendD3ToD0(Pdo->Frontend);
+    if (!NT_SUCCESS(Status))
+        goto fail1;
+
+    // connect frontend
+    if (Pdo->EmulatedUnplugged) {
+        Status = FrontendSetState(Pdo->Frontend, XENVBD_ENABLED);
+        if (!NT_SUCCESS(Status))
+            goto fail2;
+        __PdoUnpauseDataPath(Pdo);
+    }
+
+    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
+    return STATUS_SUCCESS;
+
+fail2:
+    Error("Fail2\n");
+    FrontendD0ToD3(Pdo->Frontend);
+
+fail1:
+    Error("Fail1 (%08x)\n", Status);
+
+    Pdo->DevicePowerState = PowerDeviceD3;
+
+    return Status;
+}
+
+VOID
+PdoD0ToD3(
+    __in PXENVBD_PDO            Pdo
+    )
+{
+    const ULONG                 TargetId = PdoGetTargetId(Pdo);
+
+    if (!PdoSetDevicePowerState(Pdo, PowerDeviceD3))
+        return;
+
+    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
+    Verbose("Target[%d] : D0->D3 (%s)\n", TargetId, Pdo->EmulatedUnplugged ? "PV" : "Emulated");
+
+    // close frontend
+    if (Pdo->EmulatedUnplugged) {
+        __PdoPauseDataPath(Pdo, FALSE);
+        (VOID) FrontendSetState(Pdo->Frontend, XENVBD_CLOSED);
+        ASSERT3U(QueueCount(&Pdo->SubmittedReqs), ==, 0);
+    }
+
+    // power down frontend
+    FrontendD0ToD3(Pdo->Frontend);
+
+    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
+}
+
+__checkReturn
+NTSTATUS
+PdoCreate(
+    __in PXENVBD_FDO             Fdo,
+    __in __nullterminated PCHAR  DeviceId,
+    __in ULONG                   TargetId,
+    __in BOOLEAN                 EmulatedUnplugged,
+    __in PKEVENT                 FrontendEvent,
+    __in XENVBD_DEVICE_TYPE      DeviceType
+    )
+{
+    NTSTATUS    Status;
+    PXENVBD_PDO Pdo;
+
+    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
+
+    Status = STATUS_INSUFFICIENT_RESOURCES;
+#pragma warning(suppress: 6014)
+    Pdo = __PdoAlloc(sizeof(XENVBD_PDO));
+    if (!Pdo)
+        goto fail1;
+
+    Verbose("Target[%d] : Creating (%s)\n", TargetId, EmulatedUnplugged ? "PV" : "Emulated");
+    Pdo->Signature      = PDO_SIGNATURE;
+    Pdo->Fdo            = Fdo;
+    Pdo->DeviceObject   = NULL; // filled in later
+    KeInitializeEvent(&Pdo->RemoveEvent, SynchronizationEvent, FALSE);
+    Pdo->ReferenceCount = 1;
+    Pdo->Paused         = 1; // Paused until D3->D0 transition
+    Pdo->DevicePnpState = Present;
+    Pdo->DevicePowerState = PowerDeviceD3;
+    Pdo->EmulatedUnplugged = EmulatedUnplugged;
+    Pdo->DeviceType     = DeviceType;
+
+    KeInitializeSpinLock(&Pdo->Lock);
+    QueueInit(&Pdo->FreshSrbs);
+    QueueInit(&Pdo->PreparedReqs);
+    QueueInit(&Pdo->SubmittedReqs);
+    QueueInit(&Pdo->ShutdownSrbs);
+
+    Status = FrontendCreate(Pdo, DeviceId, TargetId, FrontendEvent, &Pdo->Frontend);
+    if (!NT_SUCCESS(Status))
+        goto fail2;
+
+    __LookasideInit(&Pdo->RequestList, sizeof(XENVBD_REQUEST), REQUEST_POOL_TAG);
+    __LookasideInit(&Pdo->SegmentList, sizeof(XENVBD_SEGMENT), SEGMENT_POOL_TAG);
+    __LookasideInit(&Pdo->IndirectList, PAGE_SIZE, INDIRECT_POOL_TAG);
+
+    Status = PdoD3ToD0(Pdo);
+    if (!NT_SUCCESS(Status))
+        goto fail3;
+
+    if (!FdoLinkPdo(Fdo, Pdo))
+        goto fail4;
+
+    Verbose("Target[%d] : Created (%s)\n", TargetId, EmulatedUnplugged ? "PV" : "Emulated");
+    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
+    return STATUS_SUCCESS;
+
+fail4:
+    Error("Fail4\n");
+    PdoD0ToD3(Pdo);
+
+fail3:
+    Error("Fail3\n");
+    __LookasideTerm(&Pdo->IndirectList);
+    __LookasideTerm(&Pdo->SegmentList);
+    __LookasideTerm(&Pdo->RequestList);
+    FrontendDestroy(Pdo->Frontend);
+    Pdo->Frontend = NULL;
+
+fail2:
+    Error("Fail2\n");
+    __PdoFree(Pdo);
+
+fail1:
+    Error("Fail1 (%08x)\n", Status);
+    return Status;
+}
+
+VOID
+PdoDestroy(
+    __in PXENVBD_PDO    Pdo
+    )
+{
+    const ULONG         TargetId = PdoGetTargetId(Pdo);
+    PVOID               Objects[4];
+    PKWAIT_BLOCK        WaitBlock;
+
+    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
+    Verbose("Target[%d] : Destroying\n", TargetId);
+
+    ASSERT3U(Pdo->Signature, ==, PDO_SIGNATURE);
+    if (!FdoUnlinkPdo(PdoGetFdo(Pdo), Pdo)) {
+        Error("Target[%d] : PDO 0x%p not linked to FDO 0x%p\n", TargetId, Pdo, PdoGetFdo(Pdo));
+    }
+
+    PdoD0ToD3(Pdo);
+    PdoDereference(Pdo); // drop initial ref count
+
+    // Wait for ReferenceCount == 0 and RequestListUsed == 0
+    Verbose("Target[%d] : ReferenceCount %d, RequestListUsed %d\n", TargetId, Pdo->ReferenceCount, Pdo->RequestList.Used);
+    Objects[0] = &Pdo->RemoveEvent;
+    Objects[1] = &Pdo->RequestList.Empty;
+    Objects[2] = &Pdo->SegmentList.Empty;
+    Objects[3] = &Pdo->IndirectList.Empty;
+
+    WaitBlock = (PKWAIT_BLOCK)__PdoAlloc(sizeof(KWAIT_BLOCK) * ARRAYSIZE(Objects));
+    if (WaitBlock == NULL) {
+        ULONG   Index;
+
+        Error("Unable to allocate resources for KWAIT_BLOCK\n");
+
+        for (Index = 0; Index < ARRAYSIZE(Objects); Index++)
+            KeWaitForSingleObject(Objects[Index],
+                                  Executive,
+                                  KernelMode,
+                                  FALSE,
+                                  NULL);
+    } else {
+        KeWaitForMultipleObjects(ARRAYSIZE(Objects),
+                                 Objects,
+                                 WaitAll,
+                                 Executive,
+                                 KernelMode,
+                                 FALSE,
+                                 NULL,
+                                 WaitBlock);
+#pragma prefast(suppress:6102)
+        __PdoFree(WaitBlock);
+    }
+
+    ASSERT3S(Pdo->ReferenceCount, ==, 0);
+    ASSERT3U(PdoGetDevicePnpState(Pdo), ==, Deleted);
+
+    __LookasideTerm(&Pdo->IndirectList);
+    __LookasideTerm(&Pdo->SegmentList);
+    __LookasideTerm(&Pdo->RequestList);
+
+    FrontendDestroy(Pdo->Frontend);
+    Pdo->Frontend = NULL;
+
+    ASSERT3U(Pdo->Signature, ==, PDO_SIGNATURE);
+    RtlZeroMemory(Pdo, sizeof(XENVBD_PDO));
+    __PdoFree(Pdo);
+
+    Verbose("Target[%d] : Destroyed\n", TargetId);
+    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
+}
diff --git a/src/xenvbd/pdo.h b/src/xenvbd/pdo.h
index c5e81ab..fbd6681 100644
--- a/src/xenvbd/pdo.h
+++ b/src/xenvbd/pdo.h
@@ -213,11 +213,6 @@ PdoStartIo(
     );
 
 extern VOID
-PdoAbortAllSrbs(
-    __in PXENVBD_PDO             Pdo
-    );
-
-extern VOID
 PdoSrbPnp(
     __in PXENVBD_PDO             Pdo,
     __in PSCSI_PNP_REQUEST_BLOCK Srb
-- 
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 Tue Oct 27 11:16:06 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 11:16:06 +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 1Zr2EY-0003Gt-Gs; Tue, 27 Oct 2015 11:16:06 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=735ca0e81=owen.smith@citrix.com>)
	id 1Zr2EW-0003FA-56
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 11:16:04 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	83/70-10678-3FC5F265; Tue, 27 Oct 2015 11:16:03 +0000
X-Env-Sender: prvs=735ca0e81=owen.smith@citrix.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1445944559!11036676!2
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 10359 invoked from network); 27 Oct 2015 11:16:01 -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 Oct 2015 11:16:01 -0000
X-IronPort-AV: E=Sophos;i="5.20,204,1444694400"; d="scan'208";a="313676558"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 27 Oct 2015 11:15:40 +0000
Message-ID: <1445944546-21500-3-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 2/8] Refacror - reorder functions in pdo.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>
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: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/pdo.c | 657 +++++++++++++++++++++++++++----------------------------
 src/xenvbd/pdo.h |   5 -
 2 files changed, 323 insertions(+), 339 deletions(-)

diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index de8ba02..9387742 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -448,286 +448,6 @@ __PdoRestoreDevicePnpState(
     }
 }
 
-static FORCEINLINE VOID
-__PdoPauseDataPath(
-    __in PXENVBD_PDO             Pdo,
-    __in BOOLEAN                 Timeout
-    )
-{
-    KIRQL               Irql;
-    ULONG               Requests;
-    ULONG               Count = 0;
-    PXENVBD_NOTIFIER    Notifier = FrontendGetNotifier(Pdo->Frontend);
-    PXENVBD_BLOCKRING   BlockRing = FrontendGetBlockRing(Pdo->Frontend);
-
-    KeAcquireSpinLock(&Pdo->Lock, &Irql);
-    ++Pdo->Paused;
-    KeReleaseSpinLock(&Pdo->Lock, Irql);
-
-    Requests = QueueCount(&Pdo->SubmittedReqs);
-    KeMemoryBarrier();
-
-    Verbose("Target[%d] : Waiting for %d Submitted requests\n", PdoGetTargetId(Pdo), Requests);
-
-    // poll ring and send event channel notification every 1ms (for up to 3 minutes)
-    while (QueueCount(&Pdo->SubmittedReqs)) {
-        if (Timeout && Count > 180000)
-            break;
-        KeRaiseIrql(DISPATCH_LEVEL, &Irql);
-        BlockRingPoll(BlockRing);
-        KeLowerIrql(Irql);
-        NotifierSend(Notifier);         // let backend know it needs to do some work
-        StorPortStallExecution(1000);   // 1000 micro-seconds
-        ++Count;
-    }
-
-    Verbose("Target[%d] : %u/%u Submitted requests left (%u iterrations)\n",
-            PdoGetTargetId(Pdo), QueueCount(&Pdo->SubmittedReqs), Requests, Count);
-}
-
-static FORCEINLINE VOID
-__PdoUnpauseDataPath(
-    __in PXENVBD_PDO             Pdo
-    )
-{
-    KIRQL   Irql;
-
-    KeAcquireSpinLock(&Pdo->Lock, &Irql);
-    --Pdo->Paused;
-    KeReleaseSpinLock(&Pdo->Lock, Irql);
-}
-
-//=============================================================================
-// Creation/Deletion
-__checkReturn
-NTSTATUS
-PdoCreate(
-    __in PXENVBD_FDO             Fdo,
-    __in __nullterminated PCHAR  DeviceId,
-    __in ULONG                   TargetId,
-    __in BOOLEAN                 EmulatedUnplugged,
-    __in PKEVENT                 FrontendEvent,
-    __in XENVBD_DEVICE_TYPE      DeviceType
-    )
-{
-    NTSTATUS    Status;
-    PXENVBD_PDO Pdo;
-
-    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
-
-    Status = STATUS_INSUFFICIENT_RESOURCES;
-#pragma warning(suppress: 6014)
-    Pdo = __PdoAlloc(sizeof(XENVBD_PDO));
-    if (!Pdo)
-        goto fail1;
-
-    Verbose("Target[%d] : Creating (%s)\n", TargetId, EmulatedUnplugged ? "PV" : "Emulated");
-    Pdo->Signature      = PDO_SIGNATURE;
-    Pdo->Fdo            = Fdo;
-    Pdo->DeviceObject   = NULL; // filled in later
-    KeInitializeEvent(&Pdo->RemoveEvent, SynchronizationEvent, FALSE);
-    Pdo->ReferenceCount = 1;
-    Pdo->Paused         = 1; // Paused until D3->D0 transition
-    Pdo->DevicePnpState = Present;
-    Pdo->DevicePowerState = PowerDeviceD3;
-    Pdo->EmulatedUnplugged = EmulatedUnplugged;
-    Pdo->DeviceType     = DeviceType;
-
-    KeInitializeSpinLock(&Pdo->Lock);
-    QueueInit(&Pdo->FreshSrbs);
-    QueueInit(&Pdo->PreparedReqs);
-    QueueInit(&Pdo->SubmittedReqs);
-    QueueInit(&Pdo->ShutdownSrbs);
-
-    Status = FrontendCreate(Pdo, DeviceId, TargetId, FrontendEvent, &Pdo->Frontend);
-    if (!NT_SUCCESS(Status))
-        goto fail2;
-
-    __LookasideInit(&Pdo->RequestList, sizeof(XENVBD_REQUEST), REQUEST_POOL_TAG);
-    __LookasideInit(&Pdo->SegmentList, sizeof(XENVBD_SEGMENT), SEGMENT_POOL_TAG);
-    __LookasideInit(&Pdo->IndirectList, PAGE_SIZE, INDIRECT_POOL_TAG);
-
-    Status = PdoD3ToD0(Pdo);
-    if (!NT_SUCCESS(Status))
-        goto fail3;
-
-    if (!FdoLinkPdo(Fdo, Pdo))
-        goto fail4;
-
-    Verbose("Target[%d] : Created (%s)\n", TargetId, EmulatedUnplugged ? "PV" : "Emulated");
-    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
-    return STATUS_SUCCESS;
-
-fail4:
-    Error("Fail4\n");
-    PdoD0ToD3(Pdo);
-
-fail3:
-    Error("Fail3\n");
-    __LookasideTerm(&Pdo->IndirectList);
-    __LookasideTerm(&Pdo->SegmentList);
-    __LookasideTerm(&Pdo->RequestList);
-    FrontendDestroy(Pdo->Frontend);
-    Pdo->Frontend = NULL;
-
-fail2:
-    Error("Fail2\n");
-    __PdoFree(Pdo);
-
-fail1:
-    Error("Fail1 (%08x)\n", Status);
-    return Status;
-}
-
-VOID
-PdoDestroy(
-    __in PXENVBD_PDO    Pdo
-    )
-{
-    const ULONG         TargetId = PdoGetTargetId(Pdo);
-    PVOID               Objects[4];
-    PKWAIT_BLOCK        WaitBlock;
-
-    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
-    Verbose("Target[%d] : Destroying\n", TargetId);
-
-    ASSERT3U(Pdo->Signature, ==, PDO_SIGNATURE);
-    if (!FdoUnlinkPdo(PdoGetFdo(Pdo), Pdo)) {
-        Error("Target[%d] : PDO 0x%p not linked to FDO 0x%p\n", TargetId, Pdo, PdoGetFdo(Pdo));
-    }
-
-    PdoD0ToD3(Pdo);
-    PdoDereference(Pdo); // drop initial ref count
-
-    // Wait for ReferenceCount == 0 and RequestListUsed == 0
-    Verbose("Target[%d] : ReferenceCount %d, RequestListUsed %d\n", TargetId, Pdo->ReferenceCount, Pdo->RequestList.Used);
-    Objects[0] = &Pdo->RemoveEvent;
-    Objects[1] = &Pdo->RequestList.Empty;
-    Objects[2] = &Pdo->SegmentList.Empty;
-    Objects[3] = &Pdo->IndirectList.Empty;
-
-    WaitBlock = (PKWAIT_BLOCK)__PdoAlloc(sizeof(KWAIT_BLOCK) * ARRAYSIZE(Objects));
-    if (WaitBlock == NULL) {
-        ULONG   Index;
-
-        Error("Unable to allocate resources for KWAIT_BLOCK\n");
-
-        for (Index = 0; Index < ARRAYSIZE(Objects); Index++)
-            KeWaitForSingleObject(Objects[Index],
-                                  Executive,
-                                  KernelMode,
-                                  FALSE,
-                                  NULL);
-    } else {
-        KeWaitForMultipleObjects(ARRAYSIZE(Objects),
-                                 Objects,
-                                 WaitAll,
-                                 Executive,
-                                 KernelMode,
-                                 FALSE,
-                                 NULL,
-                                 WaitBlock);
-#pragma prefast(suppress:6102)
-        __PdoFree(WaitBlock);
-    }
-
-    ASSERT3S(Pdo->ReferenceCount, ==, 0);
-    ASSERT3U(PdoGetDevicePnpState(Pdo), ==, Deleted);
-
-    __LookasideTerm(&Pdo->IndirectList);
-    __LookasideTerm(&Pdo->SegmentList);
-    __LookasideTerm(&Pdo->RequestList);
-
-    FrontendDestroy(Pdo->Frontend);
-    Pdo->Frontend = NULL;
-
-    ASSERT3U(Pdo->Signature, ==, PDO_SIGNATURE);
-    RtlZeroMemory(Pdo, sizeof(XENVBD_PDO));
-    __PdoFree(Pdo);
-
-    Verbose("Target[%d] : Destroyed\n", TargetId);
-    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
-}
-
-__checkReturn
-NTSTATUS
-PdoD3ToD0(
-    __in PXENVBD_PDO            Pdo
-    )
-{
-    NTSTATUS                    Status;
-    const ULONG                 TargetId = PdoGetTargetId(Pdo);
-
-    if (!PdoSetDevicePowerState(Pdo, PowerDeviceD0))
-        return STATUS_SUCCESS;
-
-    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
-    Verbose("Target[%d] : D3->D0 (%s)\n", TargetId, Pdo->EmulatedUnplugged ? "PV" : "Emulated");
-
-    // power up frontend
-    Status = FrontendD3ToD0(Pdo->Frontend);
-    if (!NT_SUCCESS(Status))
-        goto fail1;
-    
-    // connect frontend
-    if (Pdo->EmulatedUnplugged) {
-        Status = FrontendSetState(Pdo->Frontend, XENVBD_ENABLED);
-        if (!NT_SUCCESS(Status))
-            goto fail2;
-        __PdoUnpauseDataPath(Pdo);
-    }
-
-    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
-    return STATUS_SUCCESS;
-
-fail2:
-    Error("Fail2\n");
-    FrontendD0ToD3(Pdo->Frontend);
-
-fail1:
-    Error("Fail1 (%08x)\n", Status);
-
-    Pdo->DevicePowerState = PowerDeviceD3;
-
-    return Status;
-}
-
-VOID
-PdoD0ToD3(
-    __in PXENVBD_PDO            Pdo
-    )
-{
-    const ULONG                 TargetId = PdoGetTargetId(Pdo);
-
-    if (!PdoSetDevicePowerState(Pdo, PowerDeviceD3))
-        return;
-
-    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
-    Verbose("Target[%d] : D0->D3 (%s)\n", TargetId, Pdo->EmulatedUnplugged ? "PV" : "Emulated");
-
-    // close frontend
-    if (Pdo->EmulatedUnplugged) {
-        __PdoPauseDataPath(Pdo, FALSE);
-        PdoAbortAllSrbs(Pdo);
-        (VOID) FrontendSetState(Pdo->Frontend, XENVBD_CLOSED);
-        ASSERT3U(QueueCount(&Pdo->SubmittedReqs), ==, 0);
-    }
-
-    // power down frontend
-    FrontendD0ToD3(Pdo->Frontend);
-
-    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
-}
-
-__drv_requiresIRQL(DISPATCH_LEVEL)
-VOID
-PdoBackendPathChanged(
-    __in PXENVBD_PDO             Pdo
-    )
-{
-    FrontendBackendPathChanged(Pdo->Frontend);
-}
-
 //=============================================================================
 // Reference Counting
 FORCEINLINE LONG
@@ -1522,6 +1242,91 @@ fail1:
 
 //=============================================================================
 // Queue-Related
+static FORCEINLINE VOID
+__PdoPauseDataPath(
+    __in PXENVBD_PDO             Pdo,
+    __in BOOLEAN                 Timeout
+    )
+{
+    KIRQL               Irql;
+    ULONG               Requests;
+    ULONG               Count = 0;
+    PXENVBD_NOTIFIER    Notifier = FrontendGetNotifier(Pdo->Frontend);
+    PXENVBD_BLOCKRING   BlockRing = FrontendGetBlockRing(Pdo->Frontend);
+
+    KeAcquireSpinLock(&Pdo->Lock, &Irql);
+    ++Pdo->Paused;
+    KeReleaseSpinLock(&Pdo->Lock, Irql);
+
+    Requests = QueueCount(&Pdo->SubmittedReqs);
+    KeMemoryBarrier();
+
+    Verbose("Target[%d] : Waiting for %d Submitted requests\n", PdoGetTargetId(Pdo), Requests);
+
+    // poll ring and send event channel notification every 1ms (for up to 3 minutes)
+    while (QueueCount(&Pdo->SubmittedReqs)) {
+        if (Timeout && Count > 180000)
+            break;
+        KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+        BlockRingPoll(BlockRing);
+        KeLowerIrql(Irql);
+        NotifierSend(Notifier);         // let backend know it needs to do some work
+        StorPortStallExecution(1000);   // 1000 micro-seconds
+        ++Count;
+    }
+
+    Verbose("Target[%d] : %u/%u Submitted requests left (%u iterrations)\n",
+            PdoGetTargetId(Pdo), QueueCount(&Pdo->SubmittedReqs), Requests, Count);
+
+    // Abort Fresh SRBs
+    for (;;) {
+        PXENVBD_SRBEXT  SrbExt;
+        PLIST_ENTRY     Entry = QueuePop(&Pdo->FreshSrbs);
+        if (Entry == NULL)
+            break;
+        SrbExt = CONTAINING_RECORD(Entry, XENVBD_SRBEXT, Entry);
+
+        Verbose("Target[%d] : FreshSrb 0x%p -> SCSI_ABORTED\n", PdoGetTargetId(Pdo), SrbExt->Srb);
+        SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
+        SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED;
+        FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
+    }
+
+    // Fail PreparedReqs
+    for (;;) {
+        PXENVBD_SRBEXT  SrbExt;
+        PXENVBD_REQUEST Request;
+        PLIST_ENTRY     Entry = QueuePop(&Pdo->PreparedReqs);
+        if (Entry == NULL)
+            break;
+        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
+        SrbExt = GetSrbExt(Request->Srb);
+
+        Verbose("Target[%d] : PreparedReq 0x%p -> FAILED\n", PdoGetTargetId(Pdo), Request);
+
+        SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
+        RequestCleanup(Pdo, Request);
+        __LookasideFree(&Pdo->RequestList, Request);
+
+        if (InterlockedDecrement(&SrbExt->Count) == 0) {
+            SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
+            FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
+        }
+    }
+}
+
+static FORCEINLINE VOID
+__PdoUnpauseDataPath(
+    __in PXENVBD_PDO             Pdo
+    )
+{
+    KIRQL   Irql;
+
+    KeAcquireSpinLock(&Pdo->Lock, &Irql);
+    --Pdo->Paused;
+    KeReleaseSpinLock(&Pdo->Lock, Irql);
+}
+
 static FORCEINLINE BOOLEAN
 PdoPrepareFresh(
     __in PXENVBD_PDO             Pdo
@@ -2310,7 +2115,6 @@ PdoReset(
     Trace("Target[%d] ====> (Irql=%d)\n", PdoGetTargetId(Pdo), KeGetCurrentIrql());
 
     __PdoPauseDataPath(Pdo, TRUE);
-    PdoAbortAllSrbs(Pdo);
 
     if (QueueCount(&Pdo->SubmittedReqs)) {
         Error("Target[%d] : backend has %u outstanding requests after a PdoReset\n",
@@ -2390,61 +2194,19 @@ PdoStartIo(
     if (!__ValidateSrbForPdo(Pdo, Srb))
         return TRUE;
 
-    switch (Srb->Function) {
-    case SRB_FUNCTION_EXECUTE_SCSI:
-        return __PdoExecuteScsi(Pdo, Srb);
-
-    case SRB_FUNCTION_RESET_DEVICE:
-        return __PdoReset(Pdo, Srb);
-
-    case SRB_FUNCTION_FLUSH:
-    case SRB_FUNCTION_SHUTDOWN:
-        return __PdoQueueShutdown(Pdo, Srb);
-
-    default:
-        return TRUE;
-    }
-}
-
-VOID
-PdoAbortAllSrbs(
-    __in PXENVBD_PDO             Pdo
-    )
-{
-    // Abort Fresh SRBs
-    for (;;) {
-        PXENVBD_SRBEXT  SrbExt;
-        PLIST_ENTRY     Entry = QueuePop(&Pdo->FreshSrbs);
-        if (Entry == NULL)
-            break;
-        SrbExt = CONTAINING_RECORD(Entry, XENVBD_SRBEXT, Entry);
-
-        Verbose("Target[%d] : FreshSrb 0x%p -> SCSI_ABORTED\n", PdoGetTargetId(Pdo), SrbExt->Srb);
-        SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
-        SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED;
-        FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
-    }
-
-    // Fail PreparedReqs
-    for (;;) {
-        PXENVBD_SRBEXT  SrbExt;
-        PXENVBD_REQUEST Request;
-        PLIST_ENTRY     Entry = QueuePop(&Pdo->PreparedReqs);
-        if (Entry == NULL)
-            break;
-        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
-        SrbExt = GetSrbExt(Request->Srb);
+    switch (Srb->Function) {
+    case SRB_FUNCTION_EXECUTE_SCSI:
+        return __PdoExecuteScsi(Pdo, Srb);
 
-        Verbose("Target[%d] : PreparedReq 0x%p -> FAILED\n", PdoGetTargetId(Pdo), Request);
-        
-        SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
-        RequestCleanup(Pdo, Request);
-        __LookasideFree(&Pdo->RequestList, Request);
+    case SRB_FUNCTION_RESET_DEVICE:
+        return __PdoReset(Pdo, Srb);
 
-        if (InterlockedDecrement(&SrbExt->Count) == 0) {
-            SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
-            FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
-        }
+    case SRB_FUNCTION_FLUSH:
+    case SRB_FUNCTION_SHUTDOWN:
+        return __PdoQueueShutdown(Pdo, Srb);
+
+    default:
+        return TRUE;
     }
 }
 
@@ -2697,3 +2459,230 @@ PdoIssueDeviceEject(
     }
 }
 
+__drv_requiresIRQL(DISPATCH_LEVEL)
+VOID
+PdoBackendPathChanged(
+    __in PXENVBD_PDO             Pdo
+    )
+{
+    FrontendBackendPathChanged(Pdo->Frontend);
+}
+
+__checkReturn
+NTSTATUS
+PdoD3ToD0(
+    __in PXENVBD_PDO            Pdo
+    )
+{
+    NTSTATUS                    Status;
+    const ULONG                 TargetId = PdoGetTargetId(Pdo);
+
+    if (!PdoSetDevicePowerState(Pdo, PowerDeviceD0))
+        return STATUS_SUCCESS;
+
+    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
+    Verbose("Target[%d] : D3->D0 (%s)\n", TargetId, Pdo->EmulatedUnplugged ? "PV" : "Emulated");
+
+    // power up frontend
+    Status = FrontendD3ToD0(Pdo->Frontend);
+    if (!NT_SUCCESS(Status))
+        goto fail1;
+
+    // connect frontend
+    if (Pdo->EmulatedUnplugged) {
+        Status = FrontendSetState(Pdo->Frontend, XENVBD_ENABLED);
+        if (!NT_SUCCESS(Status))
+            goto fail2;
+        __PdoUnpauseDataPath(Pdo);
+    }
+
+    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
+    return STATUS_SUCCESS;
+
+fail2:
+    Error("Fail2\n");
+    FrontendD0ToD3(Pdo->Frontend);
+
+fail1:
+    Error("Fail1 (%08x)\n", Status);
+
+    Pdo->DevicePowerState = PowerDeviceD3;
+
+    return Status;
+}
+
+VOID
+PdoD0ToD3(
+    __in PXENVBD_PDO            Pdo
+    )
+{
+    const ULONG                 TargetId = PdoGetTargetId(Pdo);
+
+    if (!PdoSetDevicePowerState(Pdo, PowerDeviceD3))
+        return;
+
+    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
+    Verbose("Target[%d] : D0->D3 (%s)\n", TargetId, Pdo->EmulatedUnplugged ? "PV" : "Emulated");
+
+    // close frontend
+    if (Pdo->EmulatedUnplugged) {
+        __PdoPauseDataPath(Pdo, FALSE);
+        (VOID) FrontendSetState(Pdo->Frontend, XENVBD_CLOSED);
+        ASSERT3U(QueueCount(&Pdo->SubmittedReqs), ==, 0);
+    }
+
+    // power down frontend
+    FrontendD0ToD3(Pdo->Frontend);
+
+    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
+}
+
+__checkReturn
+NTSTATUS
+PdoCreate(
+    __in PXENVBD_FDO             Fdo,
+    __in __nullterminated PCHAR  DeviceId,
+    __in ULONG                   TargetId,
+    __in BOOLEAN                 EmulatedUnplugged,
+    __in PKEVENT                 FrontendEvent,
+    __in XENVBD_DEVICE_TYPE      DeviceType
+    )
+{
+    NTSTATUS    Status;
+    PXENVBD_PDO Pdo;
+
+    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
+
+    Status = STATUS_INSUFFICIENT_RESOURCES;
+#pragma warning(suppress: 6014)
+    Pdo = __PdoAlloc(sizeof(XENVBD_PDO));
+    if (!Pdo)
+        goto fail1;
+
+    Verbose("Target[%d] : Creating (%s)\n", TargetId, EmulatedUnplugged ? "PV" : "Emulated");
+    Pdo->Signature      = PDO_SIGNATURE;
+    Pdo->Fdo            = Fdo;
+    Pdo->DeviceObject   = NULL; // filled in later
+    KeInitializeEvent(&Pdo->RemoveEvent, SynchronizationEvent, FALSE);
+    Pdo->ReferenceCount = 1;
+    Pdo->Paused         = 1; // Paused until D3->D0 transition
+    Pdo->DevicePnpState = Present;
+    Pdo->DevicePowerState = PowerDeviceD3;
+    Pdo->EmulatedUnplugged = EmulatedUnplugged;
+    Pdo->DeviceType     = DeviceType;
+
+    KeInitializeSpinLock(&Pdo->Lock);
+    QueueInit(&Pdo->FreshSrbs);
+    QueueInit(&Pdo->PreparedReqs);
+    QueueInit(&Pdo->SubmittedReqs);
+    QueueInit(&Pdo->ShutdownSrbs);
+
+    Status = FrontendCreate(Pdo, DeviceId, TargetId, FrontendEvent, &Pdo->Frontend);
+    if (!NT_SUCCESS(Status))
+        goto fail2;
+
+    __LookasideInit(&Pdo->RequestList, sizeof(XENVBD_REQUEST), REQUEST_POOL_TAG);
+    __LookasideInit(&Pdo->SegmentList, sizeof(XENVBD_SEGMENT), SEGMENT_POOL_TAG);
+    __LookasideInit(&Pdo->IndirectList, PAGE_SIZE, INDIRECT_POOL_TAG);
+
+    Status = PdoD3ToD0(Pdo);
+    if (!NT_SUCCESS(Status))
+        goto fail3;
+
+    if (!FdoLinkPdo(Fdo, Pdo))
+        goto fail4;
+
+    Verbose("Target[%d] : Created (%s)\n", TargetId, EmulatedUnplugged ? "PV" : "Emulated");
+    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
+    return STATUS_SUCCESS;
+
+fail4:
+    Error("Fail4\n");
+    PdoD0ToD3(Pdo);
+
+fail3:
+    Error("Fail3\n");
+    __LookasideTerm(&Pdo->IndirectList);
+    __LookasideTerm(&Pdo->SegmentList);
+    __LookasideTerm(&Pdo->RequestList);
+    FrontendDestroy(Pdo->Frontend);
+    Pdo->Frontend = NULL;
+
+fail2:
+    Error("Fail2\n");
+    __PdoFree(Pdo);
+
+fail1:
+    Error("Fail1 (%08x)\n", Status);
+    return Status;
+}
+
+VOID
+PdoDestroy(
+    __in PXENVBD_PDO    Pdo
+    )
+{
+    const ULONG         TargetId = PdoGetTargetId(Pdo);
+    PVOID               Objects[4];
+    PKWAIT_BLOCK        WaitBlock;
+
+    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
+    Verbose("Target[%d] : Destroying\n", TargetId);
+
+    ASSERT3U(Pdo->Signature, ==, PDO_SIGNATURE);
+    if (!FdoUnlinkPdo(PdoGetFdo(Pdo), Pdo)) {
+        Error("Target[%d] : PDO 0x%p not linked to FDO 0x%p\n", TargetId, Pdo, PdoGetFdo(Pdo));
+    }
+
+    PdoD0ToD3(Pdo);
+    PdoDereference(Pdo); // drop initial ref count
+
+    // Wait for ReferenceCount == 0 and RequestListUsed == 0
+    Verbose("Target[%d] : ReferenceCount %d, RequestListUsed %d\n", TargetId, Pdo->ReferenceCount, Pdo->RequestList.Used);
+    Objects[0] = &Pdo->RemoveEvent;
+    Objects[1] = &Pdo->RequestList.Empty;
+    Objects[2] = &Pdo->SegmentList.Empty;
+    Objects[3] = &Pdo->IndirectList.Empty;
+
+    WaitBlock = (PKWAIT_BLOCK)__PdoAlloc(sizeof(KWAIT_BLOCK) * ARRAYSIZE(Objects));
+    if (WaitBlock == NULL) {
+        ULONG   Index;
+
+        Error("Unable to allocate resources for KWAIT_BLOCK\n");
+
+        for (Index = 0; Index < ARRAYSIZE(Objects); Index++)
+            KeWaitForSingleObject(Objects[Index],
+                                  Executive,
+                                  KernelMode,
+                                  FALSE,
+                                  NULL);
+    } else {
+        KeWaitForMultipleObjects(ARRAYSIZE(Objects),
+                                 Objects,
+                                 WaitAll,
+                                 Executive,
+                                 KernelMode,
+                                 FALSE,
+                                 NULL,
+                                 WaitBlock);
+#pragma prefast(suppress:6102)
+        __PdoFree(WaitBlock);
+    }
+
+    ASSERT3S(Pdo->ReferenceCount, ==, 0);
+    ASSERT3U(PdoGetDevicePnpState(Pdo), ==, Deleted);
+
+    __LookasideTerm(&Pdo->IndirectList);
+    __LookasideTerm(&Pdo->SegmentList);
+    __LookasideTerm(&Pdo->RequestList);
+
+    FrontendDestroy(Pdo->Frontend);
+    Pdo->Frontend = NULL;
+
+    ASSERT3U(Pdo->Signature, ==, PDO_SIGNATURE);
+    RtlZeroMemory(Pdo, sizeof(XENVBD_PDO));
+    __PdoFree(Pdo);
+
+    Verbose("Target[%d] : Destroyed\n", TargetId);
+    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
+}
diff --git a/src/xenvbd/pdo.h b/src/xenvbd/pdo.h
index c5e81ab..fbd6681 100644
--- a/src/xenvbd/pdo.h
+++ b/src/xenvbd/pdo.h
@@ -213,11 +213,6 @@ PdoStartIo(
     );
 
 extern VOID
-PdoAbortAllSrbs(
-    __in PXENVBD_PDO             Pdo
-    );
-
-extern VOID
 PdoSrbPnp(
     __in PXENVBD_PDO             Pdo,
     __in PSCSI_PNP_REQUEST_BLOCK Srb
-- 
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 Tue Oct 27 11:16:09 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 11: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 1Zr2Eb-0003I5-Jt; Tue, 27 Oct 2015 11:16:09 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=735ca0e81=owen.smith@citrix.com>)
	id 1Zr2EZ-0003HK-OH
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 11:16:07 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	53/64-30270-7FC5F265; Tue, 27 Oct 2015 11:16:07 +0000
X-Env-Sender: prvs=735ca0e81=owen.smith@citrix.com
X-Msg-Ref: server-4.tower-206.messagelabs.com!1445944560!45416663!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 29626 invoked from network); 27 Oct 2015 11:16:02 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-4.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2015 11:16:02 -0000
X-IronPort-AV: E=Sophos;i="5.20,204,1444694400"; d="scan'208";a="313676560"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 27 Oct 2015 11:15:44 +0000
Message-ID: <1445944546-21500-7-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 6/8] Prepare calls only need to return
	success/failure, not an error 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>
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: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/pdo.c | 260 ++++++++++++++++++++++++++-----------------------------
 1 file changed, 124 insertions(+), 136 deletions(-)

diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index 4e88302..5023a93 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -869,7 +869,7 @@ RequestCopyOutput(
     }
 }
 
-static NTSTATUS
+static BOOLEAN
 PrepareSegment(
     IN  PXENVBD_PDO             Pdo,
     IN  PXENVBD_SEGMENT         Segment,
@@ -880,7 +880,7 @@ PrepareSegment(
     )
 {
     PFN_NUMBER      Pfn;
-    NTSTATUS        Status = STATUS_UNSUCCESSFUL;
+    NTSTATUS        Status;
     PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
     const ULONG     SectorSize = PdoSectorSize(Pdo);
     const ULONG     SectorsPerPage = __SectorsPerPage(SectorSize);
@@ -908,13 +908,13 @@ PrepareSegment(
         // map SGList to Virtual Address. Populates Segment->Buffer and Segment->Length
         if (!MapSegmentBuffer(Pdo, Segment, SGList, SectorSize, *SectorsNow)) {
             ++Pdo->FailedMaps;
-            goto fail;
+            goto fail1;
         }
 
         // get a buffer
         if (!BufferGet(Segment, &Segment->BufferId, &Pfn)) {
             ++Pdo->FailedBounces;
-            goto fail;
+            goto fail2;
         }
 
         // copy contents in
@@ -927,16 +927,18 @@ PrepareSegment(
     Status = GranterGet(Granter, Pfn, ReadOnly, &Segment->Grant);
     if (!NT_SUCCESS(Status)) {
         ++Pdo->FailedGrants;
-        goto fail;
+        goto fail3;
     }
 
-    return STATUS_SUCCESS;
+    return TRUE;
 
-fail:
-    return Status;
+fail3:
+fail2:
+fail1:
+    return FALSE;
 }
 
-static NTSTATUS
+static BOOLEAN
 PrepareBlkifReadWrite(
     IN  PXENVBD_PDO             Pdo,
     IN  PXENVBD_REQUEST         Request,
@@ -947,7 +949,6 @@ PrepareBlkifReadWrite(
     OUT PULONG                  SectorsDone
     )
 {
-    NTSTATUS        Status;
     UCHAR           Operation;
     BOOLEAN         ReadOnly;
     ULONG           Index;
@@ -965,20 +966,18 @@ PrepareBlkifReadWrite(
         ULONG           SectorsNow;
 
         Segment = __LookasideAlloc(&Pdo->SegmentList);
-        Status = STATUS_NO_MEMORY;
         if (Segment == NULL)
             goto fail1;
 
         InsertTailList(&Request->Segments, &Segment->Entry);
         ++Request->NrSegments;
 
-        Status = PrepareSegment(Pdo,
-                                Segment,
-                                SGList,
-                                ReadOnly,
-                                SectorsLeft,
-                                &SectorsNow);
-        if (!NT_SUCCESS(Status))
+        if (!PrepareSegment(Pdo,
+                            Segment,
+                            SGList,
+                            ReadOnly,
+                            SectorsLeft,
+                            &SectorsNow))
             goto fail2;
 
         *SectorsDone += SectorsNow;
@@ -987,14 +986,14 @@ PrepareBlkifReadWrite(
     ASSERT3U(Request->NrSegments, >, 0);
     ASSERT3U(Request->NrSegments, <=, MaxSegments);
 
-    return STATUS_SUCCESS;
+    return TRUE;
 
 fail2:
 fail1:
-    return Status;
+    return FALSE;
 }
 
-static NTSTATUS
+static BOOLEAN
 PrepareBlkifIndirect(
     IN  PXENVBD_PDO             Pdo,
     IN  PXENVBD_REQUEST         Request
@@ -1010,8 +1009,6 @@ PrepareBlkifIndirect(
             NrSegments < Request->NrSegments;
                 ++Index) {
         Request->Pages[Index] = __LookasideAlloc(&Pdo->IndirectList);
-
-        status = STATUS_NO_MEMORY;
         if (Request->Pages[Index] == NULL)
             goto fail1;
 
@@ -1025,11 +1022,11 @@ PrepareBlkifIndirect(
         NrSegments += XENVBD_MAX_SEGMENTS_PER_PAGE;
     }
 
-    return STATUS_SUCCESS;
+    return TRUE;
 
 fail2:
 fail1:
-    return status;
+    return FALSE;
 }
 
 static FORCEINLINE ULONG
@@ -1050,130 +1047,148 @@ UseIndirect(
     return MaxIndirectSegs;
 }
 
+static FORCEINLINE ULONG
+PdoQueueRequestList(
+    IN  PXENVBD_PDO     Pdo,
+    IN  PLIST_ENTRY     List
+    )
+{
+    ULONG               Count = 0;
+    for (;;) {
+        PXENVBD_REQUEST Request;
+        PLIST_ENTRY     Entry;
+
+        Entry = RemoveHeadList(List);
+        if (Entry == List)
+            break;
+
+        ++Count;
+        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
+        __PdoIncBlkifOpCount(Pdo, Request);
+        QueueAppend(&Pdo->PreparedReqs, &Request->Entry);
+    }
+    return Count;
+}
+
+static FORCEINLINE VOID
+PdoCancelRequestList(
+    IN  PXENVBD_PDO     Pdo,
+    IN  PLIST_ENTRY     List
+    )
+{
+    for (;;) {
+        PXENVBD_REQUEST Request;
+        PLIST_ENTRY     Entry;
+
+        Entry = RemoveHeadList(List);
+        if (Entry == List)
+            break;
+
+        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
+        __LookasideFree(&Pdo->RequestList, Request);
+    }
+}
+
 __checkReturn
-static NTSTATUS
+static BOOLEAN
 PrepareReadWrite(
     __in PXENVBD_PDO             Pdo,
     __in PSCSI_REQUEST_BLOCK     Srb
     )
 {
-    NTSTATUS        Status;
-    LIST_ENTRY      ReqList;
-    XENVBD_SG_LIST  SGList;
     PXENVBD_SRBEXT  SrbExt = GetSrbExt(Srb);
     ULONG64         SectorStart = Cdb_LogicalBlock(Srb);
     ULONG           SectorsLeft = Cdb_TransferBlock(Srb);
+    LIST_ENTRY      List;
+    XENVBD_SG_LIST  SGList;
 
-    InitializeListHead(&ReqList);
-    RtlZeroMemory(&SGList, sizeof(SGList));
-    SGList.SGList = StorPortGetScatterGatherList(PdoGetFdo(Pdo), Srb);
-
+    InitializeListHead(&List);
     SrbExt->Count = 0;
-    // mark the SRB as pending, completion will check for pending to detect failures
     Srb->SrbStatus = SRB_STATUS_PENDING;
 
+    RtlZeroMemory(&SGList, sizeof(SGList));
+    SGList.SGList = StorPortGetScatterGatherList(PdoGetFdo(Pdo), Srb);
+
     while (SectorsLeft > 0) {
         ULONG           MaxSegments;
         ULONG           SectorsDone = 0;
-        PXENVBD_REQUEST Request = __LookasideAlloc(&Pdo->RequestList);
+        PXENVBD_REQUEST Request;
 
-        Status = STATUS_NO_MEMORY;
+        Request = __LookasideAlloc(&Pdo->RequestList);
         if (Request == NULL) 
-            goto fail;
+            goto fail1;
+        InsertTailList(&List, &Request->Entry);
         
         Request->Srb    = Srb;
         Request->Id     = PdoGetTag(Pdo);
         InitializeListHead(&Request->Segments);
-        InsertTailList(&ReqList, &Request->Entry);
 
         MaxSegments = UseIndirect(Pdo, SectorsLeft);
 
-        Status = PrepareBlkifReadWrite(Pdo,
-                                       Request,
-                                       &SGList,
-                                       MaxSegments,
-                                       SectorStart,
-                                       SectorsLeft,
-                                       &SectorsDone);
-        if (!NT_SUCCESS(Status))
-            goto fail;
+        if (!PrepareBlkifReadWrite(Pdo,
+                                   Request,
+                                   &SGList,
+                                   MaxSegments,
+                                   SectorStart,
+                                   SectorsLeft,
+                                   &SectorsDone))
+            goto fail2;
 
         if (MaxSegments > BLKIF_MAX_SEGMENTS_PER_REQUEST) {
-            Status = PrepareBlkifIndirect(Pdo,
-                                          Request);
-            if (!NT_SUCCESS(Status))
-                goto fail;
+            if (!PrepareBlkifIndirect(Pdo, Request))
+                goto fail3;
         }
 
         SectorsLeft -= SectorsDone;
         SectorStart += SectorsDone;
     }
 
-    // completed preparing SRB, move requests to pending queue
-    for (;;) {
-        PXENVBD_REQUEST Request;
-        PLIST_ENTRY     Entry;
-
-        Entry = RemoveHeadList(&ReqList);
-        if (Entry == &ReqList)
-            break;
-
-        ++SrbExt->Count;
-        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
-
-        __PdoIncBlkifOpCount(Pdo, Request);
-        QueueAppend(&Pdo->PreparedReqs, Entry);
-    }
-    return STATUS_SUCCESS;
-
-fail:
-    for (;;) {
-        PXENVBD_REQUEST Request;
-        PLIST_ENTRY     Entry;
-
-        Entry = RemoveHeadList(&ReqList);
-        if (Entry == &ReqList)
-            break;
-
-        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
+    SrbExt->Count = PdoQueueRequestList(Pdo, &List);
+    return TRUE;
 
-        RequestCleanup(Pdo, Request);
-        __LookasideFree(&Pdo->RequestList, Request);
-    }
-    ASSERT3S(SrbExt->Count, ==, 0);
-    ASSERT(!NT_SUCCESS(Status));
-    return Status;
+fail3:
+fail2:
+fail1:
+    PdoCancelRequestList(Pdo, &List);
+    return FALSE;
 }
 
 __checkReturn
-static NTSTATUS
+static BOOLEAN
 PrepareSyncCache(
     __in PXENVBD_PDO             Pdo,
     __in PSCSI_REQUEST_BLOCK     Srb
     )
 {
-    PXENVBD_SRBEXT  SrbExt = GetSrbExt(Srb);
-    PXENVBD_REQUEST Request = __LookasideAlloc(&Pdo->RequestList);
-    if (Request == NULL)
-        return STATUS_UNSUCCESSFUL;
+    PXENVBD_SRBEXT      SrbExt = GetSrbExt(Srb);
+    PXENVBD_REQUEST     Request;
+    LIST_ENTRY          List;
     
-    SrbExt->Count = 1;
-    // mark the SRB as pending, completion will check for pending to detect failures
+    InitializeListHead(&List);
+    SrbExt->Count = 0;
     Srb->SrbStatus = SRB_STATUS_PENDING;
 
+    Request = __LookasideAlloc(&Pdo->RequestList);
+    if (Request == NULL)
+        goto fail1;
+    InsertTailList(&List, &Request->Entry);
+    
     Request->Srb        = Srb;
     Request->Id         = PdoGetTag(Pdo);
     Request->Operation  = BLKIF_OP_WRITE_BARRIER;
     Request->FirstSector = Cdb_LogicalBlock(Srb);
     InitializeListHead(&Request->Segments);
 
-    __PdoIncBlkifOpCount(Pdo, Request);
-    QueueAppend(&Pdo->PreparedReqs, &Request->Entry);
-    return STATUS_SUCCESS;
+    SrbExt->Count = PdoQueueRequestList(Pdo, &List);
+    return TRUE;
+
+fail1:
+    PdoCancelRequestList(Pdo, &List);
+    return FALSE;
 }
 
 __checkReturn
-static NTSTATUS
+static BOOLEAN
 PrepareUnmap(
     __in PXENVBD_PDO             Pdo,
     __in PSCSI_REQUEST_BLOCK     Srb
@@ -1192,11 +1207,11 @@ PrepareUnmap(
 
     for (Index = 0; Index < Count; ++Index) {
         PUNMAP_BLOCK_DESCRIPTOR Descr = &Unmap->Descriptors[Index];
-        PXENVBD_REQUEST         Request = __LookasideAlloc(&Pdo->RequestList);
+        PXENVBD_REQUEST         Request;
+
+        Request = __LookasideAlloc(&Pdo->RequestList);
         if (Request == NULL)
             goto fail1;
-
-        ++SrbExt->Count;
         InsertTailList(&List, &Request->Entry);
 
         Request->Srb            = Srb;
@@ -1208,36 +1223,12 @@ PrepareUnmap(
         InitializeListHead(&Request->Segments);
     }
 
-    for (;;) {
-        PXENVBD_REQUEST Request;
-        PLIST_ENTRY     Entry;
-
-        Entry = RemoveHeadList(&List);
-        if (Entry == &List)
-            break;
-
-        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
-        __PdoIncBlkifOpCount(Pdo, Request);
-        QueueAppend(&Pdo->PreparedReqs, &Request->Entry);
-    }
-
-    return STATUS_SUCCESS;
-
+    SrbExt->Count = PdoQueueRequestList(Pdo, &List);
+    return TRUE;
 
 fail1:
-    for (;;) {
-        PXENVBD_REQUEST Request;
-        PLIST_ENTRY     Entry;
-
-        Entry = RemoveHeadList(&List);
-        if (Entry == &List)
-            break;
-
-        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
-        __LookasideFree(&Pdo->RequestList, Request);
-        --SrbExt->Count;
-    }
-    return STATUS_NO_MEMORY;
+    PdoCancelRequestList(Pdo, &List);
+    return FALSE;
 }
 
 //=============================================================================
@@ -1329,10 +1320,9 @@ __PdoUnpauseDataPath(
 
 static FORCEINLINE BOOLEAN
 PdoPrepareFresh(
-    __in PXENVBD_PDO             Pdo
+    IN  PXENVBD_PDO         Pdo
     )
 {
-    NTSTATUS        Status;
     PXENVBD_SRBEXT  SrbExt;
     PLIST_ENTRY     Entry;
 
@@ -1345,23 +1335,21 @@ PdoPrepareFresh(
     switch (Cdb_OperationEx(SrbExt->Srb)) {
     case SCSIOP_READ:
     case SCSIOP_WRITE:
-        Status = PrepareReadWrite(Pdo, SrbExt->Srb);
+        if (PrepareReadWrite(Pdo, SrbExt->Srb))
+            return TRUE;    // prepared this SRB
         break;
     case SCSIOP_SYNCHRONIZE_CACHE:
-        Status = PrepareSyncCache(Pdo, SrbExt->Srb);
+        if (PrepareSyncCache(Pdo, SrbExt->Srb))
+            return TRUE;    // prepared this SRB
         break;
     case SCSIOP_UNMAP:
-        Status = PrepareUnmap(Pdo, SrbExt->Srb);
+        if (PrepareUnmap(Pdo, SrbExt->Srb))
+            return TRUE;    // prepared this SRB
         break;
     default:
         ASSERT(FALSE);
-        Status = STATUS_NOT_SUPPORTED;
         break;
     }
-
-    if (NT_SUCCESS(Status))
-        return TRUE;    // prepared this SRB
-
     QueueUnPop(&Pdo->FreshSrbs, &SrbExt->Entry);
     return FALSE;       // prepare failed
 }
-- 
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 Tue Oct 27 11:16:09 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 11: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 1Zr2Eb-0003I5-Jt; Tue, 27 Oct 2015 11:16:09 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=735ca0e81=owen.smith@citrix.com>)
	id 1Zr2EZ-0003HK-OH
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 11:16:07 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	53/64-30270-7FC5F265; Tue, 27 Oct 2015 11:16:07 +0000
X-Env-Sender: prvs=735ca0e81=owen.smith@citrix.com
X-Msg-Ref: server-4.tower-206.messagelabs.com!1445944560!45416663!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 29626 invoked from network); 27 Oct 2015 11:16:02 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-4.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2015 11:16:02 -0000
X-IronPort-AV: E=Sophos;i="5.20,204,1444694400"; d="scan'208";a="313676560"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 27 Oct 2015 11:15:44 +0000
Message-ID: <1445944546-21500-7-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 6/8] Prepare calls only need to return
	success/failure, not an error 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>
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: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/pdo.c | 260 ++++++++++++++++++++++++++-----------------------------
 1 file changed, 124 insertions(+), 136 deletions(-)

diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index 4e88302..5023a93 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -869,7 +869,7 @@ RequestCopyOutput(
     }
 }
 
-static NTSTATUS
+static BOOLEAN
 PrepareSegment(
     IN  PXENVBD_PDO             Pdo,
     IN  PXENVBD_SEGMENT         Segment,
@@ -880,7 +880,7 @@ PrepareSegment(
     )
 {
     PFN_NUMBER      Pfn;
-    NTSTATUS        Status = STATUS_UNSUCCESSFUL;
+    NTSTATUS        Status;
     PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
     const ULONG     SectorSize = PdoSectorSize(Pdo);
     const ULONG     SectorsPerPage = __SectorsPerPage(SectorSize);
@@ -908,13 +908,13 @@ PrepareSegment(
         // map SGList to Virtual Address. Populates Segment->Buffer and Segment->Length
         if (!MapSegmentBuffer(Pdo, Segment, SGList, SectorSize, *SectorsNow)) {
             ++Pdo->FailedMaps;
-            goto fail;
+            goto fail1;
         }
 
         // get a buffer
         if (!BufferGet(Segment, &Segment->BufferId, &Pfn)) {
             ++Pdo->FailedBounces;
-            goto fail;
+            goto fail2;
         }
 
         // copy contents in
@@ -927,16 +927,18 @@ PrepareSegment(
     Status = GranterGet(Granter, Pfn, ReadOnly, &Segment->Grant);
     if (!NT_SUCCESS(Status)) {
         ++Pdo->FailedGrants;
-        goto fail;
+        goto fail3;
     }
 
-    return STATUS_SUCCESS;
+    return TRUE;
 
-fail:
-    return Status;
+fail3:
+fail2:
+fail1:
+    return FALSE;
 }
 
-static NTSTATUS
+static BOOLEAN
 PrepareBlkifReadWrite(
     IN  PXENVBD_PDO             Pdo,
     IN  PXENVBD_REQUEST         Request,
@@ -947,7 +949,6 @@ PrepareBlkifReadWrite(
     OUT PULONG                  SectorsDone
     )
 {
-    NTSTATUS        Status;
     UCHAR           Operation;
     BOOLEAN         ReadOnly;
     ULONG           Index;
@@ -965,20 +966,18 @@ PrepareBlkifReadWrite(
         ULONG           SectorsNow;
 
         Segment = __LookasideAlloc(&Pdo->SegmentList);
-        Status = STATUS_NO_MEMORY;
         if (Segment == NULL)
             goto fail1;
 
         InsertTailList(&Request->Segments, &Segment->Entry);
         ++Request->NrSegments;
 
-        Status = PrepareSegment(Pdo,
-                                Segment,
-                                SGList,
-                                ReadOnly,
-                                SectorsLeft,
-                                &SectorsNow);
-        if (!NT_SUCCESS(Status))
+        if (!PrepareSegment(Pdo,
+                            Segment,
+                            SGList,
+                            ReadOnly,
+                            SectorsLeft,
+                            &SectorsNow))
             goto fail2;
 
         *SectorsDone += SectorsNow;
@@ -987,14 +986,14 @@ PrepareBlkifReadWrite(
     ASSERT3U(Request->NrSegments, >, 0);
     ASSERT3U(Request->NrSegments, <=, MaxSegments);
 
-    return STATUS_SUCCESS;
+    return TRUE;
 
 fail2:
 fail1:
-    return Status;
+    return FALSE;
 }
 
-static NTSTATUS
+static BOOLEAN
 PrepareBlkifIndirect(
     IN  PXENVBD_PDO             Pdo,
     IN  PXENVBD_REQUEST         Request
@@ -1010,8 +1009,6 @@ PrepareBlkifIndirect(
             NrSegments < Request->NrSegments;
                 ++Index) {
         Request->Pages[Index] = __LookasideAlloc(&Pdo->IndirectList);
-
-        status = STATUS_NO_MEMORY;
         if (Request->Pages[Index] == NULL)
             goto fail1;
 
@@ -1025,11 +1022,11 @@ PrepareBlkifIndirect(
         NrSegments += XENVBD_MAX_SEGMENTS_PER_PAGE;
     }
 
-    return STATUS_SUCCESS;
+    return TRUE;
 
 fail2:
 fail1:
-    return status;
+    return FALSE;
 }
 
 static FORCEINLINE ULONG
@@ -1050,130 +1047,148 @@ UseIndirect(
     return MaxIndirectSegs;
 }
 
+static FORCEINLINE ULONG
+PdoQueueRequestList(
+    IN  PXENVBD_PDO     Pdo,
+    IN  PLIST_ENTRY     List
+    )
+{
+    ULONG               Count = 0;
+    for (;;) {
+        PXENVBD_REQUEST Request;
+        PLIST_ENTRY     Entry;
+
+        Entry = RemoveHeadList(List);
+        if (Entry == List)
+            break;
+
+        ++Count;
+        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
+        __PdoIncBlkifOpCount(Pdo, Request);
+        QueueAppend(&Pdo->PreparedReqs, &Request->Entry);
+    }
+    return Count;
+}
+
+static FORCEINLINE VOID
+PdoCancelRequestList(
+    IN  PXENVBD_PDO     Pdo,
+    IN  PLIST_ENTRY     List
+    )
+{
+    for (;;) {
+        PXENVBD_REQUEST Request;
+        PLIST_ENTRY     Entry;
+
+        Entry = RemoveHeadList(List);
+        if (Entry == List)
+            break;
+
+        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
+        __LookasideFree(&Pdo->RequestList, Request);
+    }
+}
+
 __checkReturn
-static NTSTATUS
+static BOOLEAN
 PrepareReadWrite(
     __in PXENVBD_PDO             Pdo,
     __in PSCSI_REQUEST_BLOCK     Srb
     )
 {
-    NTSTATUS        Status;
-    LIST_ENTRY      ReqList;
-    XENVBD_SG_LIST  SGList;
     PXENVBD_SRBEXT  SrbExt = GetSrbExt(Srb);
     ULONG64         SectorStart = Cdb_LogicalBlock(Srb);
     ULONG           SectorsLeft = Cdb_TransferBlock(Srb);
+    LIST_ENTRY      List;
+    XENVBD_SG_LIST  SGList;
 
-    InitializeListHead(&ReqList);
-    RtlZeroMemory(&SGList, sizeof(SGList));
-    SGList.SGList = StorPortGetScatterGatherList(PdoGetFdo(Pdo), Srb);
-
+    InitializeListHead(&List);
     SrbExt->Count = 0;
-    // mark the SRB as pending, completion will check for pending to detect failures
     Srb->SrbStatus = SRB_STATUS_PENDING;
 
+    RtlZeroMemory(&SGList, sizeof(SGList));
+    SGList.SGList = StorPortGetScatterGatherList(PdoGetFdo(Pdo), Srb);
+
     while (SectorsLeft > 0) {
         ULONG           MaxSegments;
         ULONG           SectorsDone = 0;
-        PXENVBD_REQUEST Request = __LookasideAlloc(&Pdo->RequestList);
+        PXENVBD_REQUEST Request;
 
-        Status = STATUS_NO_MEMORY;
+        Request = __LookasideAlloc(&Pdo->RequestList);
         if (Request == NULL) 
-            goto fail;
+            goto fail1;
+        InsertTailList(&List, &Request->Entry);
         
         Request->Srb    = Srb;
         Request->Id     = PdoGetTag(Pdo);
         InitializeListHead(&Request->Segments);
-        InsertTailList(&ReqList, &Request->Entry);
 
         MaxSegments = UseIndirect(Pdo, SectorsLeft);
 
-        Status = PrepareBlkifReadWrite(Pdo,
-                                       Request,
-                                       &SGList,
-                                       MaxSegments,
-                                       SectorStart,
-                                       SectorsLeft,
-                                       &SectorsDone);
-        if (!NT_SUCCESS(Status))
-            goto fail;
+        if (!PrepareBlkifReadWrite(Pdo,
+                                   Request,
+                                   &SGList,
+                                   MaxSegments,
+                                   SectorStart,
+                                   SectorsLeft,
+                                   &SectorsDone))
+            goto fail2;
 
         if (MaxSegments > BLKIF_MAX_SEGMENTS_PER_REQUEST) {
-            Status = PrepareBlkifIndirect(Pdo,
-                                          Request);
-            if (!NT_SUCCESS(Status))
-                goto fail;
+            if (!PrepareBlkifIndirect(Pdo, Request))
+                goto fail3;
         }
 
         SectorsLeft -= SectorsDone;
         SectorStart += SectorsDone;
     }
 
-    // completed preparing SRB, move requests to pending queue
-    for (;;) {
-        PXENVBD_REQUEST Request;
-        PLIST_ENTRY     Entry;
-
-        Entry = RemoveHeadList(&ReqList);
-        if (Entry == &ReqList)
-            break;
-
-        ++SrbExt->Count;
-        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
-
-        __PdoIncBlkifOpCount(Pdo, Request);
-        QueueAppend(&Pdo->PreparedReqs, Entry);
-    }
-    return STATUS_SUCCESS;
-
-fail:
-    for (;;) {
-        PXENVBD_REQUEST Request;
-        PLIST_ENTRY     Entry;
-
-        Entry = RemoveHeadList(&ReqList);
-        if (Entry == &ReqList)
-            break;
-
-        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
+    SrbExt->Count = PdoQueueRequestList(Pdo, &List);
+    return TRUE;
 
-        RequestCleanup(Pdo, Request);
-        __LookasideFree(&Pdo->RequestList, Request);
-    }
-    ASSERT3S(SrbExt->Count, ==, 0);
-    ASSERT(!NT_SUCCESS(Status));
-    return Status;
+fail3:
+fail2:
+fail1:
+    PdoCancelRequestList(Pdo, &List);
+    return FALSE;
 }
 
 __checkReturn
-static NTSTATUS
+static BOOLEAN
 PrepareSyncCache(
     __in PXENVBD_PDO             Pdo,
     __in PSCSI_REQUEST_BLOCK     Srb
     )
 {
-    PXENVBD_SRBEXT  SrbExt = GetSrbExt(Srb);
-    PXENVBD_REQUEST Request = __LookasideAlloc(&Pdo->RequestList);
-    if (Request == NULL)
-        return STATUS_UNSUCCESSFUL;
+    PXENVBD_SRBEXT      SrbExt = GetSrbExt(Srb);
+    PXENVBD_REQUEST     Request;
+    LIST_ENTRY          List;
     
-    SrbExt->Count = 1;
-    // mark the SRB as pending, completion will check for pending to detect failures
+    InitializeListHead(&List);
+    SrbExt->Count = 0;
     Srb->SrbStatus = SRB_STATUS_PENDING;
 
+    Request = __LookasideAlloc(&Pdo->RequestList);
+    if (Request == NULL)
+        goto fail1;
+    InsertTailList(&List, &Request->Entry);
+    
     Request->Srb        = Srb;
     Request->Id         = PdoGetTag(Pdo);
     Request->Operation  = BLKIF_OP_WRITE_BARRIER;
     Request->FirstSector = Cdb_LogicalBlock(Srb);
     InitializeListHead(&Request->Segments);
 
-    __PdoIncBlkifOpCount(Pdo, Request);
-    QueueAppend(&Pdo->PreparedReqs, &Request->Entry);
-    return STATUS_SUCCESS;
+    SrbExt->Count = PdoQueueRequestList(Pdo, &List);
+    return TRUE;
+
+fail1:
+    PdoCancelRequestList(Pdo, &List);
+    return FALSE;
 }
 
 __checkReturn
-static NTSTATUS
+static BOOLEAN
 PrepareUnmap(
     __in PXENVBD_PDO             Pdo,
     __in PSCSI_REQUEST_BLOCK     Srb
@@ -1192,11 +1207,11 @@ PrepareUnmap(
 
     for (Index = 0; Index < Count; ++Index) {
         PUNMAP_BLOCK_DESCRIPTOR Descr = &Unmap->Descriptors[Index];
-        PXENVBD_REQUEST         Request = __LookasideAlloc(&Pdo->RequestList);
+        PXENVBD_REQUEST         Request;
+
+        Request = __LookasideAlloc(&Pdo->RequestList);
         if (Request == NULL)
             goto fail1;
-
-        ++SrbExt->Count;
         InsertTailList(&List, &Request->Entry);
 
         Request->Srb            = Srb;
@@ -1208,36 +1223,12 @@ PrepareUnmap(
         InitializeListHead(&Request->Segments);
     }
 
-    for (;;) {
-        PXENVBD_REQUEST Request;
-        PLIST_ENTRY     Entry;
-
-        Entry = RemoveHeadList(&List);
-        if (Entry == &List)
-            break;
-
-        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
-        __PdoIncBlkifOpCount(Pdo, Request);
-        QueueAppend(&Pdo->PreparedReqs, &Request->Entry);
-    }
-
-    return STATUS_SUCCESS;
-
+    SrbExt->Count = PdoQueueRequestList(Pdo, &List);
+    return TRUE;
 
 fail1:
-    for (;;) {
-        PXENVBD_REQUEST Request;
-        PLIST_ENTRY     Entry;
-
-        Entry = RemoveHeadList(&List);
-        if (Entry == &List)
-            break;
-
-        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
-        __LookasideFree(&Pdo->RequestList, Request);
-        --SrbExt->Count;
-    }
-    return STATUS_NO_MEMORY;
+    PdoCancelRequestList(Pdo, &List);
+    return FALSE;
 }
 
 //=============================================================================
@@ -1329,10 +1320,9 @@ __PdoUnpauseDataPath(
 
 static FORCEINLINE BOOLEAN
 PdoPrepareFresh(
-    __in PXENVBD_PDO             Pdo
+    IN  PXENVBD_PDO         Pdo
     )
 {
-    NTSTATUS        Status;
     PXENVBD_SRBEXT  SrbExt;
     PLIST_ENTRY     Entry;
 
@@ -1345,23 +1335,21 @@ PdoPrepareFresh(
     switch (Cdb_OperationEx(SrbExt->Srb)) {
     case SCSIOP_READ:
     case SCSIOP_WRITE:
-        Status = PrepareReadWrite(Pdo, SrbExt->Srb);
+        if (PrepareReadWrite(Pdo, SrbExt->Srb))
+            return TRUE;    // prepared this SRB
         break;
     case SCSIOP_SYNCHRONIZE_CACHE:
-        Status = PrepareSyncCache(Pdo, SrbExt->Srb);
+        if (PrepareSyncCache(Pdo, SrbExt->Srb))
+            return TRUE;    // prepared this SRB
         break;
     case SCSIOP_UNMAP:
-        Status = PrepareUnmap(Pdo, SrbExt->Srb);
+        if (PrepareUnmap(Pdo, SrbExt->Srb))
+            return TRUE;    // prepared this SRB
         break;
     default:
         ASSERT(FALSE);
-        Status = STATUS_NOT_SUPPORTED;
         break;
     }
-
-    if (NT_SUCCESS(Status))
-        return TRUE;    // prepared this SRB
-
     QueueUnPop(&Pdo->FreshSrbs, &SrbExt->Entry);
     return FALSE;       // prepare failed
 }
-- 
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 Tue Oct 27 15:03:44 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 15:03: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 1Zr5mp-00005j-EF; Tue, 27 Oct 2015 15:03:43 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <lars.kurth.xen@gmail.com>)
	id 1Zr5mo-00005P-8b; Tue, 27 Oct 2015 15:03:42 +0000
Received: from [85.158.137.68] by server-5.bemta-3.messagelabs.com id
	39/3E-01748-D429F265; Tue, 27 Oct 2015 15:03:41 +0000
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-11.tower-31.messagelabs.com!1445958219!24421500!1
X-Originating-IP: [209.85.212.176]
X-SpamReason: No, hits=0.1 required=7.0 tests=HTML_50_60,HTML_MESSAGE,
	ML_RADAR_SPEW_LINKS_8,spamassassin: 
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28653 invoked from network); 27 Oct 2015 15:03:39 -0000
Received: from mail-wi0-f176.google.com (HELO mail-wi0-f176.google.com)
	(209.85.212.176)
	by server-11.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2015 15:03:39 -0000
Received: by wikq8 with SMTP id q8so215900541wik.1;
	Tue, 27 Oct 2015 08:03:39 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:content-type:subject:date:message-id:cc:to:mime-version;
	bh=DcA2MYzLHcY2XEJLVyKsk2peIYu7TQi9FdXYNZsir4k=;
	b=D9uavRQK7bgxFjauhmXFPDMb0ppqTwTbsWPS2+fxZN4ZwAIlg2rFx1F7KRS6Is5b6K
	gBa+Wmmg2va5cFpt+wIyaoD9Qwxqqw0ncILVO98r6WKLuJP6cDTgPXpe7dE7pAn+V2z9
	9V5HszEEmnTGn+8HnHh3H0V7kMkjI9A6IhzxXxYj+hCQyNqJXvefr9beJbP0dmMYsixl
	BFo3mNH/xlKfpa2u+4OQCJStJJyY3iGim/cnS8CeqptaQesUusiZqu5UD5SdK2ritSIE
	79UczzJ2G0qidq3ZhDF/M2lgbuUAmtb0lZMimmPQsM6cafwlbK5Z1XfgvYMMARC9th5f
	CWDg==
X-Received: by 10.180.74.47 with SMTP id q15mr28873970wiv.73.1445958218650;
	Tue, 27 Oct 2015 08:03:38 -0700 (PDT)
Received: from [192.168.0.9] (97e3cc8b.skybroadband.com. [151.227.204.139])
	by smtp.gmail.com with ESMTPSA id
	ly4sm45242035wjb.4.2015.10.27.08.03.36
	(version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128);
	Tue, 27 Oct 2015 08:03:37 -0700 (PDT)
From: Lars Kurth <lars.kurth.xen@gmail.com>
Date: Tue, 27 Oct 2015 15:03:35 +0000
Message-Id: <B1F4CA40-AC60-4694-98DF-A7DB225E58D6@gmail.com>
To: Xen-devel <xen-devel@lists.xen.org>,
	mirageos-devel <mirageos-devel@lists.xenproject.org>,
	Win-pv-devel@lists.xenproject.org
Mime-Version: 1.0 (Mac OS X Mail 8.2 \(2104\))
X-Mailer: Apple Mail (2.2104)
Cc: "Jesus M. Gonzalez-Barahona" <jgb@bitergia.com>
Subject: [win-pv-devel] Urgent actions for Outreachy mentors
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: multipart/mixed; boundary="===============0223774533777512799=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org


--===============0223774533777512799==
Content-Type: multipart/alternative; boundary="Apple-Mail=_42543CC6-2D9C-474F-A1E5-65D15F9FB48C"


--Apple-Mail=_42543CC6-2D9C-474F-A1E5-65D15F9FB48C
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=us-ascii

Hi everyone,

if you are an Outreachy mentor, you *must request access* to =
https://docs.google.com/spreadsheets/d/1MaJD0bvjaXN6Jg1h0be7Zv99lnGZxC4Ffx=
HhhRkpgBs/edit?usp=3Dsharing if I have not already given you access ...=20=


The idea is to track in the spreadsheet ...
a) Who has been engaging with potential applicants and who they are
b) Which project(s) do they want to work on
c) Have they contributed small contribution yet and what are they

Please *add any candidates* you have had conversations with, in =
particular if the answer to c) is yes.

If the answer is c), you *must* create an account on =
https://outreachy.gnome.org and sign up as mentor. Otherwise, your =
applicant won't be able to submit an application.

As for deadlines:

> September 29 application process opens

** We are here **

> November 2 application deadline
> November 6 (mentors): Xen Project mentors get together and evaluate =
applicants
> November 9 (mentors): Xen Project decides which applicants to put =
forward
> November 17 accepted applicants announced
> December 7 - March 7 internship dates

If you had several applicants asking for the same project, I propose we =
follow the following protocol.
* Ask applicants to chose a back-up project
* Let them apply for normally
* Resolve any "conflicts" post the November 2 deadline (between Nov 2-9)

Best Regards
Lars
=20=

--Apple-Mail=_42543CC6-2D9C-474F-A1E5-65D15F9FB48C
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
	charset=us-ascii

<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html =
charset=3Dus-ascii"></head><body style=3D"word-wrap: break-word; =
-webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div =
class=3D"">Hi everyone,</div><div class=3D""><br class=3D""></div><div =
class=3D"">if you are an Outreachy mentor, you *must request access* to =
<a =
href=3D"https://docs.google.com/spreadsheets/d/1MaJD0bvjaXN6Jg1h0be7Zv99ln=
GZxC4FfxHhhRkpgBs/edit?usp=3Dsharing" =
class=3D"">https://docs.google.com/spreadsheets/d/1MaJD0bvjaXN6Jg1h0be7Zv9=
9lnGZxC4FfxHhhRkpgBs/edit?usp=3Dsharing</a> if I have not already given =
you access ...&nbsp;</div><div class=3D""><br class=3D""></div><div =
class=3D"">The idea is to track in the spreadsheet ...</div><div =
class=3D"">a) Who has been engaging with potential applicants and who =
they are</div><div class=3D"">b) Which project(s) do they want to work =
on</div><div class=3D"">c) Have they contributed small contribution yet =
and what are they</div><div class=3D""><br class=3D""></div><div =
class=3D"">Please *add any candidates* you have had conversations with, =
in particular if the answer to c) is yes.</div><div class=3D""><br =
class=3D""></div><div class=3D"">If the answer is c), you *must* create =
an account on&nbsp;<a href=3D"https://outreachy.gnome.org" =
class=3D"">https://outreachy.gnome.org</a> and sign up as mentor. =
Otherwise, your applicant won't be able to submit an =
application.</div><div class=3D""><br class=3D""></div><div class=3D"">As =
for deadlines:</div><div class=3D""><br class=3D""></div><div =
class=3D""><blockquote type=3D"cite" style=3D"font-family: =
Menlo-Regular;" class=3D"">September 29 application process opens<br =
class=3D""></blockquote><div class=3D""><br class=3D""></div>** We are =
here **</div><div class=3D""><br class=3D""><blockquote type=3D"cite" =
style=3D"font-family: Menlo-Regular;" class=3D"">November 2 application =
deadline</blockquote><blockquote type=3D"cite" style=3D"font-family: =
Menlo-Regular;" class=3D"">November 6 (mentors): Xen Project mentors get =
together and evaluate applicants</blockquote><blockquote type=3D"cite" =
style=3D"font-family: Menlo-Regular;" class=3D"">November 9 (mentors): =
Xen Project decides which applicants to put =
forward</blockquote><blockquote type=3D"cite" style=3D"font-family: =
Menlo-Regular;" class=3D"">November 17 accepted applicants announced<br =
class=3D"">December 7 - March 7 internship dates</blockquote><br =
class=3D""></div><div class=3D"">If you had several applicants asking =
for the same project, I propose we follow the following =
protocol.</div><div class=3D"">* Ask applicants to chose a back-up =
project</div><div class=3D"">* Let them apply for normally</div><div =
class=3D"">* Resolve any "conflicts" post the November 2 deadline =
(between Nov 2-9)</div><div class=3D""><br class=3D""></div><div =
class=3D"">Best Regards</div><div class=3D"">Lars</div><div =
class=3D"">&nbsp;</div></body></html>=

--Apple-Mail=_42543CC6-2D9C-474F-A1E5-65D15F9FB48C--


--===============0223774533777512799==
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
--===============0223774533777512799==--


From win-pv-devel-bounces@lists.xenproject.org Tue Oct 27 15:03:44 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 15:03: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 1Zr5mp-00005j-EF; Tue, 27 Oct 2015 15:03:43 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <lars.kurth.xen@gmail.com>)
	id 1Zr5mo-00005P-8b; Tue, 27 Oct 2015 15:03:42 +0000
Received: from [85.158.137.68] by server-5.bemta-3.messagelabs.com id
	39/3E-01748-D429F265; Tue, 27 Oct 2015 15:03:41 +0000
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-11.tower-31.messagelabs.com!1445958219!24421500!1
X-Originating-IP: [209.85.212.176]
X-SpamReason: No, hits=0.1 required=7.0 tests=HTML_50_60,HTML_MESSAGE,
	ML_RADAR_SPEW_LINKS_8,spamassassin: 
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28653 invoked from network); 27 Oct 2015 15:03:39 -0000
Received: from mail-wi0-f176.google.com (HELO mail-wi0-f176.google.com)
	(209.85.212.176)
	by server-11.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2015 15:03:39 -0000
Received: by wikq8 with SMTP id q8so215900541wik.1;
	Tue, 27 Oct 2015 08:03:39 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:content-type:subject:date:message-id:cc:to:mime-version;
	bh=DcA2MYzLHcY2XEJLVyKsk2peIYu7TQi9FdXYNZsir4k=;
	b=D9uavRQK7bgxFjauhmXFPDMb0ppqTwTbsWPS2+fxZN4ZwAIlg2rFx1F7KRS6Is5b6K
	gBa+Wmmg2va5cFpt+wIyaoD9Qwxqqw0ncILVO98r6WKLuJP6cDTgPXpe7dE7pAn+V2z9
	9V5HszEEmnTGn+8HnHh3H0V7kMkjI9A6IhzxXxYj+hCQyNqJXvefr9beJbP0dmMYsixl
	BFo3mNH/xlKfpa2u+4OQCJStJJyY3iGim/cnS8CeqptaQesUusiZqu5UD5SdK2ritSIE
	79UczzJ2G0qidq3ZhDF/M2lgbuUAmtb0lZMimmPQsM6cafwlbK5Z1XfgvYMMARC9th5f
	CWDg==
X-Received: by 10.180.74.47 with SMTP id q15mr28873970wiv.73.1445958218650;
	Tue, 27 Oct 2015 08:03:38 -0700 (PDT)
Received: from [192.168.0.9] (97e3cc8b.skybroadband.com. [151.227.204.139])
	by smtp.gmail.com with ESMTPSA id
	ly4sm45242035wjb.4.2015.10.27.08.03.36
	(version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128);
	Tue, 27 Oct 2015 08:03:37 -0700 (PDT)
From: Lars Kurth <lars.kurth.xen@gmail.com>
Date: Tue, 27 Oct 2015 15:03:35 +0000
Message-Id: <B1F4CA40-AC60-4694-98DF-A7DB225E58D6@gmail.com>
To: Xen-devel <xen-devel@lists.xen.org>,
	mirageos-devel <mirageos-devel@lists.xenproject.org>,
	Win-pv-devel@lists.xenproject.org
Mime-Version: 1.0 (Mac OS X Mail 8.2 \(2104\))
X-Mailer: Apple Mail (2.2104)
Cc: "Jesus M. Gonzalez-Barahona" <jgb@bitergia.com>
Subject: [win-pv-devel] Urgent actions for Outreachy mentors
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: multipart/mixed; boundary="===============0223774533777512799=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org


--===============0223774533777512799==
Content-Type: multipart/alternative; boundary="Apple-Mail=_42543CC6-2D9C-474F-A1E5-65D15F9FB48C"


--Apple-Mail=_42543CC6-2D9C-474F-A1E5-65D15F9FB48C
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=us-ascii

Hi everyone,

if you are an Outreachy mentor, you *must request access* to =
https://docs.google.com/spreadsheets/d/1MaJD0bvjaXN6Jg1h0be7Zv99lnGZxC4Ffx=
HhhRkpgBs/edit?usp=3Dsharing if I have not already given you access ...=20=


The idea is to track in the spreadsheet ...
a) Who has been engaging with potential applicants and who they are
b) Which project(s) do they want to work on
c) Have they contributed small contribution yet and what are they

Please *add any candidates* you have had conversations with, in =
particular if the answer to c) is yes.

If the answer is c), you *must* create an account on =
https://outreachy.gnome.org and sign up as mentor. Otherwise, your =
applicant won't be able to submit an application.

As for deadlines:

> September 29 application process opens

** We are here **

> November 2 application deadline
> November 6 (mentors): Xen Project mentors get together and evaluate =
applicants
> November 9 (mentors): Xen Project decides which applicants to put =
forward
> November 17 accepted applicants announced
> December 7 - March 7 internship dates

If you had several applicants asking for the same project, I propose we =
follow the following protocol.
* Ask applicants to chose a back-up project
* Let them apply for normally
* Resolve any "conflicts" post the November 2 deadline (between Nov 2-9)

Best Regards
Lars
=20=

--Apple-Mail=_42543CC6-2D9C-474F-A1E5-65D15F9FB48C
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
	charset=us-ascii

<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html =
charset=3Dus-ascii"></head><body style=3D"word-wrap: break-word; =
-webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div =
class=3D"">Hi everyone,</div><div class=3D""><br class=3D""></div><div =
class=3D"">if you are an Outreachy mentor, you *must request access* to =
<a =
href=3D"https://docs.google.com/spreadsheets/d/1MaJD0bvjaXN6Jg1h0be7Zv99ln=
GZxC4FfxHhhRkpgBs/edit?usp=3Dsharing" =
class=3D"">https://docs.google.com/spreadsheets/d/1MaJD0bvjaXN6Jg1h0be7Zv9=
9lnGZxC4FfxHhhRkpgBs/edit?usp=3Dsharing</a> if I have not already given =
you access ...&nbsp;</div><div class=3D""><br class=3D""></div><div =
class=3D"">The idea is to track in the spreadsheet ...</div><div =
class=3D"">a) Who has been engaging with potential applicants and who =
they are</div><div class=3D"">b) Which project(s) do they want to work =
on</div><div class=3D"">c) Have they contributed small contribution yet =
and what are they</div><div class=3D""><br class=3D""></div><div =
class=3D"">Please *add any candidates* you have had conversations with, =
in particular if the answer to c) is yes.</div><div class=3D""><br =
class=3D""></div><div class=3D"">If the answer is c), you *must* create =
an account on&nbsp;<a href=3D"https://outreachy.gnome.org" =
class=3D"">https://outreachy.gnome.org</a> and sign up as mentor. =
Otherwise, your applicant won't be able to submit an =
application.</div><div class=3D""><br class=3D""></div><div class=3D"">As =
for deadlines:</div><div class=3D""><br class=3D""></div><div =
class=3D""><blockquote type=3D"cite" style=3D"font-family: =
Menlo-Regular;" class=3D"">September 29 application process opens<br =
class=3D""></blockquote><div class=3D""><br class=3D""></div>** We are =
here **</div><div class=3D""><br class=3D""><blockquote type=3D"cite" =
style=3D"font-family: Menlo-Regular;" class=3D"">November 2 application =
deadline</blockquote><blockquote type=3D"cite" style=3D"font-family: =
Menlo-Regular;" class=3D"">November 6 (mentors): Xen Project mentors get =
together and evaluate applicants</blockquote><blockquote type=3D"cite" =
style=3D"font-family: Menlo-Regular;" class=3D"">November 9 (mentors): =
Xen Project decides which applicants to put =
forward</blockquote><blockquote type=3D"cite" style=3D"font-family: =
Menlo-Regular;" class=3D"">November 17 accepted applicants announced<br =
class=3D"">December 7 - March 7 internship dates</blockquote><br =
class=3D""></div><div class=3D"">If you had several applicants asking =
for the same project, I propose we follow the following =
protocol.</div><div class=3D"">* Ask applicants to chose a back-up =
project</div><div class=3D"">* Let them apply for normally</div><div =
class=3D"">* Resolve any "conflicts" post the November 2 deadline =
(between Nov 2-9)</div><div class=3D""><br class=3D""></div><div =
class=3D"">Best Regards</div><div class=3D"">Lars</div><div =
class=3D"">&nbsp;</div></body></html>=

--Apple-Mail=_42543CC6-2D9C-474F-A1E5-65D15F9FB48C--


--===============0223774533777512799==
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
--===============0223774533777512799==--


From win-pv-devel-bounces@lists.xenproject.org Tue Oct 27 15:13:13 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 15:13: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 1Zr5w1-0000fu-01; Tue, 27 Oct 2015 15:13:13 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72) (envelope-from <et@etit.hu>)
	id 1Zr5vz-0000fF-6I
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 15:13:11 +0000
Received: from [85.158.137.68] by server-13.bemta-3.messagelabs.com id
	92/83-00536-6849F265; Tue, 27 Oct 2015 15:13:10 +0000
X-Env-Sender: et@etit.hu
X-Msg-Ref: server-3.tower-31.messagelabs.com!1445958786!11146970!1
X-Originating-IP: [95.140.34.219]
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 30313 invoked from network); 27 Oct 2015 15:13:06 -0000
Received: from mail.etit.hu (HELO mail.etit.hu) (95.140.34.219)
	by server-3.tower-31.messagelabs.com with SMTP;
	27 Oct 2015 15:13:06 -0000
Received: from localhost (localhost [127.0.0.1])
	by mail.etit.hu (Postfix) with ESMTP id 0DB04357
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 27 Oct 2015 16:13:06 +0100 (CET)
Received: from [192.168.100.122] (87.229.89.127.z-net.hu [87.229.89.127])
	by mail.etit.hu (Postfix) with ESMTPSA id 6D3AB222
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 27 Oct 2015 16:12:57 +0100 (CET)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=etit.hu; s=mail;
	t=1445958777; bh=vmcvfG1kjSTxK/y+jNayXqK82Ic8RYA0d7RnVwbHBfw=;
	h=From:Subject:To:Message-ID:Date:MIME-Version:Content-Type:From;
	b=E2KIwjQZIthqNcZfSSRqomsZ2QpfwzYDJ9KgxHLfFETeSWOKmitjDlwRyHznPdmS3
	nSofol9t1/dfJ9m/cZuP15PjSRzq1jlrvnwLMab1/lmYrfwxbhLxFJ5sOfvQt1ADbI
	T59HSgaePTUnUsvMdGYmoUwWfwNgq/C0ARfWW+no=
From: =?UTF-8?B?w4lsacOhcyBUYW3DoXM=?= <et@etit.hu>
To: win-pv-devel@lists.xenproject.org
Organization: ETIT[nwpro] KFT
Message-ID: <562F9479.8070802@etit.hu>
Date: Tue, 27 Oct 2015 16:12:57 +0100
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] Removing old glpv windows drivers to install new ->
 inaccessible boot device
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: multipart/mixed; boundary="===============6870764977067768066=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--===============6870764977067768066==
Content-Type: multipart/signed; micalg=pgp-sha1;
 protocol="application/pgp-signature";
 boundary="LOU0WwMF2UEawKJ5pWsiuAnb1RUTwgnwM"

This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--LOU0WwMF2UEawKJ5pWsiuAnb1RUTwgnwM
Content-Type: text/plain; charset=iso-8859-2
Content-Transfer-Encoding: quoted-printable

Hi all. I already issued this same question at xen users, but I might
get more response at the developer list.

I have some Windows7 HVM domu (debian dom0) and xen 4.5. I'm
successfully using the old uninvention gplpv windows drivers. I decided
that follwoing an upgrade to xen 4.6 I will go to the official xen
windows device drivers:
http://www.xenproject.org/developers/teams/windows-pv-drivers.html

The installer failed installing these new drivers, so I guessed that the
problem might be the presence of the old uninvention drivers. I
uninstalled them, and rebooted the machine. Since then I'm getting BSOD
saying that Windows failed to boot, INACCESSIBLE_BOOT_DEVICE.

Is there a way to let Windows boot again? I guess if I cold turn on some
basic harddisk emulation what windows should know by default, my problem
should gone (so instead of PVHVM stubdomain I would have a normal HVM
domain at least until I install the new drivers)?

Thank you.

--=20


=C9li=E1s Tam=E1s
Thomas Elias

ETIT[nwpro] KFT, =DCgyvezet=F5
ETIT[nwpro] Ltd, General Manager

Tel. HU: +36/30-497-1626
Tel. DE: +49/160-651-8723
OpenPGP pubkey: http://etit.hu/doc/et-pub.asc

Okleveles m=E9rn=F6k-informatikus (MSC)
Master of Science in Information Technology (MSC)

Kapcsolat: http://etit.hu/index.php/hu/kapcsolat
Jogi nyilatkozat: http://etit.hu/disclaimer-email-hu.txt
Contact: http://etit.hu/index.php/en/contact
Disclaimer: http://etit.hu/disclaimer-email-en.txt




--LOU0WwMF2UEawKJ5pWsiuAnb1RUTwgnwM
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)

iQIcBAEBAgAGBQJWL5R5AAoJENWYes1C3s/CiRIP+wT4m5DlhnDL8O9x5mysXuix
8I+76TJ4a4PPjPi/wYtsDdNiwfRm9DYGWe7ggcnTpydMoRTNLfVjQEH8eajk6Rom
5NGqYJLDd6dpFMs30muosJlnfq2EmoKhuxEmBe6VbnHdlJbDeNfq2MwtzTTERtuD
Pcuw5M3gmwj1oo2JKZti5dWhiHW5Spi+XZrHY/IG9yJ7hEqKU9aoUpdlps0yk/we
H05C8m8p5rfDBiPShGFfg2SzwijlzqDgInzZlWYDZGITrsyxlNjiYnzBcNaZJfQf
EMZuQiiibgVj6zu2DDZnmAhHYLJAP6Z2KZ6cWOSBhNKirq3AXDb1HPHKKxbVJlMs
ESvMQEo1vQf1Pq7OSYaVCT9nrpdBH9nYLSrd2gJ+MtWF3uHvFgBy/BaYKCKB9IPs
dewpgNdRFqo1nDWc6ubY6Hjt+i9nxJMlz2fdVTefZ9LuP7RXf4xYrZi8a4rlivhI
7BZqOgRV1aGMc60revQfnmxwaFYZsuRAPx790//6muF5ik3KmxUrgpa+mV1nUt3+
iectRuz9vq7pklWcU3f3AqrCyMaCxz0DkTGGihcPuUtpR75i3SL/9KcQ7ckVhJ5H
aBPh4zPnUGj8DBl6Jiu8UvchnTFx+UWk3fpV5Dts8CtdqitHNHxXd3pSEHNnGZk9
I4GbtApgJbBaJGLiNQQ2
=hArw
-----END PGP SIGNATURE-----

--LOU0WwMF2UEawKJ5pWsiuAnb1RUTwgnwM--


--===============6870764977067768066==
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
--===============6870764977067768066==--


From win-pv-devel-bounces@lists.xenproject.org Tue Oct 27 15:13:13 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 15:13: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 1Zr5w1-0000fu-01; Tue, 27 Oct 2015 15:13:13 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72) (envelope-from <et@etit.hu>)
	id 1Zr5vz-0000fF-6I
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 15:13:11 +0000
Received: from [85.158.137.68] by server-13.bemta-3.messagelabs.com id
	92/83-00536-6849F265; Tue, 27 Oct 2015 15:13:10 +0000
X-Env-Sender: et@etit.hu
X-Msg-Ref: server-3.tower-31.messagelabs.com!1445958786!11146970!1
X-Originating-IP: [95.140.34.219]
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 30313 invoked from network); 27 Oct 2015 15:13:06 -0000
Received: from mail.etit.hu (HELO mail.etit.hu) (95.140.34.219)
	by server-3.tower-31.messagelabs.com with SMTP;
	27 Oct 2015 15:13:06 -0000
Received: from localhost (localhost [127.0.0.1])
	by mail.etit.hu (Postfix) with ESMTP id 0DB04357
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 27 Oct 2015 16:13:06 +0100 (CET)
Received: from [192.168.100.122] (87.229.89.127.z-net.hu [87.229.89.127])
	by mail.etit.hu (Postfix) with ESMTPSA id 6D3AB222
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 27 Oct 2015 16:12:57 +0100 (CET)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=etit.hu; s=mail;
	t=1445958777; bh=vmcvfG1kjSTxK/y+jNayXqK82Ic8RYA0d7RnVwbHBfw=;
	h=From:Subject:To:Message-ID:Date:MIME-Version:Content-Type:From;
	b=E2KIwjQZIthqNcZfSSRqomsZ2QpfwzYDJ9KgxHLfFETeSWOKmitjDlwRyHznPdmS3
	nSofol9t1/dfJ9m/cZuP15PjSRzq1jlrvnwLMab1/lmYrfwxbhLxFJ5sOfvQt1ADbI
	T59HSgaePTUnUsvMdGYmoUwWfwNgq/C0ARfWW+no=
From: =?UTF-8?B?w4lsacOhcyBUYW3DoXM=?= <et@etit.hu>
To: win-pv-devel@lists.xenproject.org
Organization: ETIT[nwpro] KFT
Message-ID: <562F9479.8070802@etit.hu>
Date: Tue, 27 Oct 2015 16:12:57 +0100
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
Subject: [win-pv-devel] Removing old glpv windows drivers to install new ->
 inaccessible boot device
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: multipart/mixed; boundary="===============6870764977067768066=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--===============6870764977067768066==
Content-Type: multipart/signed; micalg=pgp-sha1;
 protocol="application/pgp-signature";
 boundary="LOU0WwMF2UEawKJ5pWsiuAnb1RUTwgnwM"

This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--LOU0WwMF2UEawKJ5pWsiuAnb1RUTwgnwM
Content-Type: text/plain; charset=iso-8859-2
Content-Transfer-Encoding: quoted-printable

Hi all. I already issued this same question at xen users, but I might
get more response at the developer list.

I have some Windows7 HVM domu (debian dom0) and xen 4.5. I'm
successfully using the old uninvention gplpv windows drivers. I decided
that follwoing an upgrade to xen 4.6 I will go to the official xen
windows device drivers:
http://www.xenproject.org/developers/teams/windows-pv-drivers.html

The installer failed installing these new drivers, so I guessed that the
problem might be the presence of the old uninvention drivers. I
uninstalled them, and rebooted the machine. Since then I'm getting BSOD
saying that Windows failed to boot, INACCESSIBLE_BOOT_DEVICE.

Is there a way to let Windows boot again? I guess if I cold turn on some
basic harddisk emulation what windows should know by default, my problem
should gone (so instead of PVHVM stubdomain I would have a normal HVM
domain at least until I install the new drivers)?

Thank you.

--=20


=C9li=E1s Tam=E1s
Thomas Elias

ETIT[nwpro] KFT, =DCgyvezet=F5
ETIT[nwpro] Ltd, General Manager

Tel. HU: +36/30-497-1626
Tel. DE: +49/160-651-8723
OpenPGP pubkey: http://etit.hu/doc/et-pub.asc

Okleveles m=E9rn=F6k-informatikus (MSC)
Master of Science in Information Technology (MSC)

Kapcsolat: http://etit.hu/index.php/hu/kapcsolat
Jogi nyilatkozat: http://etit.hu/disclaimer-email-hu.txt
Contact: http://etit.hu/index.php/en/contact
Disclaimer: http://etit.hu/disclaimer-email-en.txt




--LOU0WwMF2UEawKJ5pWsiuAnb1RUTwgnwM
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)

iQIcBAEBAgAGBQJWL5R5AAoJENWYes1C3s/CiRIP+wT4m5DlhnDL8O9x5mysXuix
8I+76TJ4a4PPjPi/wYtsDdNiwfRm9DYGWe7ggcnTpydMoRTNLfVjQEH8eajk6Rom
5NGqYJLDd6dpFMs30muosJlnfq2EmoKhuxEmBe6VbnHdlJbDeNfq2MwtzTTERtuD
Pcuw5M3gmwj1oo2JKZti5dWhiHW5Spi+XZrHY/IG9yJ7hEqKU9aoUpdlps0yk/we
H05C8m8p5rfDBiPShGFfg2SzwijlzqDgInzZlWYDZGITrsyxlNjiYnzBcNaZJfQf
EMZuQiiibgVj6zu2DDZnmAhHYLJAP6Z2KZ6cWOSBhNKirq3AXDb1HPHKKxbVJlMs
ESvMQEo1vQf1Pq7OSYaVCT9nrpdBH9nYLSrd2gJ+MtWF3uHvFgBy/BaYKCKB9IPs
dewpgNdRFqo1nDWc6ubY6Hjt+i9nxJMlz2fdVTefZ9LuP7RXf4xYrZi8a4rlivhI
7BZqOgRV1aGMc60revQfnmxwaFYZsuRAPx790//6muF5ik3KmxUrgpa+mV1nUt3+
iectRuz9vq7pklWcU3f3AqrCyMaCxz0DkTGGihcPuUtpR75i3SL/9KcQ7ckVhJ5H
aBPh4zPnUGj8DBl6Jiu8UvchnTFx+UWk3fpV5Dts8CtdqitHNHxXd3pSEHNnGZk9
I4GbtApgJbBaJGLiNQQ2
=hArw
-----END PGP SIGNATURE-----

--LOU0WwMF2UEawKJ5pWsiuAnb1RUTwgnwM--


--===============6870764977067768066==
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
--===============6870764977067768066==--


From win-pv-devel-bounces@lists.xenproject.org Tue Oct 27 17:55:07 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 17:55: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 1Zr8Sg-0005Kl-Be; Tue, 27 Oct 2015 17:55:06 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=735ca0e81=owen.smith@citrix.com>)
	id 1Zr8Sf-0005Kc-7z
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 17:55:05 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	86/47-10678-87ABF265; Tue, 27 Oct 2015 17:55:04 +0000
X-Env-Sender: prvs=735ca0e81=owen.smith@citrix.com
X-Msg-Ref: server-8.tower-31.messagelabs.com!1445968500!57257958!1
X-Originating-IP: [66.165.176.89]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23442 invoked from network); 27 Oct 2015 17:55:03 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-8.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2015 17:55:03 -0000
X-IronPort-AV: E=Sophos;i="5.20,206,1444694400"; d="scan'208";a="308551586"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 27 Oct 2015 17:54:42 +0000
Message-ID: <1445968482-28864-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] Fix missing imports for NTDDI < WIN7
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

Some APIs are used that are not available before Win7.
Use preprocessor to substitute equivilent calls when NTDDI_VERSION
is less than NTDDI_WIN7

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xeniface/fdo.c          | 13 +++++++++++++
 src/xeniface/ioctl_evtchn.c |  9 +++++++--
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index 71ffbe2..d6b006e 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -2385,7 +2385,11 @@ FdoCreate(
     if (!NT_SUCCESS(status))
         goto fail14;
 
+#if (NTDDI_VERSION >= NTDDI_WIN7)
     ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
+#else // NTDDI_VISTA / NTDDI_VISTASP1 / NTDDI_WS08
+    ProcessorCount = KeQueryMaximumProcessorCount();
+#endif
 
     status = STATUS_NO_MEMORY;
     Fdo->EvtchnDpc = __FdoAllocate(sizeof (KDPC) * ProcessorCount);
@@ -2393,6 +2397,7 @@ FdoCreate(
         goto fail15;
 
     for (Index = 0; Index < ProcessorCount; Index++) {
+#if (NTDDI_VERSION >= NTDDI_WIN7)
         PROCESSOR_NUMBER ProcNumber;
 
         status = KeGetProcessorNumberFromIndex(Index, &ProcNumber);
@@ -2401,6 +2406,10 @@ FdoCreate(
         KeInitializeDpc(&Fdo->EvtchnDpc[Index], EvtchnNotificationDpc, NULL);
         status = KeSetTargetProcessorDpcEx(&Fdo->EvtchnDpc[Index], &ProcNumber);
         ASSERT(NT_SUCCESS(status));
+#else // NTDDI_VISTA / NTDDI_VISTASP1 / NTDDI_WS08
+        KeInitializeDpc(&Fdo->EvtchnDpc[Index], EvtchnNotificationDpc, NULL);
+        KeSetTargetProcessorDpc(&Fdo->EvtchnDpc[Index], (CCHAR)Index);
+#endif
     }
 
     Info("%p (%s)\n",
@@ -2525,7 +2534,11 @@ FdoDestroy(
 
     Dx->Fdo = NULL;
 
+#if (NTDDI_VERSION >= NTDDI_WIN7)
     ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
+#else // NTDDI_VISTA / NTDDI_VISTASP1 / NTDDI_WS08
+    ProcessorCount = KeQueryMaximumProcessorCount();
+#endif
     RtlZeroMemory(Fdo->EvtchnDpc, sizeof (KDPC) * ProcessorCount);
     __FdoFree(Fdo->EvtchnDpc);
 
diff --git a/src/xeniface/ioctl_evtchn.c b/src/xeniface/ioctl_evtchn.c
index 93f1931..1501157 100644
--- a/src/xeniface/ioctl_evtchn.c
+++ b/src/xeniface/ioctl_evtchn.c
@@ -51,7 +51,7 @@ EvtchnNotificationDpc(
     UNREFERENCED_PARAMETER(_Context);
     UNREFERENCED_PARAMETER(Argument2);
 
-    ASSERT(Context);
+    ASSERT(Context != NULL);
 
 #if DBG
     XenIfaceDebugPrint(INFO, "Channel %p, LocalPort %d, Cpu %lu\n",
@@ -80,10 +80,15 @@ EvtchnInterruptHandler(
     ULONG ProcIndex;
 
     UNREFERENCED_PARAMETER(Interrupt);
-    ASSERT(Context);
+    ASSERT(Context != NULL);
 
+#if (NTDD_VERSION >= NTDDI_WIN7)
     KeGetCurrentProcessorNumberEx(&ProcNumber);
     ProcIndex = KeGetProcessorIndexFromNumber(&ProcNumber);
+#else // NTDDI_VISTA / NTDDI_VISTASP1 / NTDDI_WS08
+    UNREFERENCED_PARAMETER(ProcNumber); // keep compiler happy
+    ProcIndex = KeGetCurrentProcessorNumber();
+#endif
     if (!KeInsertQueueDpc(&Context->Fdo->EvtchnDpc[ProcIndex], Context, NULL)) {
         XenIfaceDebugPrint(TRACE, "NOT INSERTED: Context %p, Port %lu, FO %p, Cpu %lu\n",
                            Context, Context->LocalPort, Context->FileObject, ProcIndex);
-- 
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 Tue Oct 27 17:55:07 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 27 Oct 2015 17:55: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 1Zr8Sg-0005Kl-Be; Tue, 27 Oct 2015 17:55:06 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=735ca0e81=owen.smith@citrix.com>)
	id 1Zr8Sf-0005Kc-7z
	for win-pv-devel@lists.xenproject.org; Tue, 27 Oct 2015 17:55:05 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	86/47-10678-87ABF265; Tue, 27 Oct 2015 17:55:04 +0000
X-Env-Sender: prvs=735ca0e81=owen.smith@citrix.com
X-Msg-Ref: server-8.tower-31.messagelabs.com!1445968500!57257958!1
X-Originating-IP: [66.165.176.89]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23442 invoked from network); 27 Oct 2015 17:55:03 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-8.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2015 17:55:03 -0000
X-IronPort-AV: E=Sophos;i="5.20,206,1444694400"; d="scan'208";a="308551586"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 27 Oct 2015 17:54:42 +0000
Message-ID: <1445968482-28864-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] Fix missing imports for NTDDI < WIN7
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

Some APIs are used that are not available before Win7.
Use preprocessor to substitute equivilent calls when NTDDI_VERSION
is less than NTDDI_WIN7

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xeniface/fdo.c          | 13 +++++++++++++
 src/xeniface/ioctl_evtchn.c |  9 +++++++--
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index 71ffbe2..d6b006e 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -2385,7 +2385,11 @@ FdoCreate(
     if (!NT_SUCCESS(status))
         goto fail14;
 
+#if (NTDDI_VERSION >= NTDDI_WIN7)
     ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
+#else // NTDDI_VISTA / NTDDI_VISTASP1 / NTDDI_WS08
+    ProcessorCount = KeQueryMaximumProcessorCount();
+#endif
 
     status = STATUS_NO_MEMORY;
     Fdo->EvtchnDpc = __FdoAllocate(sizeof (KDPC) * ProcessorCount);
@@ -2393,6 +2397,7 @@ FdoCreate(
         goto fail15;
 
     for (Index = 0; Index < ProcessorCount; Index++) {
+#if (NTDDI_VERSION >= NTDDI_WIN7)
         PROCESSOR_NUMBER ProcNumber;
 
         status = KeGetProcessorNumberFromIndex(Index, &ProcNumber);
@@ -2401,6 +2406,10 @@ FdoCreate(
         KeInitializeDpc(&Fdo->EvtchnDpc[Index], EvtchnNotificationDpc, NULL);
         status = KeSetTargetProcessorDpcEx(&Fdo->EvtchnDpc[Index], &ProcNumber);
         ASSERT(NT_SUCCESS(status));
+#else // NTDDI_VISTA / NTDDI_VISTASP1 / NTDDI_WS08
+        KeInitializeDpc(&Fdo->EvtchnDpc[Index], EvtchnNotificationDpc, NULL);
+        KeSetTargetProcessorDpc(&Fdo->EvtchnDpc[Index], (CCHAR)Index);
+#endif
     }
 
     Info("%p (%s)\n",
@@ -2525,7 +2534,11 @@ FdoDestroy(
 
     Dx->Fdo = NULL;
 
+#if (NTDDI_VERSION >= NTDDI_WIN7)
     ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
+#else // NTDDI_VISTA / NTDDI_VISTASP1 / NTDDI_WS08
+    ProcessorCount = KeQueryMaximumProcessorCount();
+#endif
     RtlZeroMemory(Fdo->EvtchnDpc, sizeof (KDPC) * ProcessorCount);
     __FdoFree(Fdo->EvtchnDpc);
 
diff --git a/src/xeniface/ioctl_evtchn.c b/src/xeniface/ioctl_evtchn.c
index 93f1931..1501157 100644
--- a/src/xeniface/ioctl_evtchn.c
+++ b/src/xeniface/ioctl_evtchn.c
@@ -51,7 +51,7 @@ EvtchnNotificationDpc(
     UNREFERENCED_PARAMETER(_Context);
     UNREFERENCED_PARAMETER(Argument2);
 
-    ASSERT(Context);
+    ASSERT(Context != NULL);
 
 #if DBG
     XenIfaceDebugPrint(INFO, "Channel %p, LocalPort %d, Cpu %lu\n",
@@ -80,10 +80,15 @@ EvtchnInterruptHandler(
     ULONG ProcIndex;
 
     UNREFERENCED_PARAMETER(Interrupt);
-    ASSERT(Context);
+    ASSERT(Context != NULL);
 
+#if (NTDD_VERSION >= NTDDI_WIN7)
     KeGetCurrentProcessorNumberEx(&ProcNumber);
     ProcIndex = KeGetProcessorIndexFromNumber(&ProcNumber);
+#else // NTDDI_VISTA / NTDDI_VISTASP1 / NTDDI_WS08
+    UNREFERENCED_PARAMETER(ProcNumber); // keep compiler happy
+    ProcIndex = KeGetCurrentProcessorNumber();
+#endif
     if (!KeInsertQueueDpc(&Context->Fdo->EvtchnDpc[ProcIndex], Context, NULL)) {
         XenIfaceDebugPrint(TRACE, "NOT INSERTED: Context %p, Port %lu, FO %p, Cpu %lu\n",
                            Context, Context->LocalPort, Context->FileObject, ProcIndex);
-- 
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 Wed Oct 28 08:48:03 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 28 Oct 2015 08:48:03 +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 1ZrMOm-00009S-Sm; Wed, 28 Oct 2015 08:48:00 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7369c71b3=ben.chalmers@citrix.com>)
	id 1ZrMOl-00009N-CB
	for win-pv-devel@lists.xenproject.org; Wed, 28 Oct 2015 08:47:59 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	61/FE-10678-EBB80365; Wed, 28 Oct 2015 08:47:58 +0000
X-Env-Sender: prvs=7369c71b3=ben.chalmers@citrix.com
X-Msg-Ref: server-14.tower-31.messagelabs.com!1446022077!55009422!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.1 required=7.0 tests=HTML_50_60,HTML_MESSAGE,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13045 invoked from network); 28 Oct 2015 08:47:57 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-14.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	28 Oct 2015 08:47:57 -0000
X-IronPort-AV: E=Sophos;i="5.20,209,1444694400"; d="scan'208,217";a="6302380"
From: Ben Chalmers <ben.chalmers@citrix.com>
To: =?utf-8?B?w4lsacOhcyBUYW3DoXM=?= <et@etit.hu>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Removing old glpv windows drivers to install
	new -> inaccessible boot device
Thread-Index: AdERXVNnvxNLq/HtdEq1WUhNsyPKnw==
Content-Class: urn:content-classes:message
Date: Wed, 28 Oct 2015 08:47:49 +0000
Message-ID: <1AD33E34BA5E3649B4F6C7FE476686F4211C60AD@AMSPEX01CL03.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-GB
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Removing old glpv windows drivers to install new
 -> inaccessible boot device
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: multipart/mixed; boundary="===============3189625835245619401=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

--===============3189625835245619401==
Content-Class: urn:content-classes:message
Content-Language: en-GB
Content-Type: multipart/alternative;
	boundary="_000_1AD33E34BA5E3649B4F6C7FE476686F4211C60ADAMSPEX01CL03cit_"

--_000_1AD33E34BA5E3649B4F6C7FE476686F4211C60ADAMSPEX01CL03cit_
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

WW91ciBiZXN0IGJldCBpcyB0byBib290IHdpdGggd2luZG93cyBQRSAoT3IgbW91bnQgdGhlIGRp
c2sgaW1hZ2UgYW5kIHVzZSBhIGxpbnV4IHJlZ2lzdHJ5IGVkaXRvcikNCg0KDQoNClRoZW4gaW4g
dGhlIHJlZ2lzdHJ5IHNlYXJjaCB1c2VyIEhLTE1cc3lzdGVtXGN1cnJlbnRjb250cm9sc2V0XGNv
bnRyb2xcY2xhc3MgZm9yIFhFTkZJTFQg4oCTIGV2ZXJ5IHRpbWUgeW91IHNlZSBpdCBhcHBlYXJp
bmcgaW4gVXBwZXJGaWx0ZXJzLCByZW1vdmUgaXQuDQoNCg0KDQpUaGUgZ28gdGhyb3VnaCB0aGUg
SEtMTVxzeXN0ZW1cY3VycmVudGNvbnRyb2xzZXRcc2VydmljZXNceGVuKiBrZXlzIGFuZCBzZXQg
U3RhcnQgdG8gMw0KDQoNCg0KVGhpcyBzaG91bGQgbGV0IHlvdSBib290IHVwLg0KDQoNCg0KDQoN
CkJlbiBDaGFsbWVycw0KDQoNCg0KDQoNCkZyb206IMOJbGnDoXMgVGFtw6FzDQpTZW50OiAyNyBP
Y3RvYmVyIDIwMTUgMTU6MTQNClRvOiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcN
ClN1YmplY3Q6IFt3aW4tcHYtZGV2ZWxdIFJlbW92aW5nIG9sZCBnbHB2IHdpbmRvd3MgZHJpdmVy
cyB0byBpbnN0YWxsIG5ldyAtPiBpbmFjY2Vzc2libGUgYm9vdCBkZXZpY2UNCg0KDQpIaSBhbGwu
IEkgYWxyZWFkeSBpc3N1ZWQgdGhpcyBzYW1lIHF1ZXN0aW9uIGF0IHhlbiB1c2VycywgYnV0IEkg
bWlnaHQNCmdldCBtb3JlIHJlc3BvbnNlIGF0IHRoZSBkZXZlbG9wZXIgbGlzdC4NCg0KSSBoYXZl
IHNvbWUgV2luZG93czcgSFZNIGRvbXUgKGRlYmlhbiBkb20wKSBhbmQgeGVuIDQuNS4gSSdtDQpz
dWNjZXNzZnVsbHkgdXNpbmcgdGhlIG9sZCB1bmludmVudGlvbiBncGxwdiB3aW5kb3dzIGRyaXZl
cnMuIEkgZGVjaWRlZA0KdGhhdCBmb2xsd29pbmcgYW4gdXBncmFkZSB0byB4ZW4gNC42IEkgd2ls
bCBnbyB0byB0aGUgb2ZmaWNpYWwgeGVuDQp3aW5kb3dzIGRldmljZSBkcml2ZXJzOg0KaHR0cDov
L3d3dy54ZW5wcm9qZWN0Lm9yZy9kZXZlbG9wZXJzL3RlYW1zL3dpbmRvd3MtcHYtZHJpdmVycy5o
dG1sDQoNClRoZSBpbnN0YWxsZXIgZmFpbGVkIGluc3RhbGxpbmcgdGhlc2UgbmV3IGRyaXZlcnMs
IHNvIEkgZ3Vlc3NlZCB0aGF0IHRoZQ0KcHJvYmxlbSBtaWdodCBiZSB0aGUgcHJlc2VuY2Ugb2Yg
dGhlIG9sZCB1bmludmVudGlvbiBkcml2ZXJzLiBJDQp1bmluc3RhbGxlZCB0aGVtLCBhbmQgcmVi
b290ZWQgdGhlIG1hY2hpbmUuIFNpbmNlIHRoZW4gSSdtIGdldHRpbmcgQlNPRA0Kc2F5aW5nIHRo
YXQgV2luZG93cyBmYWlsZWQgdG8gYm9vdCwgSU5BQ0NFU1NJQkxFX0JPT1RfREVWSUNFLg0KDQpJ
cyB0aGVyZSBhIHdheSB0byBsZXQgV2luZG93cyBib290IGFnYWluPyBJIGd1ZXNzIGlmIEkgY29s
ZCB0dXJuIG9uIHNvbWUNCmJhc2ljIGhhcmRkaXNrIGVtdWxhdGlvbiB3aGF0IHdpbmRvd3Mgc2hv
dWxkIGtub3cgYnkgZGVmYXVsdCwgbXkgcHJvYmxlbQ0Kc2hvdWxkIGdvbmUgKHNvIGluc3RlYWQg
b2YgUFZIVk0gc3R1YmRvbWFpbiBJIHdvdWxkIGhhdmUgYSBub3JtYWwgSFZNDQpkb21haW4gYXQg
bGVhc3QgdW50aWwgSSBpbnN0YWxsIHRoZSBuZXcgZHJpdmVycyk/DQoNClRoYW5rIHlvdS4NCg0K
LS0NCg0KDQrDiWxpw6FzIFRhbcOhcw0KVGhvbWFzIEVsaWFzDQoNCkVUSVRbbndwcm9dIEtGVCwg
w5xneXZlemV0xZENCkVUSVRbbndwcm9dIEx0ZCwgR2VuZXJhbCBNYW5hZ2VyDQoNClRlbC4gSFU6
ICszNi8zMC00OTctMTYyNg0KVGVsLiBERTogKzQ5LzE2MC02NTEtODcyMw0KT3BlblBHUCBwdWJr
ZXk6IGh0dHA6Ly9ldGl0Lmh1L2RvYy9ldC1wdWIuYXNjDQoNCk9rbGV2ZWxlcyBtw6lybsO2ay1p
bmZvcm1hdGlrdXMgKE1TQykNCk1hc3RlciBvZiBTY2llbmNlIGluIEluZm9ybWF0aW9uIFRlY2hu
b2xvZ3kgKE1TQykNCg0KS2FwY3NvbGF0OiBodHRwOi8vZXRpdC5odS9pbmRleC5waHAvaHUva2Fw
Y3NvbGF0DQpKb2dpIG55aWxhdGtvemF0OiBodHRwOi8vZXRpdC5odS9kaXNjbGFpbWVyLWVtYWls
LWh1LnR4dA0KQ29udGFjdDogaHR0cDovL2V0aXQuaHUvaW5kZXgucGhwL2VuL2NvbnRhY3QNCkRp
c2NsYWltZXI6IGh0dHA6Ly9ldGl0Lmh1L2Rpc2NsYWltZXItZW1haWwtZW4udHh0DQoNCg0KDQoN
Cg0K

--_000_1AD33E34BA5E3649B4F6C7FE476686F4211C60ADAMSPEX01CL03cit_
Content-Type: text/html; charset="utf-8"
Content-ID: <DEBE03A629FE6240B36277E128053398@citrix.com>
Content-Transfer-Encoding: base64

PGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIiB4
bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIiB4bWxuczptPSJo
dHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA0LzEyL29tbWwiIHhtbG5zPSJo
dHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4NCjxoZWFkPg0KPG1ldGEgaHR0cC1lcXVp
dj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KPG1l
dGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJNaWNyb3NvZnQgV29yZCAxNSAoZmlsdGVyZWQg
bWVkaXVtKSI+DQo8c3R5bGU+PCEtLQ0KLyogRm9udCBEZWZpbml0aW9ucyAqLw0KQGZvbnQtZmFj
ZQ0KCXtmb250LWZhbWlseToiQ2FtYnJpYSBNYXRoIjsNCglwYW5vc2UtMToyIDQgNSAzIDUgNCA2
IDMgMiA0O30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6Q2FsaWJyaTsNCglwYW5vc2UtMToy
IDE1IDUgMiAyIDIgNCAzIDIgNDt9DQovKiBTdHlsZSBEZWZpbml0aW9ucyAqLw0KcC5Nc29Ob3Jt
YWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbA0KCXttYXJnaW46MGNtOw0KCW1hcmdpbi1i
b3R0b206LjAwMDFwdDsNCglmb250LXNpemU6MTEuMHB0Ow0KCWZvbnQtZmFtaWx5OiJDYWxpYnJp
IixzYW5zLXNlcmlmO30NCnANCgl7bXNvLXN0eWxlLXByaW9yaXR5Ojk5Ow0KCW1hcmdpbjowY207
DQoJbWFyZ2luLWJvdHRvbTouMDAwMXB0Ow0KCWZvbnQtc2l6ZToxMS4wcHQ7DQoJZm9udC1mYW1p
bHk6IkNhbGlicmkiLHNhbnMtc2VyaWY7fQ0KLk1zb0NocERlZmF1bHQNCgl7bXNvLXN0eWxlLXR5
cGU6ZXhwb3J0LW9ubHk7fQ0KQHBhZ2UgV29yZFNlY3Rpb24xDQoJe3NpemU6NjEyLjBwdCA3OTIu
MHB0Ow0KCW1hcmdpbjo3Mi4wcHQgNzIuMHB0IDcyLjBwdCA3Mi4wcHQ7fQ0KZGl2LldvcmRTZWN0
aW9uMQ0KCXtwYWdlOldvcmRTZWN0aW9uMTt9DQotLT48L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHkg
bGFuZz0iRU4tR0IiPg0KPGRpdiBjbGFzcz0iV29yZFNlY3Rpb24xIj4NCjxwPllvdXIgYmVzdCBi
ZXQgaXMgdG8gYm9vdCB3aXRoIHdpbmRvd3MgUEUgKE9yIG1vdW50IHRoZSBkaXNrIGltYWdlIGFu
ZCB1c2UgYSBsaW51eCByZWdpc3RyeSBlZGl0b3IpPC9wPg0KPHA+PG86cD4mbmJzcDs8L286cD48
L3A+DQo8cD5UaGVuIGluIHRoZSByZWdpc3RyeSBzZWFyY2ggdXNlciBIS0xNXHN5c3RlbVxjdXJy
ZW50Y29udHJvbHNldFxjb250cm9sXGNsYXNzIGZvciBYRU5GSUxUIOKAkyBldmVyeSB0aW1lIHlv
dSBzZWUgaXQgYXBwZWFyaW5nIGluIFVwcGVyRmlsdGVycywgcmVtb3ZlIGl0LjwvcD4NCjxwPjxv
OnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHA+VGhlIGdvIHRocm91Z2ggdGhlIEhLTE1cc3lzdGVtXGN1
cnJlbnRjb250cm9sc2V0XHNlcnZpY2VzXHhlbioga2V5cyBhbmQgc2V0IFN0YXJ0IHRvIDM8L3A+
DQo8cD48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxwPlRoaXMgc2hvdWxkIGxldCB5b3UgYm9vdCB1
cC48L3A+DQo8cD48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxwPjxvOnA+Jm5ic3A7PC9vOnA+PC9w
Pg0KPHA+QmVuIENoYWxtZXJzPC9wPg0KPHA+PG86cD4mbmJzcDs8L286cD48L3A+DQo8cD48bzpw
PiZuYnNwOzwvbzpwPjwvcD4NCjxkaXYgc3R5bGU9Im1zby1lbGVtZW50OnBhcmEtYm9yZGVyLWRp
djtib3JkZXI6bm9uZTtib3JkZXItdG9wOnNvbGlkICNFMUUxRTEgMS4wcHQ7cGFkZGluZzozLjBw
dCAwY20gMGNtIDBjbSI+DQo8cCBzdHlsZT0iYm9yZGVyOm5vbmU7cGFkZGluZzowY20iPjxicj4N
CjxiPkZyb206IDwvYj7DiWxpw6FzIFRhbcOhczxicj4NCjxiPlNlbnQ6IDwvYj4yNyBPY3RvYmVy
IDIwMTUgMTU6MTQ8YnI+DQo8Yj5UbzogPC9iPndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0
Lm9yZzxicj4NCjxiPlN1YmplY3Q6IDwvYj5bd2luLXB2LWRldmVsXSBSZW1vdmluZyBvbGQgZ2xw
diB3aW5kb3dzIGRyaXZlcnMgdG8gaW5zdGFsbCBuZXcgLSZndDsgaW5hY2Nlc3NpYmxlIGJvb3Qg
ZGV2aWNlPC9wPg0KPC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpw
PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVv
dDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwv
cD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPkhpIGFsbC4gSSBhbHJlYWR5IGlzc3VlZCB0aGlzIHNh
bWUgcXVlc3Rpb24gYXQgeGVuIHVzZXJzLCBidXQgSSBtaWdodDwvcD4NCjxwIGNsYXNzPSJNc29O
b3JtYWwiPmdldCBtb3JlIHJlc3BvbnNlIGF0IHRoZSBkZXZlbG9wZXIgbGlzdC48L3A+DQo8cCBj
bGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3Jt
YWwiPkkgaGF2ZSBzb21lIFdpbmRvd3M3IEhWTSBkb211IChkZWJpYW4gZG9tMCkgYW5kIHhlbiA0
LjUuIEknbTwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPnN1Y2Nlc3NmdWxseSB1c2luZyB0aGUg
b2xkIHVuaW52ZW50aW9uIGdwbHB2IHdpbmRvd3MgZHJpdmVycy4gSSBkZWNpZGVkPC9wPg0KPHAg
Y2xhc3M9Ik1zb05vcm1hbCI+dGhhdCBmb2xsd29pbmcgYW4gdXBncmFkZSB0byB4ZW4gNC42IEkg
d2lsbCBnbyB0byB0aGUgb2ZmaWNpYWwgeGVuPC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+d2lu
ZG93cyBkZXZpY2UgZHJpdmVyczo8L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5odHRwOi8vd3d3
LnhlbnByb2plY3Qub3JnL2RldmVsb3BlcnMvdGVhbXMvd2luZG93cy1wdi1kcml2ZXJzLmh0bWw8
L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxwIGNsYXNz
PSJNc29Ob3JtYWwiPlRoZSBpbnN0YWxsZXIgZmFpbGVkIGluc3RhbGxpbmcgdGhlc2UgbmV3IGRy
aXZlcnMsIHNvIEkgZ3Vlc3NlZCB0aGF0IHRoZTwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPnBy
b2JsZW0gbWlnaHQgYmUgdGhlIHByZXNlbmNlIG9mIHRoZSBvbGQgdW5pbnZlbnRpb24gZHJpdmVy
cy4gSTwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPnVuaW5zdGFsbGVkIHRoZW0sIGFuZCByZWJv
b3RlZCB0aGUgbWFjaGluZS4gU2luY2UgdGhlbiBJJ20gZ2V0dGluZyBCU09EPC9wPg0KPHAgY2xh
c3M9Ik1zb05vcm1hbCI+c2F5aW5nIHRoYXQgV2luZG93cyBmYWlsZWQgdG8gYm9vdCwgSU5BQ0NF
U1NJQkxFX0JPT1RfREVWSUNFLjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7
PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+SXMgdGhlcmUgYSB3YXkgdG8gbGV0IFdp
bmRvd3MgYm9vdCBhZ2Fpbj8gSSBndWVzcyBpZiBJIGNvbGQgdHVybiBvbiBzb21lPC9wPg0KPHAg
Y2xhc3M9Ik1zb05vcm1hbCI+YmFzaWMgaGFyZGRpc2sgZW11bGF0aW9uIHdoYXQgd2luZG93cyBz
aG91bGQga25vdyBieSBkZWZhdWx0LCBteSBwcm9ibGVtPC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1h
bCI+c2hvdWxkIGdvbmUgKHNvIGluc3RlYWQgb2YgUFZIVk0gc3R1YmRvbWFpbiBJIHdvdWxkIGhh
dmUgYSBub3JtYWwgSFZNPC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ZG9tYWluIGF0IGxlYXN0
IHVudGlsIEkgaW5zdGFsbCB0aGUgbmV3IGRyaXZlcnMpPzwvcD4NCjxwIGNsYXNzPSJNc29Ob3Jt
YWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+VGhhbmsgeW91
LjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHAgY2xh
c3M9Ik1zb05vcm1hbCI+LS0gPC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8
L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxw
IGNsYXNzPSJNc29Ob3JtYWwiPsOJbGnDoXMgVGFtw6FzPC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1h
bCI+VGhvbWFzIEVsaWFzPC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8L286
cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5FVElUW253cHJvXSBLRlQsIMOcZ3l2ZXpldMWR
PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+RVRJVFtud3Byb10gTHRkLCBHZW5lcmFsIE1hbmFn
ZXI8L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxwIGNs
YXNzPSJNc29Ob3JtYWwiPlRlbC4gSFU6ICYjNDM7MzYvMzAtNDk3LTE2MjY8L3A+DQo8cCBjbGFz
cz0iTXNvTm9ybWFsIj5UZWwuIERFOiAmIzQzOzQ5LzE2MC02NTEtODcyMzwvcD4NCjxwIGNsYXNz
PSJNc29Ob3JtYWwiPk9wZW5QR1AgcHVia2V5OiBodHRwOi8vZXRpdC5odS9kb2MvZXQtcHViLmFz
YzwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHAgY2xh
c3M9Ik1zb05vcm1hbCI+T2tsZXZlbGVzIG3DqXJuw7ZrLWluZm9ybWF0aWt1cyAoTVNDKTwvcD4N
CjxwIGNsYXNzPSJNc29Ob3JtYWwiPk1hc3RlciBvZiBTY2llbmNlIGluIEluZm9ybWF0aW9uIFRl
Y2hub2xvZ3kgKE1TQyk8L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpw
PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPkthcGNzb2xhdDogaHR0cDovL2V0aXQuaHUvaW5k
ZXgucGhwL2h1L2thcGNzb2xhdDwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPkpvZ2kgbnlpbGF0
a296YXQ6IGh0dHA6Ly9ldGl0Lmh1L2Rpc2NsYWltZXItZW1haWwtaHUudHh0PC9wPg0KPHAgY2xh
c3M9Ik1zb05vcm1hbCI+Q29udGFjdDogaHR0cDovL2V0aXQuaHUvaW5kZXgucGhwL2VuL2NvbnRh
Y3Q8L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5EaXNjbGFpbWVyOiBodHRwOi8vZXRpdC5odS9k
aXNjbGFpbWVyLWVtYWlsLWVuLnR4dDwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5i
c3A7PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8L286cD48L3A+
DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxwIGNsYXNzPSJN
c29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86
cD4mbmJzcDs8L286cD48L3A+DQo8L2Rpdj4NCjwvYm9keT4NCjwvaHRtbD4NCg==

--_000_1AD33E34BA5E3649B4F6C7FE476686F4211C60ADAMSPEX01CL03cit_--


--===============3189625835245619401==
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
--===============3189625835245619401==--


From win-pv-devel-bounces@lists.xenproject.org Wed Oct 28 08:48:03 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 28 Oct 2015 08:48:03 +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 1ZrMOm-00009S-Sm; Wed, 28 Oct 2015 08:48:00 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7369c71b3=ben.chalmers@citrix.com>)
	id 1ZrMOl-00009N-CB
	for win-pv-devel@lists.xenproject.org; Wed, 28 Oct 2015 08:47:59 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	61/FE-10678-EBB80365; Wed, 28 Oct 2015 08:47:58 +0000
X-Env-Sender: prvs=7369c71b3=ben.chalmers@citrix.com
X-Msg-Ref: server-14.tower-31.messagelabs.com!1446022077!55009422!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.1 required=7.0 tests=HTML_50_60,HTML_MESSAGE,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13045 invoked from network); 28 Oct 2015 08:47:57 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-14.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	28 Oct 2015 08:47:57 -0000
X-IronPort-AV: E=Sophos;i="5.20,209,1444694400"; d="scan'208,217";a="6302380"
From: Ben Chalmers <ben.chalmers@citrix.com>
To: =?utf-8?B?w4lsacOhcyBUYW3DoXM=?= <et@etit.hu>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Removing old glpv windows drivers to install
	new -> inaccessible boot device
Thread-Index: AdERXVNnvxNLq/HtdEq1WUhNsyPKnw==
Content-Class: urn:content-classes:message
Date: Wed, 28 Oct 2015 08:47:49 +0000
Message-ID: <1AD33E34BA5E3649B4F6C7FE476686F4211C60AD@AMSPEX01CL03.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-GB
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Removing old glpv windows drivers to install new
 -> inaccessible boot device
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: multipart/mixed; boundary="===============3189625835245619401=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

--===============3189625835245619401==
Content-Class: urn:content-classes:message
Content-Language: en-GB
Content-Type: multipart/alternative;
	boundary="_000_1AD33E34BA5E3649B4F6C7FE476686F4211C60ADAMSPEX01CL03cit_"

--_000_1AD33E34BA5E3649B4F6C7FE476686F4211C60ADAMSPEX01CL03cit_
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

WW91ciBiZXN0IGJldCBpcyB0byBib290IHdpdGggd2luZG93cyBQRSAoT3IgbW91bnQgdGhlIGRp
c2sgaW1hZ2UgYW5kIHVzZSBhIGxpbnV4IHJlZ2lzdHJ5IGVkaXRvcikNCg0KDQoNClRoZW4gaW4g
dGhlIHJlZ2lzdHJ5IHNlYXJjaCB1c2VyIEhLTE1cc3lzdGVtXGN1cnJlbnRjb250cm9sc2V0XGNv
bnRyb2xcY2xhc3MgZm9yIFhFTkZJTFQg4oCTIGV2ZXJ5IHRpbWUgeW91IHNlZSBpdCBhcHBlYXJp
bmcgaW4gVXBwZXJGaWx0ZXJzLCByZW1vdmUgaXQuDQoNCg0KDQpUaGUgZ28gdGhyb3VnaCB0aGUg
SEtMTVxzeXN0ZW1cY3VycmVudGNvbnRyb2xzZXRcc2VydmljZXNceGVuKiBrZXlzIGFuZCBzZXQg
U3RhcnQgdG8gMw0KDQoNCg0KVGhpcyBzaG91bGQgbGV0IHlvdSBib290IHVwLg0KDQoNCg0KDQoN
CkJlbiBDaGFsbWVycw0KDQoNCg0KDQoNCkZyb206IMOJbGnDoXMgVGFtw6FzDQpTZW50OiAyNyBP
Y3RvYmVyIDIwMTUgMTU6MTQNClRvOiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcN
ClN1YmplY3Q6IFt3aW4tcHYtZGV2ZWxdIFJlbW92aW5nIG9sZCBnbHB2IHdpbmRvd3MgZHJpdmVy
cyB0byBpbnN0YWxsIG5ldyAtPiBpbmFjY2Vzc2libGUgYm9vdCBkZXZpY2UNCg0KDQpIaSBhbGwu
IEkgYWxyZWFkeSBpc3N1ZWQgdGhpcyBzYW1lIHF1ZXN0aW9uIGF0IHhlbiB1c2VycywgYnV0IEkg
bWlnaHQNCmdldCBtb3JlIHJlc3BvbnNlIGF0IHRoZSBkZXZlbG9wZXIgbGlzdC4NCg0KSSBoYXZl
IHNvbWUgV2luZG93czcgSFZNIGRvbXUgKGRlYmlhbiBkb20wKSBhbmQgeGVuIDQuNS4gSSdtDQpz
dWNjZXNzZnVsbHkgdXNpbmcgdGhlIG9sZCB1bmludmVudGlvbiBncGxwdiB3aW5kb3dzIGRyaXZl
cnMuIEkgZGVjaWRlZA0KdGhhdCBmb2xsd29pbmcgYW4gdXBncmFkZSB0byB4ZW4gNC42IEkgd2ls
bCBnbyB0byB0aGUgb2ZmaWNpYWwgeGVuDQp3aW5kb3dzIGRldmljZSBkcml2ZXJzOg0KaHR0cDov
L3d3dy54ZW5wcm9qZWN0Lm9yZy9kZXZlbG9wZXJzL3RlYW1zL3dpbmRvd3MtcHYtZHJpdmVycy5o
dG1sDQoNClRoZSBpbnN0YWxsZXIgZmFpbGVkIGluc3RhbGxpbmcgdGhlc2UgbmV3IGRyaXZlcnMs
IHNvIEkgZ3Vlc3NlZCB0aGF0IHRoZQ0KcHJvYmxlbSBtaWdodCBiZSB0aGUgcHJlc2VuY2Ugb2Yg
dGhlIG9sZCB1bmludmVudGlvbiBkcml2ZXJzLiBJDQp1bmluc3RhbGxlZCB0aGVtLCBhbmQgcmVi
b290ZWQgdGhlIG1hY2hpbmUuIFNpbmNlIHRoZW4gSSdtIGdldHRpbmcgQlNPRA0Kc2F5aW5nIHRo
YXQgV2luZG93cyBmYWlsZWQgdG8gYm9vdCwgSU5BQ0NFU1NJQkxFX0JPT1RfREVWSUNFLg0KDQpJ
cyB0aGVyZSBhIHdheSB0byBsZXQgV2luZG93cyBib290IGFnYWluPyBJIGd1ZXNzIGlmIEkgY29s
ZCB0dXJuIG9uIHNvbWUNCmJhc2ljIGhhcmRkaXNrIGVtdWxhdGlvbiB3aGF0IHdpbmRvd3Mgc2hv
dWxkIGtub3cgYnkgZGVmYXVsdCwgbXkgcHJvYmxlbQ0Kc2hvdWxkIGdvbmUgKHNvIGluc3RlYWQg
b2YgUFZIVk0gc3R1YmRvbWFpbiBJIHdvdWxkIGhhdmUgYSBub3JtYWwgSFZNDQpkb21haW4gYXQg
bGVhc3QgdW50aWwgSSBpbnN0YWxsIHRoZSBuZXcgZHJpdmVycyk/DQoNClRoYW5rIHlvdS4NCg0K
LS0NCg0KDQrDiWxpw6FzIFRhbcOhcw0KVGhvbWFzIEVsaWFzDQoNCkVUSVRbbndwcm9dIEtGVCwg
w5xneXZlemV0xZENCkVUSVRbbndwcm9dIEx0ZCwgR2VuZXJhbCBNYW5hZ2VyDQoNClRlbC4gSFU6
ICszNi8zMC00OTctMTYyNg0KVGVsLiBERTogKzQ5LzE2MC02NTEtODcyMw0KT3BlblBHUCBwdWJr
ZXk6IGh0dHA6Ly9ldGl0Lmh1L2RvYy9ldC1wdWIuYXNjDQoNCk9rbGV2ZWxlcyBtw6lybsO2ay1p
bmZvcm1hdGlrdXMgKE1TQykNCk1hc3RlciBvZiBTY2llbmNlIGluIEluZm9ybWF0aW9uIFRlY2hu
b2xvZ3kgKE1TQykNCg0KS2FwY3NvbGF0OiBodHRwOi8vZXRpdC5odS9pbmRleC5waHAvaHUva2Fw
Y3NvbGF0DQpKb2dpIG55aWxhdGtvemF0OiBodHRwOi8vZXRpdC5odS9kaXNjbGFpbWVyLWVtYWls
LWh1LnR4dA0KQ29udGFjdDogaHR0cDovL2V0aXQuaHUvaW5kZXgucGhwL2VuL2NvbnRhY3QNCkRp
c2NsYWltZXI6IGh0dHA6Ly9ldGl0Lmh1L2Rpc2NsYWltZXItZW1haWwtZW4udHh0DQoNCg0KDQoN
Cg0K

--_000_1AD33E34BA5E3649B4F6C7FE476686F4211C60ADAMSPEX01CL03cit_
Content-Type: text/html; charset="utf-8"
Content-ID: <DEBE03A629FE6240B36277E128053398@citrix.com>
Content-Transfer-Encoding: base64

PGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIiB4
bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIiB4bWxuczptPSJo
dHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA0LzEyL29tbWwiIHhtbG5zPSJo
dHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4NCjxoZWFkPg0KPG1ldGEgaHR0cC1lcXVp
dj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KPG1l
dGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJNaWNyb3NvZnQgV29yZCAxNSAoZmlsdGVyZWQg
bWVkaXVtKSI+DQo8c3R5bGU+PCEtLQ0KLyogRm9udCBEZWZpbml0aW9ucyAqLw0KQGZvbnQtZmFj
ZQ0KCXtmb250LWZhbWlseToiQ2FtYnJpYSBNYXRoIjsNCglwYW5vc2UtMToyIDQgNSAzIDUgNCA2
IDMgMiA0O30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6Q2FsaWJyaTsNCglwYW5vc2UtMToy
IDE1IDUgMiAyIDIgNCAzIDIgNDt9DQovKiBTdHlsZSBEZWZpbml0aW9ucyAqLw0KcC5Nc29Ob3Jt
YWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbA0KCXttYXJnaW46MGNtOw0KCW1hcmdpbi1i
b3R0b206LjAwMDFwdDsNCglmb250LXNpemU6MTEuMHB0Ow0KCWZvbnQtZmFtaWx5OiJDYWxpYnJp
IixzYW5zLXNlcmlmO30NCnANCgl7bXNvLXN0eWxlLXByaW9yaXR5Ojk5Ow0KCW1hcmdpbjowY207
DQoJbWFyZ2luLWJvdHRvbTouMDAwMXB0Ow0KCWZvbnQtc2l6ZToxMS4wcHQ7DQoJZm9udC1mYW1p
bHk6IkNhbGlicmkiLHNhbnMtc2VyaWY7fQ0KLk1zb0NocERlZmF1bHQNCgl7bXNvLXN0eWxlLXR5
cGU6ZXhwb3J0LW9ubHk7fQ0KQHBhZ2UgV29yZFNlY3Rpb24xDQoJe3NpemU6NjEyLjBwdCA3OTIu
MHB0Ow0KCW1hcmdpbjo3Mi4wcHQgNzIuMHB0IDcyLjBwdCA3Mi4wcHQ7fQ0KZGl2LldvcmRTZWN0
aW9uMQ0KCXtwYWdlOldvcmRTZWN0aW9uMTt9DQotLT48L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHkg
bGFuZz0iRU4tR0IiPg0KPGRpdiBjbGFzcz0iV29yZFNlY3Rpb24xIj4NCjxwPllvdXIgYmVzdCBi
ZXQgaXMgdG8gYm9vdCB3aXRoIHdpbmRvd3MgUEUgKE9yIG1vdW50IHRoZSBkaXNrIGltYWdlIGFu
ZCB1c2UgYSBsaW51eCByZWdpc3RyeSBlZGl0b3IpPC9wPg0KPHA+PG86cD4mbmJzcDs8L286cD48
L3A+DQo8cD5UaGVuIGluIHRoZSByZWdpc3RyeSBzZWFyY2ggdXNlciBIS0xNXHN5c3RlbVxjdXJy
ZW50Y29udHJvbHNldFxjb250cm9sXGNsYXNzIGZvciBYRU5GSUxUIOKAkyBldmVyeSB0aW1lIHlv
dSBzZWUgaXQgYXBwZWFyaW5nIGluIFVwcGVyRmlsdGVycywgcmVtb3ZlIGl0LjwvcD4NCjxwPjxv
OnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHA+VGhlIGdvIHRocm91Z2ggdGhlIEhLTE1cc3lzdGVtXGN1
cnJlbnRjb250cm9sc2V0XHNlcnZpY2VzXHhlbioga2V5cyBhbmQgc2V0IFN0YXJ0IHRvIDM8L3A+
DQo8cD48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxwPlRoaXMgc2hvdWxkIGxldCB5b3UgYm9vdCB1
cC48L3A+DQo8cD48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxwPjxvOnA+Jm5ic3A7PC9vOnA+PC9w
Pg0KPHA+QmVuIENoYWxtZXJzPC9wPg0KPHA+PG86cD4mbmJzcDs8L286cD48L3A+DQo8cD48bzpw
PiZuYnNwOzwvbzpwPjwvcD4NCjxkaXYgc3R5bGU9Im1zby1lbGVtZW50OnBhcmEtYm9yZGVyLWRp
djtib3JkZXI6bm9uZTtib3JkZXItdG9wOnNvbGlkICNFMUUxRTEgMS4wcHQ7cGFkZGluZzozLjBw
dCAwY20gMGNtIDBjbSI+DQo8cCBzdHlsZT0iYm9yZGVyOm5vbmU7cGFkZGluZzowY20iPjxicj4N
CjxiPkZyb206IDwvYj7DiWxpw6FzIFRhbcOhczxicj4NCjxiPlNlbnQ6IDwvYj4yNyBPY3RvYmVy
IDIwMTUgMTU6MTQ8YnI+DQo8Yj5UbzogPC9iPndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0
Lm9yZzxicj4NCjxiPlN1YmplY3Q6IDwvYj5bd2luLXB2LWRldmVsXSBSZW1vdmluZyBvbGQgZ2xw
diB3aW5kb3dzIGRyaXZlcnMgdG8gaW5zdGFsbCBuZXcgLSZndDsgaW5hY2Nlc3NpYmxlIGJvb3Qg
ZGV2aWNlPC9wPg0KPC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpw
PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVv
dDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwv
cD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPkhpIGFsbC4gSSBhbHJlYWR5IGlzc3VlZCB0aGlzIHNh
bWUgcXVlc3Rpb24gYXQgeGVuIHVzZXJzLCBidXQgSSBtaWdodDwvcD4NCjxwIGNsYXNzPSJNc29O
b3JtYWwiPmdldCBtb3JlIHJlc3BvbnNlIGF0IHRoZSBkZXZlbG9wZXIgbGlzdC48L3A+DQo8cCBj
bGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3Jt
YWwiPkkgaGF2ZSBzb21lIFdpbmRvd3M3IEhWTSBkb211IChkZWJpYW4gZG9tMCkgYW5kIHhlbiA0
LjUuIEknbTwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPnN1Y2Nlc3NmdWxseSB1c2luZyB0aGUg
b2xkIHVuaW52ZW50aW9uIGdwbHB2IHdpbmRvd3MgZHJpdmVycy4gSSBkZWNpZGVkPC9wPg0KPHAg
Y2xhc3M9Ik1zb05vcm1hbCI+dGhhdCBmb2xsd29pbmcgYW4gdXBncmFkZSB0byB4ZW4gNC42IEkg
d2lsbCBnbyB0byB0aGUgb2ZmaWNpYWwgeGVuPC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+d2lu
ZG93cyBkZXZpY2UgZHJpdmVyczo8L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5odHRwOi8vd3d3
LnhlbnByb2plY3Qub3JnL2RldmVsb3BlcnMvdGVhbXMvd2luZG93cy1wdi1kcml2ZXJzLmh0bWw8
L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxwIGNsYXNz
PSJNc29Ob3JtYWwiPlRoZSBpbnN0YWxsZXIgZmFpbGVkIGluc3RhbGxpbmcgdGhlc2UgbmV3IGRy
aXZlcnMsIHNvIEkgZ3Vlc3NlZCB0aGF0IHRoZTwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPnBy
b2JsZW0gbWlnaHQgYmUgdGhlIHByZXNlbmNlIG9mIHRoZSBvbGQgdW5pbnZlbnRpb24gZHJpdmVy
cy4gSTwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPnVuaW5zdGFsbGVkIHRoZW0sIGFuZCByZWJv
b3RlZCB0aGUgbWFjaGluZS4gU2luY2UgdGhlbiBJJ20gZ2V0dGluZyBCU09EPC9wPg0KPHAgY2xh
c3M9Ik1zb05vcm1hbCI+c2F5aW5nIHRoYXQgV2luZG93cyBmYWlsZWQgdG8gYm9vdCwgSU5BQ0NF
U1NJQkxFX0JPT1RfREVWSUNFLjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7
PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+SXMgdGhlcmUgYSB3YXkgdG8gbGV0IFdp
bmRvd3MgYm9vdCBhZ2Fpbj8gSSBndWVzcyBpZiBJIGNvbGQgdHVybiBvbiBzb21lPC9wPg0KPHAg
Y2xhc3M9Ik1zb05vcm1hbCI+YmFzaWMgaGFyZGRpc2sgZW11bGF0aW9uIHdoYXQgd2luZG93cyBz
aG91bGQga25vdyBieSBkZWZhdWx0LCBteSBwcm9ibGVtPC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1h
bCI+c2hvdWxkIGdvbmUgKHNvIGluc3RlYWQgb2YgUFZIVk0gc3R1YmRvbWFpbiBJIHdvdWxkIGhh
dmUgYSBub3JtYWwgSFZNPC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ZG9tYWluIGF0IGxlYXN0
IHVudGlsIEkgaW5zdGFsbCB0aGUgbmV3IGRyaXZlcnMpPzwvcD4NCjxwIGNsYXNzPSJNc29Ob3Jt
YWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+VGhhbmsgeW91
LjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHAgY2xh
c3M9Ik1zb05vcm1hbCI+LS0gPC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8
L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxw
IGNsYXNzPSJNc29Ob3JtYWwiPsOJbGnDoXMgVGFtw6FzPC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1h
bCI+VGhvbWFzIEVsaWFzPC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8L286
cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5FVElUW253cHJvXSBLRlQsIMOcZ3l2ZXpldMWR
PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+RVRJVFtud3Byb10gTHRkLCBHZW5lcmFsIE1hbmFn
ZXI8L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxwIGNs
YXNzPSJNc29Ob3JtYWwiPlRlbC4gSFU6ICYjNDM7MzYvMzAtNDk3LTE2MjY8L3A+DQo8cCBjbGFz
cz0iTXNvTm9ybWFsIj5UZWwuIERFOiAmIzQzOzQ5LzE2MC02NTEtODcyMzwvcD4NCjxwIGNsYXNz
PSJNc29Ob3JtYWwiPk9wZW5QR1AgcHVia2V5OiBodHRwOi8vZXRpdC5odS9kb2MvZXQtcHViLmFz
YzwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHAgY2xh
c3M9Ik1zb05vcm1hbCI+T2tsZXZlbGVzIG3DqXJuw7ZrLWluZm9ybWF0aWt1cyAoTVNDKTwvcD4N
CjxwIGNsYXNzPSJNc29Ob3JtYWwiPk1hc3RlciBvZiBTY2llbmNlIGluIEluZm9ybWF0aW9uIFRl
Y2hub2xvZ3kgKE1TQyk8L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpw
PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPkthcGNzb2xhdDogaHR0cDovL2V0aXQuaHUvaW5k
ZXgucGhwL2h1L2thcGNzb2xhdDwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPkpvZ2kgbnlpbGF0
a296YXQ6IGh0dHA6Ly9ldGl0Lmh1L2Rpc2NsYWltZXItZW1haWwtaHUudHh0PC9wPg0KPHAgY2xh
c3M9Ik1zb05vcm1hbCI+Q29udGFjdDogaHR0cDovL2V0aXQuaHUvaW5kZXgucGhwL2VuL2NvbnRh
Y3Q8L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5EaXNjbGFpbWVyOiBodHRwOi8vZXRpdC5odS9k
aXNjbGFpbWVyLWVtYWlsLWVuLnR4dDwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5i
c3A7PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8L286cD48L3A+
DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxwIGNsYXNzPSJN
c29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86
cD4mbmJzcDs8L286cD48L3A+DQo8L2Rpdj4NCjwvYm9keT4NCjwvaHRtbD4NCg==

--_000_1AD33E34BA5E3649B4F6C7FE476686F4211C60ADAMSPEX01CL03cit_--


--===============3189625835245619401==
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
--===============3189625835245619401==--


From win-pv-devel-bounces@lists.xenproject.org Wed Oct 28 09:05:29 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 28 Oct 2015 09:05:29 +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 1ZrMfg-0000e2-Al; Wed, 28 Oct 2015 09:05:28 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72) (envelope-from <et@etit.hu>)
	id 1ZrMfd-0000dx-0B
	for win-pv-devel@lists.xenproject.org; Wed, 28 Oct 2015 09:05:26 +0000
Received: from [85.158.137.68] by server-16.bemta-3.messagelabs.com id
	45/FF-03763-4DF80365; Wed, 28 Oct 2015 09:05:24 +0000
X-Env-Sender: et@etit.hu
X-Msg-Ref: server-6.tower-31.messagelabs.com!1446022671!7937825!1
X-Originating-IP: [95.140.34.219]
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 15947 invoked from network); 28 Oct 2015 08:57:51 -0000
Received: from mail.etit.hu (HELO mail.etit.hu) (95.140.34.219)
	by server-6.tower-31.messagelabs.com with SMTP;
	28 Oct 2015 08:57:51 -0000
Received: from localhost (localhost [127.0.0.1])
	by mail.etit.hu (Postfix) with ESMTP id 1EC3F2AE
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 28 Oct 2015 09:57:51 +0100 (CET)
Received: from [192.168.100.122] (87.229.89.127.z-net.hu [87.229.89.127])
	by mail.etit.hu (Postfix) with ESMTPSA id CC79364
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 28 Oct 2015 09:57:41 +0100 (CET)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=etit.hu; s=mail;
	t=1446022662; bh=L1d459M7F6cVYVyWmciIO9pxQLtO8RbKjvuygWr/SpM=;
	h=Subject:To:From:Message-ID:Date:MIME-Version:Content-Type:From;
	b=OLMY6VrVM+SdJcDssbXvQ/pHknUNp3mYAisFCyf+KOEom6sR3LMNeoVTcKeN/9Qmd
	gy4KOg744O+2HtEOoPYvsEEM4SW+vXtyngAdO/NxKyRkDa0wSYkf5CKoAbMCkHktDv
	20NjhiBLfUVbwKThrunLyrMBobt2ezwo7cD6ZlKQ=
To: win-pv-devel@lists.xenproject.org
References: <1AD33E34BA5E3649B4F6C7FE476686F4211C60AD@AMSPEX01CL03.citrite.net>
From: =?UTF-8?B?w4lsacOhcyBUYW3DoXM=?= <et@etit.hu>
Organization: ETIT[nwpro] KFT
Message-ID: <56308E05.60203@etit.hu>
Date: Wed, 28 Oct 2015 09:57:41 +0100
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <1AD33E34BA5E3649B4F6C7FE476686F4211C60AD@AMSPEX01CL03.citrite.net>
Subject: Re: [win-pv-devel] Removing old glpv windows drivers to install new
 -> inaccessible boot device
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: multipart/mixed; boundary="===============4026057686044234871=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--===============4026057686044234871==
Content-Type: multipart/signed; micalg=pgp-sha1;
 protocol="application/pgp-signature";
 boundary="M7oipOhf3FbnveUgVXFjI3JnLp8hd1upp"

This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--M7oipOhf3FbnveUgVXFjI3JnLp8hd1upp
Content-Type: multipart/mixed;
 boundary="------------000002090607050602040201"

This is a multi-part message in MIME format.
--------------000002090607050602040201
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Hi.

I could successfully boot into safe mode, then used bcdedit for
testsigning and now the installer worked (interesting that installing
the pfx files previously did not make any difference). The install went
fine, I could reboot. Unfortunately since then (it is more then 8 hours
now) I'm facing the attached screen. The animation is just rolling,
rolling rolling and nothing happens. CPU ticks are used, so I assume
something is happening, but it seemes pretty much stuck.

I think I will try what you recommended to remove all old/new drivers
completely and then I might be able to revert back to the old glpv driver=
s.

I received an other response on xen-users, where someone is facing the
same problem, so it does not seem to exceptional.

2015-10-28 09:47 keltez=C3=A9ssel, Ben Chalmers =C3=ADrta:
> Your best bet is to boot with windows PE (Or mount the disk image and
> use a linux registry editor)
>=20
> =20
>=20
> Then in the registry search user
> HKLM\system\currentcontrolset\control\class for XENFILT =E2=80=93 every=
 time you
> see it appearing in UpperFilters, remove it.
>=20
> =20
>=20
> The go through the HKLM\system\currentcontrolset\services\xen* keys and=

> set Start to 3
>=20
> =20
>=20
> This should let you boot up.
>=20
> =20
>=20
> =20
>=20
> Ben Chalmers
>=20
> =20
>=20
> =20
>=20
>=20
> *From: *=C3=89li=C3=A1s Tam=C3=A1s
> *Sent: *27 October 2015 15:14
> *To: *win-pv-devel@lists.xenproject.org
> *Subject: *[win-pv-devel] Removing old glpv windows drivers to install
> new -> inaccessible boot device
>=20
> =20
>=20
> =20
>=20
> Hi all. I already issued this same question at xen users, but I might
>=20
> get more response at the developer list.
>=20
> =20
>=20
> I have some Windows7 HVM domu (debian dom0) and xen 4.5. I'm
>=20
> successfully using the old uninvention gplpv windows drivers. I decided=

>=20
> that follwoing an upgrade to xen 4.6 I will go to the official xen
>=20
> windows device drivers:
>=20
> http://www.xenproject.org/developers/teams/windows-pv-drivers.html
>=20
> =20
>=20
> The installer failed installing these new drivers, so I guessed that th=
e
>=20
> problem might be the presence of the old uninvention drivers. I
>=20
> uninstalled them, and rebooted the machine. Since then I'm getting BSOD=

>=20
> saying that Windows failed to boot, INACCESSIBLE_BOOT_DEVICE.
>=20
> =20
>=20
> Is there a way to let Windows boot again? I guess if I cold turn on som=
e
>=20
> basic harddisk emulation what windows should know by default, my proble=
m
>=20
> should gone (so instead of PVHVM stubdomain I would have a normal HVM
>=20
> domain at least until I install the new drivers)?
>=20
> =20
>=20
> Thank you.
>=20
> =20
>=20
> --=20
>=20
> =20
>=20
> =20
>=20
> =C3=89li=C3=A1s Tam=C3=A1s
>=20
> Thomas Elias
>=20
> =20
>=20
> ETIT[nwpro] KFT, =C3=9Cgyvezet=C5=91
>=20
> ETIT[nwpro] Ltd, General Manager
>=20
> =20
>=20
> Tel. HU: +36/30-497-1626
>=20
> Tel. DE: +49/160-651-8723
>=20
> OpenPGP pubkey: http://etit.hu/doc/et-pub.asc
>=20
> =20
>=20
> Okleveles m=C3=A9rn=C3=B6k-informatikus (MSC)
>=20
> Master of Science in Information Technology (MSC)
>=20
> =20
>=20
> Kapcsolat: http://etit.hu/index.php/hu/kapcsolat
>=20
> Jogi nyilatkozat: http://etit.hu/disclaimer-email-hu.txt
>=20
> Contact: http://etit.hu/index.php/en/contact
>=20
> Disclaimer: http://etit.hu/disclaimer-email-en.txt
>=20
> =20
>=20
> =20
>=20
> =20
>=20
> =20
>=20
> =20
>=20
>=20
>=20
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
>=20

--=20


=C3=89li=C3=A1s Tam=C3=A1s
Thomas Elias

ETIT[nwpro] KFT, =C3=9Cgyvezet=C5=91
ETIT[nwpro] Ltd, General Manager

Tel. HU: +36/30-497-1626
Tel. DE: +49/160-651-8723
OpenPGP pubkey: http://etit.hu/doc/et-pub.asc

Okleveles m=C3=A9rn=C3=B6k-informatikus (MSC)
Master of Science in Information Technology (MSC)

Kapcsolat: http://etit.hu/index.php/hu/kapcsolat
Jogi nyilatkozat: http://etit.hu/disclaimer-email-hu.txt
Contact: http://etit.hu/index.php/en/contact
Disclaimer: http://etit.hu/disclaimer-email-en.txt

--------------000002090607050602040201
Content-Type: image/png;
 name="=?UTF-8?B?S8OpcGVybnnFkWvDqXAgZXJyxZFsOiAyMDE1LTEwLTI4IDA5OjQ3OjM2?=
 =?UTF-8?Q?.png?="
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename*0*=UTF-8''%4B%C3%A9%70%65%72%6E%79%C5%91%6B%C3%A9%70%20%65%72%72;
 filename*1*=%C5%91%6C%3A%20%32%30%31%35%2D%31%30%2D%32%38%20%30%39%3A%34;
 filename*2*=%37%3A%33%36%2E%70%6E%67

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
df7RrR5cps5UfyONacW49QkGRyPtQtc1NGU1188l1J8U17CE7U+fTHEuWkr9Xvx5RwghzneZ
GRmLXlv+58tTL15cs053fGkeDwCqqkau9aqK2+UC5gdIEk11Nftv9PLZ32cHQ2QARAghxFnK
xN93hCNDOmr2OjYUzT7U0kp2dQMVw7to6zhIo/f1rMvKZu3WLdgbm+nua2ZAA9XmJqswl1Py
F5vNy7qNFWiNXbSdOITFnkam240SiixWXdlk2SYZGuhkxFSxuTIoqltLTYYKyspiS7rNFVJs
Xuqqsxk8MUpjYz8FmwpPbd6s2azdciH2xiY6u08yrFtxpRdS17CWsrTZuO3klK7BNtRD2FZA
eZZ92buZuwXWlkP9hZuwnWymu+s4Q6YDt12bm7t8dgBkfo7udKo2NqA2NdPVeZxB3YorLY+K
+hpKnQa6kU1JvpOjvf20NAfQG7ZQ3bAetamV3o6j9BtWXBlp2PTATOeJJSZN6QvWH8CJxxGa
6QTR0NWF2y+ryY50xDDFYPsQbUFweHIpra+hwjP7IVUhfY0XdaCXsC2fIk/qzluHtwBHWws+
exZZVgPNsJGVaUOfCuAqKsBtRjp+jJkOpMixaJEBl6jfwUSb7SjRw+gxx7coH6RRuWEjanMr
3Z3HGZjJb+XaGkocBtpMr9yS47Olk6aMM9zXzqCpYnOlk19ZS5lrfluJcr+4rGKPLSI2BxHJ
cp5GZcMG1OY2ensa6ZtpM5kFGRTrGpZE+1nWsYAlp5qKrON0jHTTPOEgLbuEnDXlS8pvomNL
Vb6GM1mM8WPKrauh1nuMloGTHBq048nKxIFOUNfQYup7ecOGhe3LnUN61K3ui8sitv4lz/1y
6//ymDjz69lcm0/WTK+4nmQjy829kps4j2Ezm/KNDajNLXT3N3K0R8XmTCO70EvQyEq8zMxK
XleT1EmDJHUhEP/YLIzTdrQLX1jF4cmmtL6OCjfo5uLz6lLKMTaXCbef6ryT8ryUqL1lsXAm
hiWc/1IeV+Jzy+L671lx2a6aqc3Uz0gs8bYY1rW5wQZN01BT5Dk03U3rYAgd8A200jQwk5Es
JwU5eYvbSIrzR/mGOmq9J+K3mYRt00DT9Ki4o5akPP9kUlNXTLClh5bjw1jsaWS4HBj+yOCA
ppyC6+dKri0p2kfYn+pcNCvVNTT2844QQgixMvHu9pi9JiUaAIkdBIn7Mzw8LE+sEkIIceYz
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
O9u1qqveZfVuS+5yNxgsQ+yADXaCqTEk+Ev4mnwTnuQXEgjFBGxK7GDTDAYDBgMmjnGV1Xvv
WpVV26LV1tmp957fHzN39s7stN2VVtLq/TzPPrs79572vu858zzve857BEEQBEEQBEEQBEEQ
BGHAIQEQQRAEQRAEQRAEQRAEQRAEQRAGHBIAEQRBEARBEARBEARBEARBEARhwOHJ/0oX6bmz
lVI538n0/Hygte63ti42LoS8e8LF3j+HQmy7p/UUWkdPyzjvX8zyhHMn04GAyKJw8q3n52JN
uVTmkCAIgiAIgiAIgiAIgtA38gZA3M6mQi4PdTuW8r1/LpzM7stOnfrOh1PrYnNgpsvAkXd/
jL035c9n/3pLobbdk6BET+w/vay7TL7gYnq53nKu7TqXTAudoxcqaNZXG8hVX29lUUjdmero
y1h6Mt/PhX7yrefZ3u/NmpJevwRCBEEQBEEQBEEQBEEQBjY5AyBuZ5H7x+2464njzU1vHeJO
H9L/Tq/vXDm00h3bmdo6X2RzcmYaf6b3zmUf0ttyyzmXzs91/871SY1023bqdP8UsiM93U4K
tY9MgSw3bp1nCrL0ZR6lt99Xuy5kvXD/zlWH+//+cE5nkodDXx3tvZVFof1M719fxpKrbE/r
KoRC1nN3/X1Z8zK1lek7TBAEQRAEQRAEQRAEQRg4FHQCxLZtbNvu5nRTSmEYRsq7eCoZN6WK
9ppjtMRS63GXdf8uFLcj0emP24lVSH19dWJmc1D3hWzOxnyBBa01Gg+Dxk1iUGsNx9vs5LNz
HQRxbMDBMIyU4EemndRaa1DejP3LRCGO8d6UzVWn27bTAwvOGA3DyCrTbgEUl/03R+1u72cc
l1HCyCumUVq3m5qWWEbHcnob46dU0Xa4ltZYz0/XnE+77sl6ka9/uSg08NrTYEuuQF9P6Y0s
ChlXLr25y/QmaJkvuJqtn72VT0/Xc601WhVTPf0KKut3c6g5lvy829rj6lfqPAWjfDRTh3Zy
5FgzMd37MQiCIAiCIAiCIAiCIAgXN4UFQPAx9uobmVmR/jTAwVVrOBpMOKD81cxcNJOKpl1s
jdlorcAzjIU3TKdjwyr2BQazcNlMQptXs6/NTjoAexqUsG0bbVYyZtpUJo6sosSjsMLtNDec
4HDNSdqtwk+iZHLcuz9POuhUJXOWLcK34222nrXzpijqyfNMjlh32877bqegbdto5WfEjIXM
qjzL7noLW4Oiy8GZaWy9CTrZto2NjzFX38isijb2r1zDkYDlcuB6GL74JmYGNrBybyu242A1
ijP2rydtp/+fSya9Glsm27ZCNJ88wK79pwhpE9u2uzmNM9pL0Yik/W+JWtg2YA5j4bKZBDet
Ym+r1e1/5a1i0oL5jI0dZktbFNvOfgolvY26qIUmLQCZQw7u/idlaQxi9o0L8e1cwdYmq8+O
7dzrRZjj61ezvz13YEgbQ5h/wyxi21axu8XOOJd7Mr/zzcX0diNb3mFHyyAW3TSr72tVD2WR
zZHv/j+f3uLPq5i3bBFFe95mfZ1i7NIbmRbYxDu7Wsgl/Yxll9zItMBG3t5xlphZxZwbF51b
e8mznrfFXHZrVjBx/nzGWkfY1hrttualyyz9b9vWFA27goWzh9C+bxuWrcGQwIcgCIIgCIIg
CIIgCMJAJW8KLGfHrMYmcHAVKw8FUIaBYRgYhsK2neclTJg3CePIWtYd78ByHNPRM+xZv4lo
RxQr4XrTdmanZj6SDi7lZ+S8xczwn2Tn+u00Bmx8FYMZMcyf7E96GYdsgY5cu/tt20YbGh3v
fNIh7pwMyFVfeloa93uZnHapwQ9FxRU3cHXVft5ed5po4kRC/LmidOJcpphHWbe2loBt5OxT
X9IlAXG5AlDBtLnjqV9zmIDl1GVjAzohG1spwKBsQub+pcvKIZduumxRUT4tVSaGSy6F0s22
D61h1aEObNNHRVU1U+bNYX6ohbVHgpChz90czmn2nzz8ZCRs3rKwLAtU1xywbUXlhGkMbt7O
6oNnCNsABhXTb+SaDDq3dTETXW3YhoFSdopu3X3LlRIpOX7suF5tK8Wu3XLvycmSfOuFtm00
ee5H0WfZu2EjhKxkQKhQcgX98qWI0nYTe9ZvwA5EsZ13+rBW9UYWbpnnWhts3V1vKcEyu52a
7Vsw2iJYMWjYs4VOu42YbUMefXYru3czAbuNqG2jlT6n9gL513Nw5r+ifMJUqpp3sKamiahW
3XSa/ne3EyD+ccy9opgTG9dQ22bF9aF7fopKEARBEARBEARBEARBuDTIGgBJP4WgUWgrRiwW
A6UwTTMlDZLWHdSsWYVtW4D7fhCbjtZo/B0z7jxz190rx7UqY9RgxZnNe6g9G8UwDKLNdRxt
NRLOuO4pfhzSncXppwlS2nH/JBzFWmssy+qWFilffenP3L/T2+r6TGFpQNtYloWlddLZqLWm
9dBa3rHiYSXDiKelcqepSu9LTwMF3WxAawKH99I6ZjrzJtSx5nBnIthhJ4JO2hUAsbP2LzWg
UZhunP9tmxSZ2OS/PDzvuFDoWIRIOIxNmDOdQczRU1lU6kXZAawMek53ONt2e4r9J0kGjhJj
1U4gTaO1Rcu+Nax39d+24ydl0senlELbqXPMILOdZbMvd/+Tn6O72TXQ4xMP+dYLIyVQlTkA
0dWWTWdbNGc76ePLVV/6SaFs8gCLQGskPoc8vV+reiILpTKPKe/aYHRfj1JPC4VoqQ8mywSa
6uh0ghV55NW9bD0BZ2x293ah5/billWu9dwtI61t2mo2sDGpi+wnPrIGKgPHWL/iCJYTvKH/
7nQSBEEQBEEQBEEQBEEQ+p+8KbDAcT51/d3NUWT4qZ42i4nDKikv8WLEAjTUbGdbTTNRzwiW
3DKb9jVvsTuQrIQ031uPUDpES9BgwsRxDG4+Sku0+0XDqnQyS68aT0miq4Zpoujk0KqVHGy3
UL4qJs6exYQhpXh0kJYT+9l1oJ5OG/AMY/FNM4meDlA5ahilqolt7+yPO/4SOf1VUTVzrp5D
6anNbDzUjO3NXF9QK8CkpHoKM6eMotJvYhCl9eh2th5uQ5dNYclV4ylN6WeAg++spX32zSwc
bAALuPWuBWA3seXNDdRHQfmqmDRrJhOHlsXbq93HrkMNBO0s7R3bwfYj7cn0N7119ulwHbu2
VrDsygWMr1vN4YANzimChPxtrTGKhjBpdvf+hbSBKpvM0qsmpI05t2527q8jYPkYdfXNLEiT
ybYVm2nKf91G5vGk2DYor5/K4ZO4YmiMkxtbiTiO0qLB3fV7sIGQrcDwM2LGLCal2f+Wg01E
bdvVjnalAHMmQBGjrr6JKQ2rePtAmFHX3NJN59ve3kS9VUT1jMxzLIaH0pHTmDW1S98tR7ex
taYNC1DeSsZeMZ0Jw8vxGzah9noO79lLbXMES8eDKUm79lcz6+o5lJ3awtaj7dg9SlqWSaYZ
7jIxh7L4xumET7ZSMmIEVSUe7M5GDm3byuGWGNoznCtvmUdk01vsOGuhPBWMmT6DicNKUJaF
FY3hK9fse3stJ61hLL5pOpFTASpGD6PCjNJ68iAHzxYzdtJohpb7sFqPs2frPurDOq6rK2Yx
cXgl5cVejFgnDYe3s+3QWaLmcK68bT7RDW+wpcVOGkVf1qp8a6dtK0qqp/ZwbVjB/kDXCZXU
9WgTGw+1YHkqGTd9BhNHVKTo/ERrDKNiGkuXZJh/K9/hYIdGeSsZP2Nmir3U7NpNbUs0cdbr
3NpLrvXckRvmMBbeNIfo5hXsOBtDa41nyAKWLdBsfXsbTTFQZgWjZ0zPbCdhjeEb1E0mR/bs
42S7hc5wYkgQBEEQBEEQBEEQBEG49CkoABJHUTb9Zu6aFneAKaWINW1n9ZYGwjpGe/0Rdh9t
ozUQwz98BksXL2Z642ts7+jaMdybVDIpPXB2ctsdHN68k+KFs7j29qm0njrKkSPHqGuLdu2k
bz/I6tcPYFkWWpUx5drrmNC6k8NtMWxVwviFVzIusJ1Vr54k5BvBnOsXMS/wDmuPdcbTPZnF
lFsH2L5qO0FMYiEfQwC0Db6Es/HkRtYfbCaWq77aIBSPYe68UQS2rOK100GUt4SKcoWtdbyf
r+1P3OlRxuRrr2Ni6y5q2oJEV79Cx8xbuH7wHl5bdbIrHZIqYezCKxkf2MaqV08R9A5nzg2L
mRfM3l5lhRFP69NX556CcP0uttXdwuKFE6lfVUO7lXDy6sQJEKOEcYtS+zf3hsXMC61kXW0Q
q+0gq187kBxzPt3Mvn4R8wItrD3ayYnVr9CekMnrq08RM008Ho87S1WvBlU2/Wbunt71id1a
Q00wnuYHIy7vbvrtjI8HonRksP+Zja+xrQ1AZ9x1H/+764QIhDnp0vnrq091pfgyssyxM6+z
IziSefNH0bF5JRvqQuAppqJCYdk2tipm7PwrmaYPsmHFGlqiPgZPWcSVV80n9tYGjoW7Urvh
q2bO0jmUndzM5iNt2Mrow/UI3dcLq/0ga9fU0K5Be0qp0DXs3bSX5k6TEXOuZf6csZxaWUPA
dtI72Vjay9j5VzElvIu1b52i01Z4hszmxqvKsZ20Yp5SKqz9bHt7MwHvOK66cTbzvLvZsO5N
NlqVTL/+WmZNOU3DzmYsHUnKsa3Twj98OksWLWJ64+tsb3OCVXafgh6FymLd2sN0+Ef2eG04
3O5KRZW2Hm041EKUYsYvXMIV+iDr315DS7SIIVPjOrfe2czJ1v2s+vP+5OmL5PxrtxLzbwnT
9EHWv726q+zSBcTe2kCtYy+21Wd7ybeen26NdAUmDLduEmt84nf8dJyfMfOvzGgn2raxKWZs
RpnMw161ldMRG9M0z426BUEQBEEQBEEQBEEQhIuGggMgStl01qxj3eEAJNJfGVhEAXSMjqYz
8ZQ9tk349BFOh8YwqNjAbks4eXVXmqS+4DjN7OAptr9zin1V1YyfMJHZ105lRtNhdm47yJlo
1657MKmYspBp3uOs39NIxAZVPoZJFS3s3XCC9qiNitVTcyzEsrFD8B4LENIadIy2ujrOdsRv
c9CGD1AYxSOZO3cOZSfXs27/WWKojPUdPhbixrFD8NUeJxwLEbK8VI6oZkhbLWcCnbS2GBgp
XnuTyqkLuSLRzxju1EZpl32XOu2dTLTXwJG87ZnxtGW9TPXipKJBKZSK0rBrO3U3LWTBhHpW
Hgom3Phx56QqHcfkihb2rj9Be1SjYg1xeYwZQtHxE4SSwbDCdHP4WIhlY4fiO1ZLMGk+qTJx
+tg7NB373uKtAx2gPPjKBlE9eS4Lbyxj25sbOOkdmxjP8cR46pPj8dUeJ2xHaT/TGA/+pNm/
btUZLb5bMLCbxz0tFZIdTZljkbqjXW20x/U9qLqaIe3HORMI0tocL2dUjGNyVYiaFTWcDWkg
ROPBXRwbex2TR/uprYmnWjP8cbsuP7WeDQdbsQ2TvvmDu9YL7QRxdIyQToxdx2ivP01jW3x+
1Z1owV5YgV9pOrSTfspGF49mypBODrx5ikA89xmxSBStSJ7O0DpGW309LcEYhE5zsnUW/tYG
mkMWmhZO1QWZNKQEUzcR01HaGhsSactswqcTcvQr7JZEQrCkLs5VFCSzLMIasCKEe7g2ROPX
YpBtPXLrvDkc1/mZQ7upHXstk0cVcaqmM3Fnj0HF1K75F9UKo3x8t7KNB3dxbMx1TBldzHHH
XopHMXde3+0l33q+Y+t+GsJ2Vyq5lJMhif9tG+3PbifatqF0HFOqgtS8fYjmMCkymTjSz+mj
QUmDJQiCIAiCIAiCIAiCMAApKAASdwrF70kIRSIow0jZLas1mGXVTJ40hqGlRXi9RZT6DVq0
zuDYhXhAxJUWqNcOeYvQ2RPsazrOgZLRzLt2AQtmN/HWljNEiddvDprKoimKI2v30ZS4mdoo
KqPIHML82+5innbqM6Hdg6lSGulyQCc+8pSPYJg/zKmGVmI6vn/f8GWrz4tHKcLRBrav2sqE
aVNYcNMsaD7OwT17Od5mJU/HmIOmsnByvJ9nLRW/JFmr5IGNFEd/1v5nb+/Q3n2caO9lniin
XUAlAg86Us+uHfXctGA+E0+vozMhJK01ypHH7e/pLl9XfeagKT3SjcdQKJ0a8OirwzI1sKPQ
WEQ6mji2YxMlQ29gcrWfuo7c49EaPOXVTJg0Nqf9p6bAcp0A0an9yfQ3KMyyEd3mWKsGInVs
eWczk6ZPZcFNs6H5OAd27+ZYSwzlK8FHJ+0hVyNWkJagZkypL9kfT8VwhvnDnG5oI2przD6d
qIn33Y6F6QyFkhd/x+Wb5YJybDTO/TZJAWEWVVKkg3RGbUhLr5QaRErYgkokZFMK55YI27K7
7pFA4SkfycTJabpKadhd97lZq9yyME0z0df4PNrWw7VBqezrEQqMotKsOh9d4gMdQEO3tVEp
MLLZS+j820um9Xzh7CZe31RP1JWnztGF06TWGqOogiIdJBjr/n2jtcbwleIjSFs4GT0CK0hr
UDO6xItBsG8DEARBEARBEARBEARBEC5K8gZAlFJxpzeActLxdF24G88DP4qFV19BdM861m1p
JqLLmXHLMoZldBYqdNrHvXEspqcSsgL1nGi2GOX3ohynpaeKKxZMwj60igPNsa42YiEisUZ2
vbaGU5HUS8Jxn7xIfKZ1/PJxhSbSuJOtwau44apFdLyzkdpOnbG+9IuOY4E6Dm45zaEdFYye
tZj5S+YQfHMrDbHUfh5ssVyOfUXCZZzq+42FiMYa2dmT9q6aTfDt7ZzthSPXsYH4P/F2NBCt
3832uhtZuGgS+5xuKgWxYE55QM90477g2TAMDJVBJucQxzkNKm5HiT7t/PNqTkdVtz7F7X9G
iv3PvHUZQ116dPqatFvlbg9XsE2hEuNT7nxCRSNZePX0bm0MS5SzAnUc3FzHoe0VjJl9JfOX
zqPz9c2cCQeIqGrK/Yq6jsTF0J5iBhUrIqcjoIoATaRhJ1uDS7jhykUEVm/mVDg1bV1P7cX9
d9ay7lNNqR8n/9CxEDFzBFV+RWOH67IW9/t02QnKSKxVznw2UrO+FY1i0TUzie5O01XGMfR9
rconC6UUVmd9QWvDgeZYUmbOJeDp69HxINgZdI7pj+u8LhoPrHiqmL4wdf4ppbAj/W8vjlzd
fyfX8yJPIq1WPHhlqK52UgJgCTsZVASNMeeUUddzZ1wVRYr6RLAV009lsSLSEMEG+hjDEQRB
EARBEARBEARBEC5CCvb5OE5FleKASzzzllJiRAm0d2LhpXToKIYVq+RpgXhRhVI2MbyUV5RR
XOxPPW3REzxVTJs3myvGj2L44CqGDB/DpFmLWFBtU3f4DBENKC9Dpy9gXHQ/mw+2Yjl9VQq7
/QS1nUOZu2Aqw8p8eEwPvpIKKkq8mIaBYaiU0w6O8z4hAjqObGRLQyVzl8xgqM/Ebj+esb7y
Ei+GUpj+QQwfWoHfY4KOEGgPYauEYy/ZzwNsOZS4tNol41goBiWDqfAamF4vpqGw249zrBft
mb2/0AGlMtgAEer37KS+9ApmDu4KHumOzPJ1+pc+ZttVZ7ayFaU+zETQwS0Tw/Qk7x3o6R0z
Xc53jTLid4l4PF78ZUMYP2cRk31nONoQSep33sJpyT55i8upKPVhKIXyllHssv+yYaMZ6lco
ZWAYGkt7Ka8so6S0GK/SiTlQGv/fcEJLXUEVKzG+co/C8MTHp7ylGdtAKZS/imFDypP67mgP
JvWtA7Ucbilm8pzJDPYbGGYxQ6fMZryngYOnQmCohB06dl3B7MXTqfL0zFZS53k8cKdMT0Km
zo+Z1FX39YS08qCUgW6v5WhbMVPmTWNosYEyfJRVlGBqUsrhCv7Ff1xBM6WIB0IURlEZxUaE
QEfXWtWlKyMe6FPGOVmr0u3LNN0/8fsyjKJKhg4uK2htcOZJfLiJQA86ZT0a4jUy6nzYlNmM
8zRy8GQntvIyfOYixkX3Z5h/xznSD/aSgqeKqfNmM238SIZVDWLwsNT1PIpC6TBtYQ+DRw+l
xGNSXDmcUdXleFRcFrbLTob4VTc70R21HG4uYfLcKd1kUnMqlBKMEwRBEARBEARBEARBEAYO
BabAcv+dcLu5dkLrwDF2H6lkztI7mKzDtNWfoDlgUWk4u68T4QSrjaPHOrhq9nVc236UzRsP
0tEzn3W8D4ZB1PYzasosJvo8qFiI9rYWjm9dQ019NO7MKh3P7HF+TKZz/Z3TEiVjnN2xik11
HRzetAlmXMGiG2dSZMYIB9o5c2QHu0+F0CoRFzLiDmwA7QRFDAPTiHJm92YOLFnK4gWdrN58
PEt9O9lzOoT2VjBm1lQWlfkwsIkGmjiyZScNMYVRNiHRzyu47o6pXf3cuYYt9RHCdQepHT2X
q24bSyxwiq1rd9IUC3Bk8yaYXnh7R7ftpjEWP1VwLtJGJYnUs3tXPcMWjkieDoFs8t3J7lNB
jJLxWca8ms11uceG1kmZXHnrWGKdp9m+fjctvczupRLO8dKpN3Bnois62knbmRNsWXWYhqjC
VIEc47GxO2vZc2RQN/sfZJgYdjvHaju4cs4N3Nh+hPVrDnLsWPz/G9qPsGHtEacjcdm5xpei
80D2NkxfJePnXMGI8lT7arQMDEKc2LIBc/oMFi67Ap8RI9Rymt3r9lEfTaRjwrHrGGd2b+bg
kqUsmNvJhh2nCfVQlsngBQalU67njinuN8LUrn2H3R2J913nPpz0VcowMEg49w0DQ3VyZMMG
mDWDBcumUmTECHRE8RrhpMycYIlpmqDMeFQ3/QSI83+glt2Hq5ibSY5moi7TxNTtcT31da3K
YF9uWeyNVTB29lRG9GhtWM3mRtVNb8n1aMsJTmzZgJGm8z3r91MfVZjlE5Nr43V3TEutty7E
8Qxlz4e9QCJoqRRRy8/oybOZVJRYz1ubqd28mpr6aPzEIZ0c23mQqrkLuflORSzYQmNjB52W
ituMncdOCMbHNSNNJhsO0BBVpN65IgiCIAiCIAiCIAiCIAwU1JtvvqlvvvlmJk+enPLASTHi
XOzszoGfKZVLelqS5P+e4Sy5dQ4da99mb5ud3OWekkKowN237jbcfUoOxlVHpn6nt+lO1+Le
wZ4iIFfAx/07vV/u35nGlC6f9GduCnXGpY89W3vu9FG9kXcmWWYak9N3d/3u9p1+ZiqXrf/p
NpKtXG/H5Vwq7owvW5257CWT7aenPspFuu1lO8mSqY1sdpTrWSH9cttLIWNw9y9dnu46c82j
XH1312lUzuKW66rY+8ZqTke77tTI1sf09Erpv3ONMZstFCqHdPty19F1qkx1012mvmeSTa4+
uH9nW6/TT+5kazdTHenPemIv7jmTLqNsa1amfhVqJ3WxzDbSm3VRuHjJNL8z/XzjG9/ggQce
uJBdFQRBEARBEARBEAShH3j++ecLvwQ9m+PQnZLFwe0AxFdMkWHRokm5B8Lt/CvU6eR+z7mb
IxOZnMNux5zbUZdeb7a+5HMOuj/P5ATMFazJ5dTL1o98Dtx8gYKekst5ne5EzSXf9LqyvZNt
bJkcoX0dV7Y+ZnLA5upLT1NwZWs/Vz3ZHNO5dJKpf+njyfYs0/+5cMss3QZzjSFTeQfbtl1B
KPBVDMJnh4jqePAjk44ykSkQkt52tj45v3tqY/kCAunBkPR3exqIcJMvWJCvzv6wl2zjc8u6
p4GnTHaSbx5L8EMQBEEQBEEQBEEQBGFgUtAl6LfddlvOd1577bVuu3S11uCpYOL86ZS3H2Zn
SMVTzGRwbvWETI5dN85nd955Z8H9Ta+70D5kazvbO5mcb+mnBQrtS7rzvdD2ehskyGcDbgqR
bz7HbiE783P9XwhKKe64446872UaTzZd9qYPhXzmkK2NXPLIFjQqpM2eBj/cwcf0vjrrQqHr
iYOnuJIS3UFLZ5SiqvHMmTWY8Ml1tNoGhml0C5jk6p+7L7me5ytfCIXYVy7b6u3a4JAtyFFI
vflOMZ0Le3He7+0cdKO1xigqpzyHneRakyT4IQiCIAiCIAiCIAiCMDDJmQILSElL4t7R7Q5k
ZNpBq7XG1kWMGDuI4OnTtEX7fgohnWwBEPcJlHSnb7Z0J+fSAZbNwZgrHU06Pd1F3ZP2elIv
ZLeB9P7msofejjnb2PpC+riypWvqyXjS6z6fDtVMbeQLvl0IsgVACl1P4mUUxaNnMHPcEMpL
vBBuo/HYAQ4cO0s4cXF8oQGQbP27kPaVfjLhXK8N+fp4ruvtaft9mYOp9Sn8o6bntROnXmFg
IimwBEEQBEEQBEEQBEFwkzMFlns3t/v/9Hec36lOy8SdG4RpOF4HKAwju5Ovt+SrxzTNjI7h
cxmE6Um/ztWu6f6sN58NZGqvEPkW2rfzoaP0caXbSXrbPbGX/nCu9uVUQH+ST//51pM4muDJ
3Ww8Hr/lvuuEiYGh+nZ59fmc//nsq1Db6u81qr84l3MwXs4uyE4u9LgFQRAEQRAEQRAEQRCE
/iVnCqx0x3cux2v67vhM93Ckv3c+yNfncx2EGegUYgPZ3r+YKXRcl8p4LgV6sp6k/58e6Mh1
auJioLdr5+XEuZyDl6qdCIIgCIIgCIIgCIIgCOeXgu4A6c3z9NMg/cm5OHkgdNETmV1K8r1Y
TnRcTvR0Pcl0p0h6sPVipbdr5+XEuZiD6QH3S81OBEEQBEEQBEEQBEEQhPNH3gCIQ28dSBfS
8XShnV6DBg2itraWioqKC9qPc8WFluf5YqCO62KmNynQLlU9Xar97k/OZRpAkbcgCIIgCIIg
CIIgCILgkDE5rELNAAAgAElEQVQAEggEaGpqIhqN9nd/Lil8Ph/Dhw+nqKiox2VFxgOHfHYg
ur50EF1e3Ih+Bi6iW0EQBEEQBEEQBEEQzgcZAyCNjY1Mnz6dkpKSnJdeX84YhkFzczO1tbWM
GTOmx+VFxhcPPp+PNWvWcM011xCJRHpUthA7EF33H6LLixvRz8DlQuvW+cz9W2uNbdvdfguC
IAiCIAiCIAiCcPmQMQBiWRYlJSWEw+H+7s8lRVVVFQcPHuxVWZHxxUckEumx4w7y24Houv8R
XV7ciH4GLhdKt+6giBP8cP9IAEQQBEEQBEEQBEEQLk+y3gHiOAuE7FiW1afy51LGjlPHMIxz
Ut/lRPqO4Z5SiB3k03UkEiEcDqfUpZSiqKgIv9/f4z5drlwMunS/Fw6HKS4uZtCgQYRCIRob
GykqKsLn8/W4bwOBC62fMWPHEovFUj5TgDIMcJzlgMfj4cTx4z3u3+XMhdZtvgCI+0cQBEEQ
BEEQBEEQhMuHgi9BFy5eWltbCQQCAFRXV0sQ5BJDa41lWXzwgx+kuro6eYlzMBjkV7/6Fe3t
7RIEuQQJh8PcfPPNXHXVVZSVlaG15tixYzz77LNYloVpmhe6i5cdn/70p5k+Ywa4nODKMPjZ
c88xdepUlixZAsSd8d/9znd46623LlRXhR7S1NREW1sbQLcgR3pwRBAEQRAEQRAEQRCEy4de
BUCCwWAyDUVRURHFxcUFf5aO44xwnL7uz3qKu45MbbjfydRGtvIXM21tbbS0tPClL32Jxx9/
HNu2uwVAMsm4kGeZ6On7vcW9m9hpqxD9OlxKugyFQixatIiRI0fy8ssvEwqFALjtttt44IEH
ePLJJwsKgKTLIV0G+Z4XUmemsoXM13Nhe5cSkUiEmTNncvvtt7NlyxbWr1/P6NGjed/73sd7
3vMe/vCHP1BSUpKzjlxyzafbnr7X13bcz9xlLjbdBgIBxo4O0tn5J+JdU3i9cxk7dix/fvVV
7lk+hiPHhjJ29Gg++9nP0t7RwaaNG3PWWajshfNLW1sbTz/9dDKg7PzEYjGi0SjRaJRIJCKX
qAuCIAiCIAiCIAjCZUavAiDhcJgvf/nLAPzTP/1TMsiR7zN3ACQ9FYXj6M7k+O4JmRx22S5M
ddJGKaXyOtkvRoLBIG1tbfzLv/wLwWCQzs5Oqqqqks+zjd2Rc08CB5neP1+ycudrd9rJpp9M
715qJ2DC4TDLli3jK1/5SjLtFcChQ4e4/vrr0VrT0tKSNYgI3VO+ODJzftLTvxQSVCrUWZ5p
LrnnsptstteTYMylMEcjkQhLly5Fa83PfvYzSktLqamp4ZprrmHx4sW8+OKLOctnStvjli3Q
bb1Ml2s+G3C/527X+Z2rvHt9ztVuev0XGk2if0b8q0+hUMrH3r17mT5jBkp50bZNJFrDmDHj
+ad//Ee+/JWvZAyCZEut5IzdWYcupvEPdGzb5te//nXKfR/uHycoMnXq1AvdVUEQBEEQBEEQ
BEEQ+omsAZB8DtCKigpM0+Txxx8nGo3i9XqTO5rTP3Nye6c769Id1+ntup1o7vLZPnOcTul1
Oe2469NaY9k+xi1dxrhTK1h/MgI9dJz3NZVGX/KR27ZNW1sbDz/8MNXV1Tz22GOUl5fnlLFh
GBiGkfNZrn6my9Et63OF05ZlWdjGIObeeTvDdv6BdzLox+3g0kWjuebmCZx6ey0nInY328nX
prvt3vS50HFlw5H9Zz7zGX77299y5swZLMtKfv7Zz36WJ554IuNJELfMLMtCa41hGJimmdSR
4/xz3xXjfp6pvmz59tMd3LZtd5tLdtqYs9leIbbk1k96H3K9e6F06bzj8Xjo6OhAa51Md9XZ
2cno0aNz1uG2a0ef0BXcM02zu/wT77nlms8GMsnQ7czPVT5TACRdn+6y6SfvLqx+TJTyAwql
QKliwuEwRUVFic/B6x0HtDB27GC++MUv8sS3v82bb76Z0ka6cz3b+C8XLgbd2raNz+dLWWfc
gY9c33OCIAiCIAiCIAiCIAxMenUCxOfz8bd/+7c888wzPPLIIznffeaZZ/jYxz7W7dJfrTWW
LuPKT36Wpbu/x/dWnMECNEWMv+1jfGRxCy//96/Y2mxTMvthHnt/hJ9/7accrljGpx9ZxP7/
/g6vno5ie6fw4f97N80/eoJX61OdI47zQw1dxt99agrvfOsHbAsknIZGJbPufpC7x9Twh72R
+M5gLp10Js3Nzdx0001ceeWVvPDCC9i2TXl5eco7qTL+Pv+1sgntDgCZo3nvo3/N4N9/jecO
RnM6oG3bxvJM4kOfj8v6f+vsnKcynM/zyTP9efI0QdEYbrz/fq4MreD5hhAaIyVvv9vBpSpm
cvdD72Vkze/YHbHQ2sx5AuFipqysLKNssp38cIjrupzFf/M57h7ZwcYffJOXj8fA40EphWVZ
RK0yrvrY51g+voW3v/MkK87aWYMIqfr+Nn86GUP7pvLgY8uTcy3ZrqpImUt2ot+WMYZ7/v5B
yl/8Bj+viaY67F22lD5vs/XH7bh3HJkXoz6dfrrv+HDSmjmBBee9TOnqkgFA7ygWv/t2rp8z
jiq/QbS9nmP7NvH2m5upi7qDHzb+6R/ic3e18sNvvk71J/6Be0blt4G3nvgWrzeYjHnv5/jE
yFf46jM7CegKlnz6MZYXYENvPfEt/txYxtJPf4HlI9Ol0MHGZ57k1Tr7/Ai5LygTpeLzSQFK
+ZkxcwbbtmxFqTsZNnQQq1ZvSF6W/p53v5uS0tJkccceY7EYFqVMWnoT18yeyNhRQyk1bcJt
9Rzb8SYvv11DZx+D5OebXCkhCyl3seEO0KUEyDOc1BEEQRAEQRAEQRAE4fKgVwGQ4uJiIpEI
kUgEgPvvvz/je7/4xS+S76Q7cOPOCY2tQVvxHN228jFs6Qd4aGmUt555ga1nLVCK0NE/8/Nf
2JyKgNWykz88X0vH2WjS+afRaG1j26m7kp1dn8Ti79i2hWUplPIy7Ia/5BbfKn7wXxtptAw8
Hk/GHazpu6QvBsdPU1MTEyZM4J577qG+vp633nqL0aNHd3vPkbHWgB2XhTMe27axtIUm/sy2
U09NpJ+2SZG1bSVl7ezqz+RIyyfPbA4prT1UX3cHE4/9mu+/cYhODAwjc6DFYjDX3bcMzztP
8/TmBmzTg2l2pWTqrR7b29sJBoNZnxcXF3cLOJ0LvF5vxr55PLmnatLeNUAZV961iJXfX02r
pRLOaxvfpFu5bbwBaGwrhmV17c7PqW/nZEnaXDMMA9s2GHZj6lxynPoWNlqDTtieU79lWcTI
Pm/T+6K1JhaD6tv/D58c9yrfeGYnIR0PLhQSBOlPXYZCIfx+P0uWLGHo0KFA/C6XaDSKx+Nh
6NChKKW47rrr2LlzZ/J9N7ZtY1PBvA/8NXdVbOHFH77AwSaLkuETmTG9AstKnVeWXcS4ReMI
73mW2qDFsEJtIBbDssC2AW1hWxYWFnah5aNRYjELrW2a3vgO33n7DDoRmDJNA2XbYOS/6L1f
55rWqOQJECcFVjGbN25izNixgElF5UluvXl0WrE0mVsWdvEU3vvwh1hs7uatN17iteNn6bQ9
lFVVM7L0DCEb4nHb7OnJMp1uSic90JxpzcxWX67gdLZ1OFd7F/s6mi0Akh4IEQRBEARBEARB
EATh8qHXl6ADyeBGLrK90+V0AWyLWExTNvduHr6ris0//S9WnorGUx5pTaztGPvbEs6WSBOH
95/pcm4Ydjyxu93lSE3uYE84blUs7gy3LQvbNoAwp994im9aETQK0yTFYe52lDg7zS+W1BnN
zc0UFxfzmc98Bq013/rWtygvL8+6k1/rRJDJjnULgMTsuLMz7oS2U5zfjpPInf5Gx/2e6ISs
nXfdgZBsJzrc9Tl1psu6y7lmceLVp3k2+Znu5rzq6ms9K556AjsWA6Uw6XK0p6fz6Ykeg8Eg
X/va17LK9Qtf+MJ5CYD0li7ZWJzduJ7gwlu4fdoWfrk/DEphGSNY9t45dG5YRduiGYn5QnKX
e059ux2krrkGYNuxbnMpqVtsNKkBkHgZG1tln7eZ+hKLQdTSoGNEIhEsry9pc5DbEdufugyH
wzz22GMMGTKE4uJiDMNg+fLlRKNRTNOkqKgIwzC47777uOmmm/i3f/u3jGnNbM9w5k4yOPjj
P7HpaBiPx0PoxB7WnTYTNuyaW/4JLB4XYfefTxLWxYDF2Q3rCS7KbQPOvI/HUxLrKRpbF2ZD
8QCWjgeXo+H4vU+micfjwbYTKaAKkFn/zzUTRSIAoso4fDjE2eY2zjbvoqamk/Hjm4jpQKID
4PHMwr2qOSnfprz7Ppb41vGDJ17mWLRrbQl1ttPkBCTSnO/xNrPfq+LGHYjItmZC1zzJtH5n
CnQ4ZbLV6XzuzK++fB/2t25zBUDST5IJgiAIgiAIgiAIgnB50KsASCQS4fHHH09J8ZIN556Q
z3/+81RWVqY8izvP4g5479hb+ej9V1D7m+/wvzUhSOS5j6e4ej/B577Ji8eiAHgnf5AvfMDm
uf/4OQdsp46unbn4R7Ho9ndx45yxVJqdNDXDYLMZbdtYlsYsncQN738v10weSpHVSu2mV/j9
m/tojRlovAyedSvvuWkuYwb5MO0gJ9a+wAsr6+kPt0lzczNtbW1UVFSkXGgO0NbWRigU4t//
/d8xTZP/+Z//IRwOM2TIkKz1OTJG20SjUVQiqGDbNjHDOQHiSi9UMoHr7rmLqyclZLP5f3np
9T202MrlONLYtmLI9Z/h767cw1PfeYP6RJDJM+pd/O1DFbz87RfY32lD8QSuf19qfX94cx8t
MZVR1sfXvsDzb50kokqZ+/HPc/OB7/GdtxuJ+abx4OfvIrTrDGPmXcFQ4zAvPvFbItcu54Yr
RlM9uAQz3MT+Fb/m1+8cJ4iPIbNv5b03z+uVHouLi/nCF77At7/9bQzV5eiztc2jjz6aNyXV
hSTWuI7frLiCv73rBkYcfIWTUQ+Vi97N9b5N/PCtk9y1aEbXXCmewA3vf09efUPmXfAUT+DG
e+7iatdceumNvbTYCq1I2p5lWaiKWbz/E+9j2JYf8+zK1Hkbi8Wy2l6zXcqcj/8D9080gAf4
568+ALHDvPCfz3Ewfwy2X3Wptaaqqori4uLk+uj3+7sFOfx+P1VVVVl3oyurhdqzHq69dinj
j6/iRCjVSd7l4NX4Jy5mQmQ3r52KYhilKAWxM2vz2oAi4Rh39R1FvHwBNpTsR/yPeDDUMDKm
9spF/881Vwoso5jNW7YzdeoUQLFl63YmTJyEET8WQ7p2ksGKogksnenj2EtvUxtReLyebkGB
ZPCgaBRX3vkurpteTbknSvvpPbzz8v+y6WQQyzeNhz7/LgI7Ghk9bwbV/k5ObnmD1w9XsuT6
RUwaWUL0xAZ+//P/YW8HaN9UPvyFu9EHm6mePoEqX5SWI5v580t/ZmdTFNs3jQcfS1snv/Uj
tkbHd5vn+dbhX7x9iggeqmb2/vuwv3Ubi8W49dZbU+7+iMVixGLxU6bOjyAIgiAIgiAIgiAI
lw+9CoAAlJSUFOTk8nq9OQMlGvAMWcpDN1+Pfu0/+fW2VvD6MN27T4kHSRznX3z3ucZ2fRb/
3EYbVVzzoY9ym72C5771LIfaFIOueA+PfLg67rTVg1jy0F+xtOE3fO9ft3K2aDp/8dkHua/l
CX6wvgVduYB7751P4/NP8G87W6B4MGNHeZLO2vOdAquzs5Mnn3ySH//4x+zbt4/y8nL8fj+d
nZ20tbXxr//6rxQXF3P27Fl+97vfZUx95SYuH5Nhdz7GV+/M+AaHHIe2rmTJhx9kSZps/vLs
t3l6XTPadKe3inFm+zpO3XIDc4e8ySunYoCP0Ytm4d3/aw53xLBUVby+xtT67m3OLusxo0xs
ndAtgO5yZOEbTHXkdV78zou0e0uxO8P4967k92vrOH02xqDpd/KxD3+YOw59ld+2zea+++bT
+PyTvdKjsyv50UcfTTrv3E67i+n0h4NSKnGnQZSTb77Ilqv+mnfPXc1/7xjOrXeMpuaPP6Mm
FHdc48yFBx/qpp9M+k7Htm10Fv3+ZXO8vK0Sp6psG7tsJvd84v0M2/pjfvhGLSHvtMx1ZbG9
rf/1Rere/Rh/N+FlvvxfO4h4fYm1Jb9c+lOX7h307p3m6Tv83ZfCp6OUwrTPsPK53zL4Q3fz
6X+5iZPb17F61Rp2nQ5hJcrHT3cVM+XKcYR2/5l6y8AwHBuI5beBtDmQPJlAYTYUTx+lAJNh
73qMr9yhcWqM1b3BMz9ay1mdP01Sf881pUyUKkqMwc+mjZu55dbbQcMbb7zKX7x/JqiEkzxD
17XWGGXVDPW0s7cuCMm0X2a3Ux2WrmDRBz/CHfoNnn38KWrDpUy86cN85KN/SeibP2Zz0IKi
oYwM/5kXvvk8DSVX8dFHl3Nf8e/5ybNf5SexMdz+6U9xzy072P/iUcKGBZ4y/Ed+wpMv1GGV
j+eq5Q/xlx8zaXn8txyKxhLr5Gu8+J0XafUUEw2Us/ijD3WbW4Wsw7p8Tp++D/tbt7FYjNde
e63byRXnNKht2yxatOictikIgiAIgiAIgiAIwsVNr3I6+Xy+vJefO4RCIR555JFupz/c2IHT
HG+CEfPmMcKbmnLH8Q9qu+szW5PcddxF3OFhDFnINeNaWPHbN6lpjaJ0hLamdqKJ941hV3J9
9Un+9PJmGkIWVtsBVm5oZ/TCyZQqjY4EaI/5GTtzFhOHFkG4hZPHW4jq1F3w54uSkhJ+85vf
8KlPfYr777+fxsZGWltbaW9v55FHHmHEiBForXniiSeorKzMezdE3EFl0/zOf/P1//gPvv71
r/ONb3yDr33ta/zH4z9lezCRHsy2UUMXcd2Ik/zpj2myWTSZMuUedyLVSutu1hwrZt6VIzBi
MSzvGK6aYbN73TGCTn3VGerLJevauKy7Tgc5jizADnJq926One2g9cwZOmJhGg4f5nhjO6Fw
O6d2rWVHazHDBnnQ4Q7aosV90mN5eTnFxcU8+uijxKxYvwQ/lFLMnTuXaDRKdXV1z8sDKAMj
fJhX/3SU0Xe+i2tuu5u5ba/z8q4Ahuns+teooYm5kFff6fLSXfaSo3xchwqzYhb3PfKXVG/9
IT987SjhhP2o9Loy2t4Uyo1EwEAlxmaa8fRKaal/ctFfunROs7h3m2f7icViGdMeJdMPtWzn
xe98ma/+9/9wwJjO8k9/kccevo3JxXZXqp+SSVw1LsjuLfXEHHlAXhtQmTz7Th96WF5hcXbF
03wjsb7853/+J999fhNnraxNdKN/51r8BIhSxRhGMaFQiMbGRhoaGwkGQyijGJQflD95V0h3
NGBgqtxBQmPYYpZNaGHFSys5HtQou4PDb/+RdaGpLJtfGb+AxQ5Rt3cfJ9ujRBp2s+20RfDk
QWrbolidx9mxpwX/iMEUJe7LQUdormsiZEO09Rirf/cnjpXOY2kiaIEd5NSu3RxtaqeloZHO
ql585znr8Dn4PuxP3Tpz6pFHHuFTn/oUn/jEJ3j44Yf5q7/6Kx588MGuk2uCIAiCIAiCIAiC
IFw29OkS9HORSkIBOnSMV5/+CRV//xE+en8r3/vFFlrtxE5aw0lD0nWxtZHIWa+1RqvUlDBG
2XDK7BZOt1koFd8erlR8t7LzvNw3kQ988avcl/DdKMMLdX6KlKI9uI9fffcXXHPrTTzw2HKo
3cSb//O/bDkdRRdw4XJfqaqqYsuWLVRUVLB8+XImT57MV77yFW6//Xbmzp0LwMqVK2ltbU1e
spwfTSzYRltbG8rj6bqI2ignZEFp4i2jdFgW2RTjU+50OYmdv7qD/asPc/f7lzD6D0c4PX4J
0yI7+NGpSHwXe1m2+nLI+k+vsP540JV8pruDuGv3PBQNn8M1Nyxk8tByiv0lDKk0OWUodGAP
L3z3ea677eY+6dFx0n3uc5/rl5MfL730EsuXL2fChAkMGzaMl156qeCyKm7o8btQTGjf+TJv
3/A5lt/QzMrvb+AsiaBBwnltlGebC6n6djs53WmrVAH2Aoqi6hlMrexgx/5ThHTXwYPC6vLj
S96ZEK+vt3Owv3TpXHjuJtMJkGzrZ0oQRFu0H9vKq4c38/rg+dz3yAf44N1H+frzBwhqRemk
xYwJ7uHV+mi8jDISAYzcNuC0073trj/ylXefILGC7bS3t6M8nmRwKh60KlxX/TfXulJgofyY
poe2tvbEfR8eFH4U2b/blFLYHadpjJUzcWIl+mQzlkumyTt0tEaVDKHEbuV0mwUk1p1YMydb
bRYMKUE5NuHoG5uY1mAa8VOQGNgxG20Y3RJyOfqzgo3UBz2MKPcmw1LKlY6rt+vwhhMhOEff
h/2lW+ekRzQa5Xvf+x4f/ehHU4KOydOEgiAIgiAIgiAIgiBcNmQNgGS6lNUhGAwmd1JqrXn+
+edzNqK1prOzM5nvu1vdykB17uHFp1+i8u/u5eF3t/P9lw/SqVX8ol5MTNXluDDs9H6p5IW+
sUALQeMKqssN9p7pCpg4ziM71EowvJ/f/fvT7AiQdNaZyV3lEGnawxvP7+SNF6tZ8N6H+OBH
ltP8jV9xxLJTHD59PQ2STcaVlZW88cYbDB8+nKuvvpqvf/3reL1eADo6Onjuueeorq7O2X7K
heGQdLC5HWO2SnWExmVzgN/9+1MpsjFSHF0qefmxUtBZs4a96n6uHl/F9mum0Lnl+9THEhf8
htsy1pdT1g8v58x//IL9YZ0e+0i276SZoWweD3zyDoJ/fJZnn6+lQ1dz1z/8H6bFh0vkzG5e
//lO3nhxZEF6zKaPsrIyysrKUt5Nl3U+cs0nJ23Shz70IX75y1+ilOLee+/lN7/5Dbt3787b
v26XKDu65ixrnn2cPcUR2lri9zJolZQiOstcSNe3E3zUtsY91+xgbntRhkJhE9j3O37Z8hE+
+5EP0fDEc2xqTpzoKaAu90kP0KAMSDkhlvmkyoXSpW3bGQMg6ThOWveF1e660y9v1tom3LCT
TUffx7xyP8qysChn8pVjCO56pWvOORXlsIH4UZo89KK81rqbbi42/cQ/NZMnOxR+vF4vbW0d
AHi8PpTyo1RaACS9ztBRVm0P8LFb3suCXc+xuSXa7e4T27Yh0ETAmJH4PkrIxKxkVIVBYEcH
OhmIicvb1k540klHlrpOJYMgrnubjLLhVPsjNLZGXUum6/LzXq7DZ7/2AgfCdo+/Dy+UbqHr
BEg0Gk0GP2KxWPIuEAmACIIgCIIgCIIgCMLlR68vQf/mN7+Jz+fjW9/6FuFwOON7RUVF+Hw+
vvnNb/L3f//3KReeJnc5K8Aw8Xg82M0bef5HVXzy4w/yYMv3+eHKOsJWG6fai1iyYCqDag8Q
HTSeGTOH41N1ifIWYe2nesxwBgc6CTRsYF3Dtdz0Fzdz/IV3ONSqqKoeQrFSGKaJXb+Bdc2f
5d4PLiP4+w0ca43hrxrOYE8HTW0xVOloJlcFOX68nvZYGw11bcTm+fCc34MfKZimSUVFBT/7
2c8YOnQoU6dOTT777ne/S3l5OT6fL289yZz+Kp733jRNlCtPvWkY8U3cCae13bCJdc2fySib
xpYIKJuw9jNi1DAGdQYJtrYTCh9j9fYYn3jX3YwY1sLGPzaiTQ+mUlgNm1jf/OkeyroIj4Gr
30ZiN3zibgKjy7FnFA9hkCfE0bozhHQRQ6bMZUqlGd+9XjaOycPDnDzReMH0WCg+n48VK1Zw
4403MnjwYHbv3s3hw4cJBoMMGjSIe++9lxUrVuTUeer9DXHnJqaJsgK0dwCmB1PZaDMR9DKM
nHMhRd+jh1HV0UkgEEuda/Xrc5c346cRDNOmYdVP+cWoR/nww3fS9L1XOGxHC66rqS0GQKgt
hKqayAj/dk4oH6a2sAu4h6A/cZyv2e49SgbviJ8UyerMLRrPLXfNwz66nyOnzhL0VDF26iJu
mm2x62cH6URhlE/jqjGd7HqlASt52sJIzpusNuAEMIz4nSEJi0hbL/KX7wqmKgyvL26fySCY
Qtl2PCUT+e8B6U/id4AkUlspH/Pnz+T48RMAzJ83A/DmSH0VP71jGlGO/u8vWTHyr/mLR/+G
ca+/zZaDdbQENf6qasYOC3Ng+zHaGzay8vg13HHP9Rx6fiW1oTImL1vOUv/e+H1XxojknE2e
4HFSvRkGSqtkvCkZ0FAeSgcPoqi2kWjJWJa+/92MObuOl07F4ms68QCwE4zpyzpslo1l4uAg
J040XPTrKJAMdjz99NMpAUR3QFECIIIgCIIgCIIgCIJwedGnS9B9Ph9/8zd/k/zs6aefBuCT
n/xk8rNnn302Y3mlFKZpYADK8OD1erGA2Mk3+ckLFfzNAx/j3vbv88K2Rtb99g3G3/cA/+/f
TMItxzmwv4GWqMI0PZjROtata+Sv3/conzu9kmeeeoVVP/4p3uXv4oP/9zbKdAcnDxylI6Ix
PB68qolVP34O9Z47+NDfv5cKb5S2pjpqVv6GP2xvRRWPYtHyW/jwiBI8WHQ2HmLlL3/HwbBC
9aPXp6ioiPLycr797W/zpS99iSFDhrB161ZOnjzJ8OHDC6rDLWMnyOGkrYmnp0k4yxIBKK3P
sPonP0PddXtG2WDHZf2R932WR0+v4kfPvEptKMbJ9ZsJXL2M6pMvsasFDDPhvLObWPWTn0GW
+rLJ+lAksTNZAYnAjeNMV8rAiOdAwzqzjt+vHMP7P/klltntnN63heNnIow2TDylY7jyntt4
6ALrsRB8Ph979+5l5syZfPzjH+enP/0p9fX1jBgxgnvvvZdAIMD+/fvzBkC6dJ1IU+S6I8O5
sFgnUmAZHm/eueDo25lbP3jqTdaua+Ajrrm28sc/Rb3nzm7lf7+tBQwzrjOPF58nzIE//oQ3
PvYpHrq/ke/+fHfBdf1xRxsoTceu19mw4D4+9s+LCZ3Zyq+e+SPHooVdxtyfRCKRrAEQB601
kUgk69QobuoAACAASURBVHPlMQjFBjF/2fu4sbwIFW6l/nQtG3/+PVbsC6JMDxVXXMnozt28
2mS7Tsn0wAYME9NUmPFFGNPjwaM8BZdXhhm3OWUw5JbP8v/d4h5BOxt+8CSv1tndB3fBMYFE
gEPbPPDA8rTnuitFVhqOnZmmCZFa/vxf3+DA0lu4Ye4dfPiOYZSaNuHWeo7tW8vxXbV06lY2
/uxHeN/zbj70hTsoM0K0HN/Jyz94lb1BE2+RJz5HzHjASWMmvhMTF6tjYsR3CcQD2ChQPsbd
/BCfu2cIFSrAqb0r+NGza2jQXjxeM7mmG04guZfr8IGQwhg6isX33MqDl8A6CvEAyNVXX50S
7HB+nLt5YrHYhe6mIAiCIAiCIAiCIAj9iHrzzTf1zTffzOTJk5Mf1tTUsGDBgqwOumAwmHzm
8/koLi4u+DNITfOiXTuEHSebk9rDwf2++113mXQnqDsFizunvruNXM/cfUjJae9KceLz+di6
dWuK7NwMGjSI2tpaKioquj3LJ2OH1tZWfD4f999/P08++STDhg1LOUmTjUwydvc/k/yBlF2z
2WTjxrZtomok9zz2SUa++nV+uK0T0+tN3F+gk06oQmWdLuNMuMeQvAzapf90u3DIp8dC9JGJ
fHZQiK4jkQi2bXP//fczatQotmzZwsKFCzl16hS/+MUvMAwjawAkl66Tu8bT3kk6swuYC5lO
KWSaa5nKO8/T++v+na+uZMo2l206n5uJE03purhQujx79iyf/OQnGT58eLc5lS6bhoYGnn76
aQYPHtxt/M68SZ+jXTr1UDX7ambZO1i3tw3tmhM9sYFsuGWfqbwzZzPZiFM200X1F1o/X/zn
f+YD970PywoW3KZhlPH//vEf+dPLLyc/Sz9VkGkOZbJbSP3+cv53fudKrWZZFjFzCh/54gcI
PPtlfnU05kpj1f0+jvR53NN12H2fSU++Dy+UbpuammhvbweyrznO3z/84Q954IEHetxHQRAE
QRAEQRAEQRAuLZ5//vne3QHi9/vx+/0p7xb6mRvHSQ6pTiD3bmN3X9y7qgtxGqU75dwOovS2
09t3O3bSnYDZxtNT8jkhASoqKujs7OSpp55iyJAh+P3+HrWbPk63XLPJP59s3P23bRvv0JlM
8x3htf3tYHi71eXWUT5Zp7eRCfdzxxmX7blbVvn0WIg+MnEuctd7vV6i0SjPPfcct912G1df
fTVr167ltddew+fz4fV687aTSdfpZJJvofrON75M5bO915O63PbqrjPTGC+0Lv1+P0899VRB
aXZM06S4uDirnhzbzhzcs2nds5o18Q+Tl42nz7VCbSATuco7a7ETjHL+dtefaR5eaP2Ypsnh
I7XYdqGnABSG4ckoC/f6lmkNcp8WyTbHurWWQy9xO3DeiweYPIlL5zOVO1frcE+/Dy+Ubquq
qqiqqur2njvglymILwiCIAiCIAiCIAjCwKbXKbD6SrrDJtf/PXGI97b9fM9608a5oqSkhJKS
kh6X64lMC5W3+1l8V7uP0VcvovTIH6gJGhgeo5uDr6eyzkchwa9z2V5/4fV6MU2TN954g1de
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
ys5i8Kj+mLUHKNi3j+LaABabE5vpw+3TPiAiIiIiIiIi0nn0BIiIiEifY4K/gl1b91IXN5AR
A+K//kaEI5WhI3OJqsln66YNfLV+G4XeMIUJm4toaxCvN4gZ9BGyOIm2N1sqIeSpIH/nRr74
YiP5nlhyh+WSaIVQwEvQ4iDK0fznREREREREREQioQKIiIhIH2V6StixtYhg6lDyMqOxAobV
idMI4HF7CZgWnPGJxDuafMgwsLuc2Aww7DFk5OYQ4y2lyB0i5C6luN5FzsAcEqNsGBhY7TYs
NLw3PjYKu8XANP24PX5MrFgMMN0HKKpzkNkvrYcyISIiIiIiIiK9kZbAEhER6cMCtfls2WFn
1NA8Bvk3saOshN1FsQzMO4ZM04+7qow6T4jogx8wrERnDGFUPyd2/NRXFbJpSwl1QQA3Rdu3
Qv9+DBqZiR0/nvpy9uzYR401mvTcHJJcNgxM/O4aCnbupjIAmF5Kd26HnOwey4OIiIiIiIiI
9D4qgIiIiPQVpo/ijZ9T/M1f4q/cxdrVX/+mKn8LX+Y3fU/jX6xAKEDV7o3sqA01e4iQr5qC
HRsp+PYLgVK2b/jmJuem+fXSWqa/huLdW9rVHRERERERERGRcLQEloiIiIiIiIiIiIiI9Doq
gIiIiIiIiIiIiIiISK+jAoiIiIiIiIiIiIiIiPQ62gNERERE2iZYxZa1X/R0FCIiIiIiIiIi
baInQEREREREREREREREpNdRAURERERERERERERERHodFUBERERERERERERERKTX0R4gIiIi
vUROdnZPh9AupmmCaWICZihEyDR7OiQRERERERER6UVUABEREekltm7d1tMhtE9j8aPhR7Oh
ICIiIiIinSM6DhKSoXBPT0ciIiLSY1QAERERERERERE5Eh0sciSlQUompGZBWg6kZTf8nJIJ
V0zs6ShFRER6jAogIiIiIiIiIiKHq7YUOZLSGt4THdfT0YqIiBxWVAAREREREREREelJKnKI
iIh0CRVARERERERERES6moocIiIi3U4FEJFe4MCBAz0dgoj0gKabhmfHxvZgJCIiIiICqMgh
IiJymFEBRKQXSE1N7ekQRKSbHSx+NC2CiIiIiEg3aE+Rw+kCq269iIiI9BT9KywiIiIiIiIi
0lR7ihyuWDCMno5YREREmqECiEgvsHnz5p4OQUR62Ohjj+3pEERERESOLCpyiIiI9HoqgIgc
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
7o5pYql22o38NQ+OOHxD95KWD15ERERERERETlpKgIiIiIilnXtjWLNpN3EpL9C5z6X4KuYD
XuyukWz5ej6r1+5izdYuoRcYKOaDaTez7LA3Pur3AJkxY0bLN0BERERERERETkpKgIiIiEij
6hMTT73eEViPab5C5z4/AmDbmnf45OOveOLVHPwBHzabDcMwMAzt/yEiIiIiIiIibU8JEBER
Efme+mWpDj9mvJTBlKqNlBZOw7DZ+XKDyZNzM/AHPNhstgaPtrJ69Wp69ep18OcFCxYwatSo
NotHRERERERERI6+tnsyISIiIse0+rc/6g+fz+SJV9L49WOp/OrRRGbMak+N5/uJkpbazDxp
0SLr/y5efMR/RUREREREREQOpzdARERE5Hvql7OqT37UJzYCgQDl1ZEAREWBYRgH3/aoX/6q
Ld/8EBERERERERGppwSIiIiINOjw/TzsdnsbRyMiIiIiIiIi0jT6iqaIiIiIiIiIiIiIiJxw
lAAREREREREREREREZETjhIgIiIiIiIiIiIiIiJywlECRERERERERERERERETjjaBF1ERERC
lhNVyaVpu0iNqOHNvRksL0tp65Aa1KtXL1auXInH46GmpoZhw4a1dUgiIiIiIiIicpQpASIi
IiIh6RZbzq05+XQ8rSfOmBjS1nxD9o5q5uzOauvQGtS/f/+2DkFERERERERE2pCWwBIREZGg
usWWc+sp28k9dziJyQlE2zzknjuckTl+rkgvaOvwRERERERERES+RwkQERERsRRpC/CLTtvI
GzqW6Cgn1FSCCTZ3MbmDRzM8s5ou0RVtHaaIiIiIiIiIyBGUADnplbNofCpdfvMV1U24KrB7
Nhd3TCYp2sDo+zfyfa0W4Pfr3reQm3r357ZF+wi0Vh1t2L4W417J1FM7csMnVY3/nZo13NMt
jQlLjt6DS7N0CT/P687NS0tabfxEpGX1dpXhapdNTFJ7DG81tqik2sMWicNmI61LT85MLGnr
MEVEREREREREjhBaAsS9hn/8dCidE+0YhkFyz8uZseLQw0vfrvncNigdh2EQ3XkMDy6vP+fh
2+enMKxHO+yGQcKVSzn4mNW7iemnGRjGoSPyorc5EDQYizItYwmvfe5Vt5FtHBmnYcRyybvl
zegz6zY0yqrPgoxRS7OlT2D+9mK2zTmPuAb/Rg3f/KEb6aG2LVTVG3jq+nsx//QmD52f2moZ
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
a1n/mdXBTDY8MhQKHoZsOzyXAKuP+zknECb953PempwX3RWuKISPij6H3Efg/eUwZBCEBjmW
/PWRzzj9tbVJ3X0KpB+8zT+L7zgr1Wa+rmeYzGkREREREREREalxxqJFi9xXXHEFDketvrdD
REREpNJmz57NsGHDajoMEREREREREalms2fP9jwDxGq1kpKSUtPxiIiIiATF7Xaf8K+3l4iI
iIiIiIicPmwA+fn5FBTU1j2tRERERMyVTm6YJUFERERERERE5PSh56qKiIiIiIiIiIiIiEid
owSIiIiIiIiIiIiIiIjUOUqAiIiIiIiIiIiIiIhInaMEiIiIiIiIiIiIiIiI1Dm24i/0YFAR
ERE5Vekh6CIiIiIiIiJSnu4AERERERERERERERGROkcJEBERERERERERERERqXOUABERERER
ERERERERkTpHzwARERGRU56/Z4CIiIiIiIiIyOlHd4CIiIiIiIiIiIiIiEidowSIiIiIiIiI
iIiIiIjUOUqAiIiIiIiIiIiIiIhInaMEiIiIiIiIiIiIiIiI1Dl6CLqIiIic8swegl7+axER
ERERERE5PegOEBERERERERERERERqXOUABERERERERERERERkTpHCRAREREREREREREREalz
9AwQEREROeX5egZI8b96BoiIiIiIiIjI6Ud3gIiIiIiIiIiIiIiISJ2jBIiIiIiIiIiIiIiI
iNQ5SoCIiIiIiIiIiIiIiEidowSIiIiIiIiIiIiIiIjUOSUPQT9w4EBNxiEiIiIiIiIiIiIi
IlJlbACLFi2q6ThEREREKsTtdgPgcrlwu924XC6cTidOpxOHw0FhYSGFhYUUFBRQUFBAfn5+
DUcsIiIiIiIiIieT7dJLL2Xbtm24XK6SBYTiF3gWFQoKCsjOzmb9+vX079+/Uhdcu3YtHTp0
qIrYRURE5DRW+neW4t9jSic/Sic+7HY7drud3Nzcmg5bRERERERERE4SG4DF4nkUiGEYJyRA
DMPAarVitVqxWCxYrdZKXbC4LBEREZHKKP07i2EYJb/HFP++Uvy7S+mXiIiIiIiIiJw+bOBJ
SnhLfhQvKJReRLDZbKYF+mO1WitdhoiIiIi3O0BKHyv+ncPhcOgPMEREREREREROQyV3gHhL
gAAl20kULxwoASIiIiK1QfkEiNPpLHOs+P9sNlvJS0REREREREROHyUJkNJ3fZT+1zAMbDab
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
ERGRFkUrQETkKAnipOQVpCX7/60xfjxri5v2yj0RERERERERERH569IKEBERERERERERERER
Oe4oASIiIiIiIiIiIiIiIscdJUBEREREREREREREROS4owSIiIiIiIiIiIiIiIgcd5QAERER
ERERERERERGR444SICIiIiIiIiIiIiIictxRAkRERERERERERERERI47SoCIiIiIiIiIiIiI
iMhxRwkQERERERERERERERE57igBIiIiIiIiIiIiIiIixx0lQERERERERERERERE5LijBIiI
iIiIiIiIiIiIiBx3lAAREREREREREREREZHjjhIgIiIiIiIiIiIiIiJy3FECRERERERERERE
REREjjtKgIiIiIiIiIiIiIiIyHFHCZCmKP2emzt2IvmHsuYv21nG1PvSmZ3pa/6yjySnnTvm
pDFtVwPb0dztbmz9h/Dxw3tp9PjQzmEY4bo1ex+08PIOlyaNvYiIiIiIiIiIiBzrWl4CxPEL
93YJYcC7+yl/bOlm7yc3clJoB654Ow3nUQ7vTyldz/VJHZs3UeK0kzy7xsNdf5/9Se79BQyY
m816p//jBsdktjB2eCvGxDZvfPWpitdTrf6/mKo+cLTM8lqMIzgvRURERERERERE5MgxH+0A
AnOx+8Op/G3SV5z/5npeGJuE5WiH9BeRnVJCbsdYTg3yf9xgRhMDzo4s/+cjmL2qitdqIrKy
/r+Yqj4IbpnliYiIiIiIiIiIiBxOLW8FSBUHaW9Ppv+k9Qx7bx0vViY/PDmsvmsI3VoFYzAY
sHa8gLuWZ+EGsH3D5MQOXHb3tVzQpxcnd0ik5+XPsqXk4De77akfMm1IVyIMBgyWWE6d8Dpp
LsCdybI7BpFkNWIwmglt2497fiwFfJRseZGrzmiN2WDAHNebSYs2U1zzy+J1xlXEmsljeTkr
g2cvaEdsbHsufiMTD052vD2bma9swx6gF/JS8rlk7g7Ck3fQ8+UCfnUCeFn71h4WF7h5cUEq
STPSGPO9kzW1PnPjcZYx9b40rlyWzcWPZ9B7ThpnLS5ga9W3+H2k/pTH3PXOg3H4PGzY6OLU
PsFE+Dl25Jdw77PpxCenEH5nOpeuKiXX6y8mN56q1xB5/P++Ue0GymyMujuD5/MqB8DLhiVp
9PzY4T/+6q9BquiLq1fmMGr+Lk6dlUqvV6qVDRTtOsA/HthB+K076f5sHl+V1JiVftsOjn0H
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
EREREREREREREZGBFY1Gibiuy+jRo7f0WkREREQ2if5Uc6jyQ0REREREROSDo6/qsGXLlhHJ
ZDJks9nNuCQRERGRLUMBh4iIiIiIiMhHQzab1QwQERER+ejo+pshCkREREREREREPjy6/rtf
AYiIiIh8ZGmQooiIiIiIiMiHl7OlFyAiIiIiIiIiIiIisiXcO+vXHLL/KD596C48PO/OLb0c
GWAKQERERERERERERETkI+e+mdP455/v43sXnMYe22/LM/9csKWXJAMsAp39r2fOnNmvgydM
mDDwKxIRERERERERERER2YTuv3c6Lzz6AKccuQ8vv7iQ1lU5DvjCOKy9bjOvxJTdUDaq0pZs
CO9aetpxK9RTy+nNv+ZuM0DuueceABKJRI8HpNNpAM4666xNuCwRERERERERERERkYF37x9v
5rF5d/Dpj41k4b//xSv/amDSxZdz1Blf6Nd5pk6dWrx/6aWXrve2TgZM50cx7rA+2MKjkn0g
eD4saCjebnVMuPSSEMSyRcIbtcASERERERERERERkY+Eefffyz8e/COHfGI077y/jL++sISJ
U37MUWecuUHn6z3c6HtbIdiwjoN1I9hIDKJxbCSGdaNYxwXHDbdFg+cjseC+44bhQk9VFlta
GNY4LtaJlHw44Gz+9XarAMnn8wB4ntfjAb09LyIiIiIiIiIiIiKytXpk9t0suPsWPv+pXXjy
jdeY/2oTX710Kkeftv7djkorO9bn+a7bykIRYyAMP2wkBsYB38N4OUw+h8UGQUIkFoQegPHy
GJPFegaDV1IFYsPCitLqitL2WqXhg+28MV32Ld3e9Txdj+1pMwYcpzPAMQ4GC14eEZCeXwAA
DYNJREFU64Mx/matXOkWgLS2tgLg+z6+73c7oL29fdOvSkRERERERERERERkPT21ZCnjdti+
1+1//ctcpl90PsP8DgZVwkvv1vGli37A6aeN7/e1CiFGf1tglYUkBqwJqz/io2m7cBbNw5tI
zvwvahatAccF3y9ub590K82j6qm88QKqlzZjjMF6pqQdlo+xNmyfRWfoYQzWOF3aUQX9qIy1
xdZbxcqNku2dAUovx4bbiscX9nUcrBOBisNYc9mluLeOZ9B7beH1fLBlw0yAIJcojN9Yl2Qy
SWVl5XrtWzYEHaClpQUIKj0cxyGZTOI4nZ2ySu/brbbHmIiIiIiIiIiIiIh8VLhkevx59b9f
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
IxKC/D+wNINvhWNsbQAAAABJRU5ErkJggg==
--------------000002090607050602040201
Content-Type: image/png;
 name="=?UTF-8?B?S8OpcGVybnnFkWvDqXAgZXJyxZFsOiAyMDE1LTEwLTI4IDA5OjQ5OjM4?=
 =?UTF-8?Q?.png?="
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename*0*=UTF-8''%4B%C3%A9%70%65%72%6E%79%C5%91%6B%C3%A9%70%20%65%72%72;
 filename*1*=%C5%91%6C%3A%20%32%30%31%35%2D%31%30%2D%32%38%20%30%39%3A%34;
 filename*2*=%39%3A%33%38%2E%70%6E%67

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
VGO/llLLlYXcf/AV+kxD4ylvybOq6gptV7/fr7Yt83kJxl3RPiQno4rarmw7Oo7Dk08+yahR
o2owWhERERERERE5GiZNmqQZICInsuDgaHCQN3QAv7zB09BzZZVNOpQ3aBs8Xl4SIajsgHB5
My3Kq6eiuCpS3nI3hxpz6MB92WsratfQa4LvCa3f8mex8uN3iLzuL9x0XytWzpnHys07Sc3x
Ed2oBc3rFrHt1914DOuARMKh1Fnes7Ysq9RAflXKu/+K2rlsmQfz7EKTc8H7qO59nkxtq+SH
iIiIiIiIiEjllAAROUiPP/54hecefvjhoxjJftVZ2746A6aVna/oXGXXVCemsn8/XIO6ld3v
H4n5YOsq73zJ3727mP/2c2w5owe9egzjhkvjiHIVkZOaSkrCYnZvScFnlD+D4GDrLO98qViq
UFlbVqeMQ917QW17ePvqiaq8GSChfw/9t4iIiIiIiIicPJQAETlINZXk+COOtW+KH0pi4lh1
qEml4IwTwy4kef0PTF43u2RwNnQ5LrOcQfA/ksj6o47mM1LbioiIiIiIiIjIH6EEiIhIDaho
mafgOS1xdOjUtiIiIiIiIiIiAkqAiIjUmOBAfEXL8miQ/tCpbUVERERERERERBL13AYAACAA
SURBVAkQkeOcZVnk5+cTFham9e2PUxqMP3LUtiIiIiIiIiIiJy8lQESOc82bNycxMRGfz1fT
oYiIiIiIiIiIiIgcM5QAETnOxcTE0Llz55oOQ0SkxgRnv4X+dBwH27YP+CkiIiIiIiIiJw8l
QESOc/n5+eTn59d0GCIiNaqiJEjZl4iIiIiIiIicPMyaDkBERERERERERERERORwUwJERERE
REREREREREROOFoCS+Q4l5CQUNMhiIiIiIiIiIiIiBxzlAAROQG0b9++pkMQEakxoXt7hO71
UXYzdO0BIiIiIiIiInJyqTABkpeXR0ZGBl6v92jGIyIh3G43DRs2JDw8vKZDERERERERERER
ETmuVJgASUtLo3379kRFRekbkyI1wDRNsrKySEpKolmzZjUdjoiIiIiIiIiIiMhxpcIEiN/v
JyoqiqKioqMZj4iEiIuLY8uWLTUdhoiIiIiIiIiIiMhxp9I9QIJrZotIzfD7/TUdgoiIiIiI
iIiIiMhxyazpAERERERERERERERERA43JUBEREREREREREREROSEU+kSWCLHmuosyeY4DoZh
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
iIiIiIiInIQqTIDk5eWRkZGB1+s9mvGISAi3203Dhg0JDw+v6VBEREREREREREREjisVJkDS
0tJo3749UVFR+sakSA0wTZOsrCySkpJo1qxZTYcjIiIiIiIiIiIiclypMAHi9/uJioqiqKjo
aMYjIiHi4uLYsmVLTYchIiIiIiIiIiIictypMAEClKyZLSI1w+/313QIIiIiIiIiIiIiIscl
s6YDEBEREREREREREREROdyUABERERERERERERERkRNOpUtgiRxLyi7HZhhGlecrWsKt7LWH
GssfLUdEREREREREREREjgwlQOS44DhOqZdhGKVeoeegdPKj7HHTPPSJT6FlBVWVBFGyRERE
REREREREROToqzQBUt5gr8jRFuyHfr8fv9+P4ziYpollWZimiWEY2LaN3+/Htm0ATNMsSXQ4
joMT3pQefVuxe/4ydnrsksTJocRh23apJEwwhvLeH/oTOOh69fkTEREREREREREROTSaASLH
Bcdx8DsxdPvrXVzWeB+r3n6BGTt84HJhGAZ+vx+vP5pzb7yLYS2zmf/yeOZl+AGwYs/gsrFD
aZzwPzZ6/DiOVeXyWOWdCyY//K42jL7nMrLeG893eypOEgbfH0zKBJMl5c1A0eyQI8kkqsU5
XNK/N907taVJbTd2UQ7paamkbFvH4u9+YPXOfOzg2yM7cddL15P67P18nOgJ/Hv8zex74S7e
+rWoJm9ETgrqryIiIiIiIiIih4sSIHJcKJkB4gBEc87grix6fQl7/UZxAsTG3aYfl7Q0AQfb
9uP3g+FqyAXD++BaOIEJa1KxLReW5ZQkJcouT1XR0llBgZkmNg4OjmNj2wcuuVU6ZoP4/ndy
c4vveG7iegodq1R9oZQEOQJcdTn76tu5+eIofvluOp8+N5GElGyKzCjiGrel84WD+PNj/Tj/
42d4Y+5uPOWVUbSFjx9/Gn+qt4rKwmh5zbM83PZz7npyGTmavCMHS/1VREREREREROSwUgJE
jgv7kxF+MletoODsi+nf7kcm/1oEhoHfbESfoWeSv3IxOV07gG3jOAaOdw8L3hyP7fOBYWAR
mBVSdt+Q4MyMYBIiOHOjbILEcRxswwEHsPcnQILXhCZBggkQr98Bx4fH48Ef5i5VHlAyI0QJ
kMPMiKLd8Pv5R49dfPDwkyzc7WH/09lH+vaf+GH7Olauv45Hb7+Xkbv/xYeb8zlgHNguIHXH
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
p4iIiIiIiIicOlQAETnJORwOHA5HQ4chItKgghVBjv0SERERERERkVOH3gEiIiIiIiIiIiIi
IiJNjgogIiIiIiIiIiIiIiLS5KgAIiIiIiIiIiIiIiIiTY4KICIiIiIiIiIiIiIi0uSoACIi
IiIiIiIiIiIiIk2OCiAiIiIiIiIiIiIiItLkWA9/s2XLloaMQ0REREREREREREREpM7oCRAR
EREREREREREREWlyrADt27dv6DhEREREIhYIBI77s7ovERERERERETl16AkQERERERERERER
ERFpclQAERERERERERERERGRJkcFEBERERERERERERERaXJUABERERERERERERERkSbHCrB5
8+aGjkNEREQkbFVfdu73+498eb1evF4vHo8Hl8uFy+XC6XTidDpxOBzs2rWrgSMXERERERER
kRPF2tABiIiIiIiIiEgj1dfU0BHUnabUFxEREQmLtsASEREREREREREREZEmRwUQERERERER
ERERERFpcrQFloiIiIiIiIhUb3mgoSOonarbXp3sfYmUtv4SEZFTmJ4AERERERERERERERGR
JkcFEBERERERERERERERaXJUABERERERERERERERkSZHBRAREREREREREREREWlyVAARERER
EREREREREZEmp+4KIK41/KVzGuO/KauzJiWIQCnLHxtGps2EydaOWxdXHP1ZYx8Hx3KmtGvN
H6rGfKrF0hjGqDGNQzhO5jl/2MkSZyPn3zuLi1vbaRFrwtT7H+zwhnlgA855785XGdH1Bv5b
FKjbhg/OYbS9B3/b7KnbdkVEREREREREmoiwCiCOHyaTGTOEj0oq/8K7lWd6xNDrue0cufcU
lcGoBx/jhpzoWoZUwYr/ySG+/zMcvadTxuIpbYk/+3m2nuj7PK5V3N/OhMlU9escZu6v4xtZ
NRAo/JL7p+Zx289OAu6tPH9W3NEf1tk41JaL1X/uTPpV86i727310WYDOKFj1DRy1iTmvMa9
TpjTx/PxzkK2v30+CQ0dTFjKWPr4/5F31d2c18LU0MGIiIiIiIiIiJxSrHXWktlO/wmT6qCh
OHr/6e9cOv16Hph7DTMvSsG39XXues3G5HmTaBdVB6eoieju/HW9gweLPuei026l49w1PN2v
GbaYhruR5Svezl5Ta3pkVXMjtc7GQeqNxqjGmsScP1nilDoVKFrA0x/Ec+13HbE1dDAiIiIi
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
EREREREREREREREBIKZac6/blVdyDK9UayEiIiIiIiIiIiIiIiJHOw5bYImIiIiIiIiIiIiI
iBxfWgAREREREREREREREZFaRwsgIiIiIiIiIiIiIiJS62gBREREREREREREREREah0tgIiI
iIiIiIiIiIiISK2jBRAREREREREREREREal1tAAiIiIiIiIiIiIiIiK1jhZARERERERERERE
RESk1tECiIiIiIiIiIiIiIiI1DpaABERERERERERERERkVpHCyAiIiIiIiIiIiIiIlLraAFE
RERERERERERERERqHS2AiIiIiIiIiIiIiIhIraMFEBERERERERERERERqXW0ACIiIiIiIiIi
IiIiIrWOFkBERERERERERERERKTW0QLIKS+fjwamceYf/oenEqn8P83mmuapNEh04Tr//7Hd
V20B/rLsvYu4+9wLGPPRXvzVVUYN1q/KuL9k9BnNGbWiKPR3vOuY0LYJgxYXHLewzMHF3NWm
HfcsOVBt/SciIiIiIiIiIiLibAHEvY6Xbr+UVvWjcblcpJ5zA9NWlt+89O18lzFd04lxuUhs
1Y9Jy8vOFfP9ayPp0b4R0S4XKTct4efbrCXfMeUsFy5X+RHXZwGHbYOxyNMylvDq5149hkzX
0XG6XHXp/2F+BG1mXYeQrNrMpo+qWlT6IN7dsZ9tcy6jXoXf8LL20bakO62bU55NvHDbY5g/
v8fUy9OqbQXPvn6V5eF/f2iJy5XKsMWBsVOa+ypdo124Lp7FbmOX3qo9I2jr2Kb0eWQit2TF
VzZleMxBPnn4fr4ZPpvJPRo47L9qGksiIiIiIiIiIiJSqzm6/2i8e8hNupZpH24k98dveaXH
N4y9ejSfHAZKdzH3lqHMbPoUm/IPsGzUfv48cCxLDwO4iE3rxOAnXufFq+sT84vSG9DnnTzc
bjdut5v8d64k2TYaizwtYwmvfokdp7AlGJ/b7Wb/5/fSomFvbrsgKfw2s2sXKyHazLq8WiSh
DXe/s5znr04nuqZjqbRoEhrX478zvySfUn76cCY5LesRV5MhRaXSZcit9D4t9rgUZ/J/YHu7
icx+8FzqHJcSRURERERERERE5FTlaAHEVf/XPP70GK7t0pqMZmdz7f13cVb+l6zOK8Hs/4x/
fN6QW/44gFZJ9ek06hGuKHqH6V8XArE07zuK2wd0p02Dim6wuoiKSyAhIXDExzoJJ3Se1rGE
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
gviwUOI6jOSj2Lv55OMbaWUBInrwxJdv02/jBE6PNGOOOZWRszZSVH2kvS5l8JdHXevmeKlD
GwTDX1/DV586jrH5baNg+8/RCLZcfu4zxV7AjPkPEjmzJ7EhCfR4ysHwQc0ItZgOpmHEcd6t
AzF+z6HLLVfQosbZhRDaj7yV1qvfYtV+X2tAav4uCfgeEkrHO5fy8+x+7JxxBR0SIolM7sF1
b+TQ+6a+JJm9FPwwmxWpNzO6Y6iPvEVEREREREREROREMABvXl5ejTd4PB7sdjvFxcWsX7+e
ESNG1CnDdevW0a1btzqlISInIW8uH1/cnqcH/4ef72pTtZLCmfYsZ/VYxoO//4trk/3M2XoL
+frmc3ii21L+dUur47cSw7WTN/tfwqr7f+Cd/vH1M7ElIgF5K/ce9Hq9eDyeqn8ulwuXy4XT
6cRut2O327HZbNhsNsrLy9m1axcjR448wdGLiIiIiIiIyLE2d+5c7dYiIieKk6xvl5HVsR89
kiFr6VNMXdOcUS+lHvxi8hayeuYssi95mcuaBFiwZsRy4Usr6FgYcXyXtpkbM/jdFYxO0eSH
iIiIiIiIiIhIQ9LAt8ASkZOXl5JNr3F1+0islnDa3vADvV7+mHs7VRxz7sn+kItj4rhk8V94
bvolJAQxu2CEJZLS5DhPgBjhNEltTJhmP0RERERERERERBoUrQARkRMkhI4TFpE+wfdfTU1G
sLy4blvuiYiIiIiIiIiIyP8urQAREREREREREREREZGTjiZARERERERERERERETkpKMJEBER
EREREREREREROeloAkRERERERERERERERE46mgAREREREREREREREZGTjiZARERERERERERE
RETkpKMJEBEREREREREREREROeloAkRERERERERERERERE46mgAREREREREREREREZGTjiZA
RERERERERERERETkpKMJEBEREREREREREREROeloAkRERERERERERERERE46mgARERERERER
EREREZGTjiZARERERERERERERETkpKMJEBEREREREREREREROeloAkRERERERERERERERE46
mgCpi7Ifub1lKyasLa//tB3ljH8kgymZ3vpP+3hy2LhnajoTdwRZjvoud23zP4yXtfPSOe1T
G8eghWtW73XQwNM7VurU9iIiIiIiIiIiIvJn1/AmQOy/8HCbMHp9tI+KYUsXe764lY4RLbj2
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
--------------000002090607050602040201--

--M7oipOhf3FbnveUgVXFjI3JnLp8hd1upp
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)

iQIcBAEBAgAGBQJWMI4FAAoJENWYes1C3s/C4u0QAJCdptOmnJCzzmwX7+XDlTpR
gDbRC/Rn1yaFptDStBsZNOQAvg+dX/aKyKp75XappINeKCq8ZM+Gc0Jyq+jkYTUk
NcmgCzpnqgS3TijVjB04JMOc9Z1LjbUvRmjmqucYKXmKL3BzmJ+ATfShXyc5RJUU
b7jX1ry/VKVoi7lzX1pPQTAVC5SdyWHttRV9O4/KKKJi2QXzMyYcDtsEgMG1epJ+
vj4+iig5VS5hV5fRHCoHjx6Mnu81adztsdkSgrc2i5XXXG66tbhxVEA4QhSnaFEo
qEXVBpFEuaj6qjjMwOrH+JL5Ri71pYLsRNVnk8iQbrWKzy/I/Zc5JUJ9v49ArUgk
sqVNc2qNStKVZfK65HpZmhMucktUSeudSngCISh1JayTX/UX8YpuK5q7WXKrc9YS
YQxqKlcawHSHt29dB+bNF6qoet29h1dObgivMZ4CDy9EGqxN/veSOKCoZkGdtJMj
jF8mxcUILGCc24GG8PLVB/bAAUKrSfpHdYrCZ6m50U/yo5hF3RFfsq74NDeD0/KF
N0uHiYMQ/l7nPeg+ZygMOHpdwZh61LU+Q4Zr0JUD/ByrJ2Eb/bBMqETZ6EJQJ/Q+
Tld5gNsZEiIZIC3cfAtNu18M1j3g6toRAuyzoz/MZZOpY8D+wp24TOcslkHOYJ+v
rW5fnGidKnWrAhyeVitZ
=UckK
-----END PGP SIGNATURE-----

--M7oipOhf3FbnveUgVXFjI3JnLp8hd1upp--


--===============4026057686044234871==
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
--===============4026057686044234871==--


From win-pv-devel-bounces@lists.xenproject.org Wed Oct 28 09:05:29 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 28 Oct 2015 09:05:29 +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 1ZrMfg-0000e2-Al; Wed, 28 Oct 2015 09:05:28 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72) (envelope-from <et@etit.hu>)
	id 1ZrMfd-0000dx-0B
	for win-pv-devel@lists.xenproject.org; Wed, 28 Oct 2015 09:05:26 +0000
Received: from [85.158.137.68] by server-16.bemta-3.messagelabs.com id
	45/FF-03763-4DF80365; Wed, 28 Oct 2015 09:05:24 +0000
X-Env-Sender: et@etit.hu
X-Msg-Ref: server-6.tower-31.messagelabs.com!1446022671!7937825!1
X-Originating-IP: [95.140.34.219]
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 15947 invoked from network); 28 Oct 2015 08:57:51 -0000
Received: from mail.etit.hu (HELO mail.etit.hu) (95.140.34.219)
	by server-6.tower-31.messagelabs.com with SMTP;
	28 Oct 2015 08:57:51 -0000
Received: from localhost (localhost [127.0.0.1])
	by mail.etit.hu (Postfix) with ESMTP id 1EC3F2AE
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 28 Oct 2015 09:57:51 +0100 (CET)
Received: from [192.168.100.122] (87.229.89.127.z-net.hu [87.229.89.127])
	by mail.etit.hu (Postfix) with ESMTPSA id CC79364
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 28 Oct 2015 09:57:41 +0100 (CET)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=etit.hu; s=mail;
	t=1446022662; bh=L1d459M7F6cVYVyWmciIO9pxQLtO8RbKjvuygWr/SpM=;
	h=Subject:To:From:Message-ID:Date:MIME-Version:Content-Type:From;
	b=OLMY6VrVM+SdJcDssbXvQ/pHknUNp3mYAisFCyf+KOEom6sR3LMNeoVTcKeN/9Qmd
	gy4KOg744O+2HtEOoPYvsEEM4SW+vXtyngAdO/NxKyRkDa0wSYkf5CKoAbMCkHktDv
	20NjhiBLfUVbwKThrunLyrMBobt2ezwo7cD6ZlKQ=
To: win-pv-devel@lists.xenproject.org
References: <1AD33E34BA5E3649B4F6C7FE476686F4211C60AD@AMSPEX01CL03.citrite.net>
From: =?UTF-8?B?w4lsacOhcyBUYW3DoXM=?= <et@etit.hu>
Organization: ETIT[nwpro] KFT
Message-ID: <56308E05.60203@etit.hu>
Date: Wed, 28 Oct 2015 09:57:41 +0100
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <1AD33E34BA5E3649B4F6C7FE476686F4211C60AD@AMSPEX01CL03.citrite.net>
Subject: Re: [win-pv-devel] Removing old glpv windows drivers to install new
 -> inaccessible boot device
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: multipart/mixed; boundary="===============4026057686044234871=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--===============4026057686044234871==
Content-Type: multipart/signed; micalg=pgp-sha1;
 protocol="application/pgp-signature";
 boundary="M7oipOhf3FbnveUgVXFjI3JnLp8hd1upp"

This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--M7oipOhf3FbnveUgVXFjI3JnLp8hd1upp
Content-Type: multipart/mixed;
 boundary="------------000002090607050602040201"

This is a multi-part message in MIME format.
--------------000002090607050602040201
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Hi.

I could successfully boot into safe mode, then used bcdedit for
testsigning and now the installer worked (interesting that installing
the pfx files previously did not make any difference). The install went
fine, I could reboot. Unfortunately since then (it is more then 8 hours
now) I'm facing the attached screen. The animation is just rolling,
rolling rolling and nothing happens. CPU ticks are used, so I assume
something is happening, but it seemes pretty much stuck.

I think I will try what you recommended to remove all old/new drivers
completely and then I might be able to revert back to the old glpv driver=
s.

I received an other response on xen-users, where someone is facing the
same problem, so it does not seem to exceptional.

2015-10-28 09:47 keltez=C3=A9ssel, Ben Chalmers =C3=ADrta:
> Your best bet is to boot with windows PE (Or mount the disk image and
> use a linux registry editor)
>=20
> =20
>=20
> Then in the registry search user
> HKLM\system\currentcontrolset\control\class for XENFILT =E2=80=93 every=
 time you
> see it appearing in UpperFilters, remove it.
>=20
> =20
>=20
> The go through the HKLM\system\currentcontrolset\services\xen* keys and=

> set Start to 3
>=20
> =20
>=20
> This should let you boot up.
>=20
> =20
>=20
> =20
>=20
> Ben Chalmers
>=20
> =20
>=20
> =20
>=20
>=20
> *From: *=C3=89li=C3=A1s Tam=C3=A1s
> *Sent: *27 October 2015 15:14
> *To: *win-pv-devel@lists.xenproject.org
> *Subject: *[win-pv-devel] Removing old glpv windows drivers to install
> new -> inaccessible boot device
>=20
> =20
>=20
> =20
>=20
> Hi all. I already issued this same question at xen users, but I might
>=20
> get more response at the developer list.
>=20
> =20
>=20
> I have some Windows7 HVM domu (debian dom0) and xen 4.5. I'm
>=20
> successfully using the old uninvention gplpv windows drivers. I decided=

>=20
> that follwoing an upgrade to xen 4.6 I will go to the official xen
>=20
> windows device drivers:
>=20
> http://www.xenproject.org/developers/teams/windows-pv-drivers.html
>=20
> =20
>=20
> The installer failed installing these new drivers, so I guessed that th=
e
>=20
> problem might be the presence of the old uninvention drivers. I
>=20
> uninstalled them, and rebooted the machine. Since then I'm getting BSOD=

>=20
> saying that Windows failed to boot, INACCESSIBLE_BOOT_DEVICE.
>=20
> =20
>=20
> Is there a way to let Windows boot again? I guess if I cold turn on som=
e
>=20
> basic harddisk emulation what windows should know by default, my proble=
m
>=20
> should gone (so instead of PVHVM stubdomain I would have a normal HVM
>=20
> domain at least until I install the new drivers)?
>=20
> =20
>=20
> Thank you.
>=20
> =20
>=20
> --=20
>=20
> =20
>=20
> =20
>=20
> =C3=89li=C3=A1s Tam=C3=A1s
>=20
> Thomas Elias
>=20
> =20
>=20
> ETIT[nwpro] KFT, =C3=9Cgyvezet=C5=91
>=20
> ETIT[nwpro] Ltd, General Manager
>=20
> =20
>=20
> Tel. HU: +36/30-497-1626
>=20
> Tel. DE: +49/160-651-8723
>=20
> OpenPGP pubkey: http://etit.hu/doc/et-pub.asc
>=20
> =20
>=20
> Okleveles m=C3=A9rn=C3=B6k-informatikus (MSC)
>=20
> Master of Science in Information Technology (MSC)
>=20
> =20
>=20
> Kapcsolat: http://etit.hu/index.php/hu/kapcsolat
>=20
> Jogi nyilatkozat: http://etit.hu/disclaimer-email-hu.txt
>=20
> Contact: http://etit.hu/index.php/en/contact
>=20
> Disclaimer: http://etit.hu/disclaimer-email-en.txt
>=20
> =20
>=20
> =20
>=20
> =20
>=20
> =20
>=20
> =20
>=20
>=20
>=20
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
>=20

--=20


=C3=89li=C3=A1s Tam=C3=A1s
Thomas Elias

ETIT[nwpro] KFT, =C3=9Cgyvezet=C5=91
ETIT[nwpro] Ltd, General Manager

Tel. HU: +36/30-497-1626
Tel. DE: +49/160-651-8723
OpenPGP pubkey: http://etit.hu/doc/et-pub.asc

Okleveles m=C3=A9rn=C3=B6k-informatikus (MSC)
Master of Science in Information Technology (MSC)

Kapcsolat: http://etit.hu/index.php/hu/kapcsolat
Jogi nyilatkozat: http://etit.hu/disclaimer-email-hu.txt
Contact: http://etit.hu/index.php/en/contact
Disclaimer: http://etit.hu/disclaimer-email-en.txt

--------------000002090607050602040201
Content-Type: image/png;
 name="=?UTF-8?B?S8OpcGVybnnFkWvDqXAgZXJyxZFsOiAyMDE1LTEwLTI4IDA5OjQ3OjM2?=
 =?UTF-8?Q?.png?="
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename*0*=UTF-8''%4B%C3%A9%70%65%72%6E%79%C5%91%6B%C3%A9%70%20%65%72%72;
 filename*1*=%C5%91%6C%3A%20%32%30%31%35%2D%31%30%2D%32%38%20%30%39%3A%34;
 filename*2*=%37%3A%33%36%2E%70%6E%67

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
df7RrR5cps5UfyONacW49QkGRyPtQtc1NGU1188l1J8U17CE7U+fTHEuWkr9Xvx5RwghzneZ
GRmLXlv+58tTL15cs053fGkeDwCqqkau9aqK2+UC5gdIEk11Nftv9PLZ32cHQ2QARAghxFnK
xN93hCNDOmr2OjYUzT7U0kp2dQMVw7to6zhIo/f1rMvKZu3WLdgbm+nua2ZAA9XmJqswl1Py
F5vNy7qNFWiNXbSdOITFnkam240SiixWXdlk2SYZGuhkxFSxuTIoqltLTYYKyspiS7rNFVJs
Xuqqsxk8MUpjYz8FmwpPbd6s2azdciH2xiY6u08yrFtxpRdS17CWsrTZuO3klK7BNtRD2FZA
eZZ92buZuwXWlkP9hZuwnWymu+s4Q6YDt12bm7t8dgBkfo7udKo2NqA2NdPVeZxB3YorLY+K
+hpKnQa6kU1JvpOjvf20NAfQG7ZQ3bAetamV3o6j9BtWXBlp2PTATOeJJSZN6QvWH8CJxxGa
6QTR0NWF2y+ryY50xDDFYPsQbUFweHIpra+hwjP7IVUhfY0XdaCXsC2fIk/qzluHtwBHWws+
exZZVgPNsJGVaUOfCuAqKsBtRjp+jJkOpMixaJEBl6jfwUSb7SjRw+gxx7coH6RRuWEjanMr
3Z3HGZjJb+XaGkocBtpMr9yS47Olk6aMM9zXzqCpYnOlk19ZS5lrfluJcr+4rGKPLSI2BxHJ
cp5GZcMG1OY2ensa6ZtpM5kFGRTrGpZE+1nWsYAlp5qKrON0jHTTPOEgLbuEnDXlS8pvomNL
Vb6GM1mM8WPKrauh1nuMloGTHBq048nKxIFOUNfQYup7ecOGhe3LnUN61K3ui8sitv4lz/1y
6//ymDjz69lcm0/WTK+4nmQjy829kps4j2Ezm/KNDajNLXT3N3K0R8XmTCO70EvQyEq8zMxK
XleT1EmDJHUhEP/YLIzTdrQLX1jF4cmmtL6OCjfo5uLz6lLKMTaXCbef6ryT8ryUqL1lsXAm
hiWc/1IeV+Jzy+L671lx2a6aqc3Uz0gs8bYY1rW5wQZN01BT5Dk03U3rYAgd8A200jQwk5Es
JwU5eYvbSIrzR/mGOmq9J+K3mYRt00DT9Ki4o5akPP9kUlNXTLClh5bjw1jsaWS4HBj+yOCA
ppyC6+dKri0p2kfYn+pcNCvVNTT2844QQgixMvHu9pi9JiUaAIkdBIn7Mzw8LE+sEkIIceYz
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
O9u1qqveZfVuS+5yNxgsQ+yADXaCqTEk+Ev4mnwTnuQXEgjFBGxK7GDTDAYDBgMmjnGV1Xvv
WpVV26LV1tmp957fHzN39s7stN2VVtLq/TzPPrs79572vu858zzve857BEEQBEEQBEEQBEEQ
BGHAIQEQQRAEQRAEQRAEQRAEQRAEQRAGHBIAEQRBEARBEARBEARBEARBEARhwOHJ/0oX6bmz
lVI538n0/Hygte63ti42LoS8e8LF3j+HQmy7p/UUWkdPyzjvX8zyhHMn04GAyKJw8q3n52JN
uVTmkCAIgiAIgiAIgiAIgtA38gZA3M6mQi4PdTuW8r1/LpzM7stOnfrOh1PrYnNgpsvAkXd/
jL035c9n/3pLobbdk6BET+w/vay7TL7gYnq53nKu7TqXTAudoxcqaNZXG8hVX29lUUjdmero
y1h6Mt/PhX7yrefZ3u/NmpJevwRCBEEQBEEQBEEQBEEQBjY5AyBuZ5H7x+2464njzU1vHeJO
H9L/Tq/vXDm00h3bmdo6X2RzcmYaf6b3zmUf0ttyyzmXzs91/871SY1023bqdP8UsiM93U4K
tY9MgSw3bp1nCrL0ZR6lt99Xuy5kvXD/zlWH+//+cE5nkodDXx3tvZVFof1M719fxpKrbE/r
KoRC1nN3/X1Z8zK1lek7TBAEQRAEQRAEQRAEQRg4FHQCxLZtbNvu5nRTSmEYRsq7eCoZN6WK
9ppjtMRS63GXdf8uFLcj0emP24lVSH19dWJmc1D3hWzOxnyBBa01Gg+Dxk1iUGsNx9vs5LNz
HQRxbMDBMIyU4EemndRaa1DejP3LRCGO8d6UzVWn27bTAwvOGA3DyCrTbgEUl/03R+1u72cc
l1HCyCumUVq3m5qWWEbHcnob46dU0Xa4ltZYz0/XnE+77sl6ka9/uSg08NrTYEuuQF9P6Y0s
ChlXLr25y/QmaJkvuJqtn72VT0/Xc601WhVTPf0KKut3c6g5lvy829rj6lfqPAWjfDRTh3Zy
5FgzMd37MQiCIAiCIAiCIAiCIAgXN4UFQPAx9uobmVmR/jTAwVVrOBpMOKD81cxcNJOKpl1s
jdlorcAzjIU3TKdjwyr2BQazcNlMQptXs6/NTjoAexqUsG0bbVYyZtpUJo6sosSjsMLtNDec
4HDNSdqtwk+iZHLcuz9POuhUJXOWLcK34222nrXzpijqyfNMjlh32877bqegbdto5WfEjIXM
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
7HB+nLt5YrHYhe6mIAiCIAiCIAiCIAj9iHrzzTf1zTffzOTJk5Mf1tTUsGDBgqwOumAwmHzm
8/koLi4u+DNITfOiXTuEHSebk9rDwf2++113mXQnqDsFizunvruNXM/cfUjJae9KceLz+di6
dWuK7NwMGjSI2tpaKioquj3LJ2OH1tZWfD4f999/P08++STDhg1LOUmTjUwydvc/k/yBlF2z
2WTjxrZtomok9zz2SUa++nV+uK0T0+tN3F+gk06oQmWdLuNMuMeQvAzapf90u3DIp8dC9JGJ
fHZQiK4jkQi2bXP//fczatQotmzZwsKFCzl16hS/+MUvMAwjawAkl66Tu8bT3kk6swuYC5lO
KWSaa5nKO8/T++v+na+uZMo2l206n5uJE03purhQujx79iyf/OQnGT58eLc5lS6bhoYGnn76
aQYPHtxt/M68SZ+jXTr1UDX7ambZO1i3tw3tmhM9sYFsuGWfqbwzZzPZiFM200X1F1o/X/zn
f+YD970PywoW3KZhlPH//vEf+dPLLyc/Sz9VkGkOZbJbSP3+cv53fudKrWZZFjFzCh/54gcI
PPtlfnU05kpj1f0+jvR53NN12H2fSU++Dy+UbpuammhvbweyrznO3z/84Q954IEHetxHQRAE
QRAEQRAEQRAuLZ5//vne3QHi9/vx+/0p7xb6mRvHSQ6pTiD3bmN3X9y7qgtxGqU75dwOovS2
09t3O3bSnYDZxtNT8jkhASoqKujs7OSpp55iyJAh+P3+HrWbPk63XLPJP59s3P23bRvv0JlM
8x3htf3tYHi71eXWUT5Zp7eRCfdzxxmX7blbVvn0WIg+MnEuctd7vV6i0SjPPfcct912G1df
fTVr167ltddew+fz4fV687aTSdfpZJJvofrON75M5bO915O63PbqrjPTGC+0Lv1+P0899VRB
aXZM06S4uDirnhzbzhzcs2nds5o18Q+Tl42nz7VCbSATuco7a7ETjHL+dtefaR5eaP2Ypsnh
I7XYdqGnABSG4ckoC/f6lmkNcp8WyTbHurWWQy9xO3DeiweYPIlL5zOVO1frcE+/Dy+Ubquq
qqiqqur2njvglymILwiCIAiCIAiCIAjCwKbXKbD6SrrDJtf/PXGI97b9fM9608a5oqSkhJKS
kh6X64lMC5W3+1l8V7uP0VcvovTIH6gJGhgeo5uDr6eyzkchwa9z2V5/4fV6MU2TN954g1de
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
ys5i8Kj+mLUHKNi3j+LaABabE5vpw+3TPiAiIiIiIiIi0nn0BIiIiEifY4K/gl1b91IXN5AR
A+K//kaEI5WhI3OJqsln66YNfLV+G4XeMIUJm4toaxCvN4gZ9BGyOIm2N1sqIeSpIH/nRr74
YiP5nlhyh+WSaIVQwEvQ4iDK0fznREREREREREQioQKIiIhIH2V6StixtYhg6lDyMqOxAobV
idMI4HF7CZgWnPGJxDuafMgwsLuc2Aww7DFk5OYQ4y2lyB0i5C6luN5FzsAcEqNsGBhY7TYs
NLw3PjYKu8XANP24PX5MrFgMMN0HKKpzkNkvrYcyISIiIiIiIiK9kZbAEhER6cMCtfls2WFn
1NA8Bvk3saOshN1FsQzMO4ZM04+7qow6T4jogx8wrERnDGFUPyd2/NRXFbJpSwl1QQA3Rdu3
Qv9+DBqZiR0/nvpy9uzYR401mvTcHJJcNgxM/O4aCnbupjIAmF5Kd26HnOwey4OIiIiIiIiI
9D4qgIiIiPQVpo/ijZ9T/M1f4q/cxdrVX/+mKn8LX+Y3fU/jX6xAKEDV7o3sqA01e4iQr5qC
HRsp+PYLgVK2b/jmJuem+fXSWqa/huLdW9rVHRERERERERGRcLQEloiIiIiIiIiIiIiI9Doq
gIiIiIiIiIiIiIiISK+jAoiIiIiIiIiIiIiIiPQ62gNERERE2iZYxZa1X/R0FCIiIiIiIiIi
baInQEREREREREREREREpNdRAURERERERERERERERHodFUBERERERERERERERKTX0R4gIiIi
vUROdnZPh9AupmmCaWICZihEyDR7OiQRERERERER6UVUABEREekltm7d1tMhtE9j8aPhR7Oh
ICIiIiIinSM6DhKSoXBPT0ciIiLSY1QAERERERERERE5Eh0sciSlQUompGZBWg6kZTf8nJIJ
V0zs6ShFRER6jAogIiIiIiIiIiKHq7YUOZLSGt4THdfT0YqIiBxWVAAREREREREREelJKnKI
iIh0CRVARERERERERES6moocIiIi3U4FEJFe4MCBAz0dgoj0gKabhmfHxvZgJCIiIiICqMgh
IiJymFEBRKQXSE1N7ekQRKSbHSx+NC2CiIiIiEg3aE+Rw+kCq269iIiI9BT9KywiIiIiIiIi
0lR7ihyuWDCMno5YREREmqECiEgvsHnz5p4OQUR62Ohjj+3pEERERESOLCpyiIiI9HoqgIgc
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
7o5pYql22o38NQ+OOHxD95KWD15ERERERERETlpKgIiIiIilnXtjWLNpN3EpL9C5z6X4KuYD
XuyukWz5ej6r1+5izdYuoRcYKOaDaTez7LA3Pur3AJkxY0bLN0BERERERERETkpKgIiIiEij
6hMTT73eEViPab5C5z4/AmDbmnf45OOveOLVHPwBHzabDcMwMAzt/yEiIiIiIiIibU8JEBER
Efme+mWpDj9mvJTBlKqNlBZOw7DZ+XKDyZNzM/AHPNhstgaPtrJ69Wp69ep18OcFCxYwatSo
NotHRERERERERI6+tnsyISIiIse0+rc/6g+fz+SJV9L49WOp/OrRRGbMak+N5/uJkpbazDxp
0SLr/y5efMR/RUREREREREQOpzdARERE5Hvql7OqT37UJzYCgQDl1ZEAREWBYRgH3/aoX/6q
Ld/8EBERERERERGppwSIiIiINOjw/TzsdnsbRyMiIiIiIiIi0jT6iqaIiIiIiIiIiIiIiJxw
lAAREREREREREREREZETjhIgIiIiIiIiIiIiIiJywlECRERERERERERERERETjjaBF1ERERC
lhNVyaVpu0iNqOHNvRksL0tp65Aa1KtXL1auXInH46GmpoZhw4a1dUgiIiIiIiIicpQpASIi
IiIh6RZbzq05+XQ8rSfOmBjS1nxD9o5q5uzOauvQGtS/f/+2DkFERERERERE2pCWwBIREZGg
usWWc+sp28k9dziJyQlE2zzknjuckTl+rkgvaOvwRERERERERES+RwkQERERsRRpC/CLTtvI
GzqW6Cgn1FSCCTZ3MbmDRzM8s5ou0RVtHaaIiIiIiIiIyBGUADnplbNofCpdfvMV1U24KrB7
Nhd3TCYp2sDo+zfyfa0W4Pfr3reQm3r357ZF+wi0Vh1t2L4W417J1FM7csMnVY3/nZo13NMt
jQlLjt6DS7N0CT/P687NS0tabfxEpGX1dpXhapdNTFJ7DG81tqik2sMWicNmI61LT85MLGnr
MEVEREREREREjhBaAsS9hn/8dCidE+0YhkFyz8uZseLQw0vfrvncNigdh2EQ3XkMDy6vP+fh
2+enMKxHO+yGQcKVSzn4mNW7iemnGRjGoSPyorc5EDQYizItYwmvfe5Vt5FtHBmnYcRyybvl
zegz6zY0yqrPgoxRS7OlT2D+9mK2zTmPuAb/Rg3f/KEb6aG2LVTVG3jq+nsx//QmD52f2moZ
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
a1n/mdXBTDY8MhQKHoZsOzyXAKuP+zknECb953PempwX3RWuKISPij6H3Efg/eUwZBCEBjmW
/PWRzzj9tbVJ3X0KpB+8zT+L7zgr1Wa+rmeYzGkREREREREREalxxqJFi9xXXHEFDketvrdD
REREpNJmz57NsGHDajoMEREREREREalms2fP9jwDxGq1kpKSUtPxiIiIiATF7Xaf8K+3l4iI
iIiIiIicPmwA+fn5FBTU1j2tRERERMyVTm6YJUFERERERERE5PSh56qKiIiIiIiIiIiIiEid
owSIiIiIiIiIiIiIiIjUOUqAiIiIiIiIiIiIiIhInaMEiIiIiIiIiIiIiIiI1Dm24i/0YFAR
ERE5Vekh6CIiIiIiIiJSnu4AERERERERERERERGROkcJEBERERERERERERERqXOUABERERER
ERERERERkTpHzwARERGRU56/Z4CIiIiIiIiIyOlHd4CIiIiIiIiIiIiIiEidowSIiIiIiIiI
iIiIiIjUOUqAiIiIiIiIiIiIiIhInaMEiIiIiIiIiIiIiIiI1Dl6CLqIiIic8swegl7+axER
ERERERE5PegOEBERERERERERERERqXOUABERERERERERERERkTpHCRAREREREREREREREalz
9AwQEREROeX5egZI8b96BoiIiIiIiIjI6Ud3gIiIiIiIiIiIiIiISJ2jBIiIiIiIiIiIiIiI
iNQ5SoCIiIiIiIiIiIiIiEidowSIiIiIiIiIiIiIiIjUOSUPQT9w4EBNxiEiIiIiIiIiIiIi
IlJlbACLFi2q6ThEREREKsTtdgPgcrlwu924XC6cTidOpxOHw0FhYSGFhYUUFBRQUFBAfn5+
DUcsIiIiIiIiIieT7dJLL2Xbtm24XK6SBYTiF3gWFQoKCsjOzmb9+vX079+/Uhdcu3YtHTp0
qIrYRURE5DRW+neW4t9jSic/Sic+7HY7drud3Nzcmg5bRERERERERE4SG4DF4nkUiGEYJyRA
DMPAarVitVqxWCxYrdZKXbC4LBEREZHKKP07i2EYJb/HFP++Uvy7S+mXiIiIiIiIiJw+bOBJ
SnhLfhQvKJReRLDZbKYF+mO1WitdhoiIiIi3O0BKHyv+ncPhcOgPMEREREREREROQyV3gHhL
gAAl20kULxwoASIiIiK1QfkEiNPpLHOs+P9sNlvJS0REREREREROHyUJkNJ3fZT+1zAMbDab
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
ERGRFkUrQETkKAnipOQVpCX7/60xfjxri5v2yj0RERERERERERH569IKEBERERERERERERER
Oe4oASIiIiIiIiIiIiIiIscdJUBEREREREREREREROS4owSIiIiIiIiIiIiIiIgcd5QAERER
ERERERERERGR444SICIiIiIiIiIiIiIictxRAkRERERERERERERERI47SoCIiIiIiIiIiIiI
iMhxRwkQERERERERERERERE57igBIiIiIiIiIiIiIiIixx0lQERERERERERERERE5LijBIiI
iIiIiIiIiIiIiBx3lAAREREREREREREREZHjjhIgIiIiIiIiIiIiIiJy3FECRERERERERERE
REREjjtKgIiIiIiIiIiIiIiIyHFHCZCmKP2emzt2IvmHsuYv21nG1PvSmZ3pa/6yjySnnTvm
pDFtVwPb0dztbmz9h/Dxw3tp9PjQzmEY4bo1ex+08PIOlyaNvYiIiIiIiIiIiBzrWl4CxPEL
93YJYcC7+yl/bOlm7yc3clJoB654Ow3nUQ7vTyldz/VJHZs3UeK0kzy7xsNdf5/9Se79BQyY
m816p//jBsdktjB2eCvGxDZvfPWpitdTrf6/mKo+cLTM8lqMIzgvRURERERERERE5MgxH+0A
AnOx+8Op/G3SV5z/5npeGJuE5WiH9BeRnVJCbsdYTg3yf9xgRhMDzo4s/+cjmL2qitdqIrKy
/r+Yqj4IbpnliYiIiIiIiIiIiBxOLW8FSBUHaW9Ppv+k9Qx7bx0vViY/PDmsvmsI3VoFYzAY
sHa8gLuWZ+EGsH3D5MQOXHb3tVzQpxcnd0ik5+XPsqXk4De77akfMm1IVyIMBgyWWE6d8Dpp
LsCdybI7BpFkNWIwmglt2497fiwFfJRseZGrzmiN2WDAHNebSYs2U1zzy+J1xlXEmsljeTkr
g2cvaEdsbHsufiMTD052vD2bma9swx6gF/JS8rlk7g7Ck3fQ8+UCfnUCeFn71h4WF7h5cUEq
STPSGPO9kzW1PnPjcZYx9b40rlyWzcWPZ9B7ThpnLS5ga9W3+H2k/pTH3PXOg3H4PGzY6OLU
PsFE+Dl25Jdw77PpxCenEH5nOpeuKiXX6y8mN56q1xB5/P++Ue0GymyMujuD5/MqB8DLhiVp
9PzY4T/+6q9BquiLq1fmMGr+Lk6dlUqvV6qVDRTtOsA/HthB+K076f5sHl+V1JiVftsOjn0H
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
EREREREREREREZGBFY1Gibiuy+jRo7f0WkREREQ2if5Uc6jyQ0REREREROSDo6/qsGXLlhHJ
ZDJks9nNuCQRERGRLUMBh4iIiIiIiMhHQzab1QwQERER+ejo+pshCkREREREREREPjy6/rtf
AYiIiIh8ZGmQooiIiIiIiMiHl7OlFyAiIiIiIiIiIiIisiXcO+vXHLL/KD596C48PO/OLb0c
GWAKQERERERERERERETkI+e+mdP455/v43sXnMYe22/LM/9csKWXJAMsAp39r2fOnNmvgydM
mDDwKxIRERERERERERER2YTuv3c6Lzz6AKccuQ8vv7iQ1lU5DvjCOKy9bjOvxJTdUDaq0pZs
CO9aetpxK9RTy+nNv+ZuM0DuueceABKJRI8HpNNpAM4666xNuCwRERERERERERERkYF37x9v
5rF5d/Dpj41k4b//xSv/amDSxZdz1Blf6Nd5pk6dWrx/6aWXrve2TgZM50cx7rA+2MKjkn0g
eD4saCjebnVMuPSSEMSyRcIbtcASERERERERERERkY+Eefffyz8e/COHfGI077y/jL++sISJ
U37MUWecuUHn6z3c6HtbIdiwjoN1I9hIDKJxbCSGdaNYxwXHDbdFg+cjseC+44bhQk9VFlta
GNY4LtaJlHw44Gz+9XarAMnn8wB4ntfjAb09LyIiIiIiIiIiIiKytXpk9t0suPsWPv+pXXjy
jdeY/2oTX710Kkeftv7djkorO9bn+a7bykIRYyAMP2wkBsYB38N4OUw+h8UGQUIkFoQegPHy
GJPFegaDV1IFYsPCitLqitL2WqXhg+28MV32Ld3e9Txdj+1pMwYcpzPAMQ4GC14eEZCeXwAA
DYNJREFU64Mx/matXOkWgLS2tgLg+z6+73c7oL29fdOvSkRERERERERERERkPT21ZCnjdti+
1+1//ctcpl90PsP8DgZVwkvv1vGli37A6aeN7/e1CiFGf1tglYUkBqwJqz/io2m7cBbNw5tI
zvwvahatAccF3y9ub590K82j6qm88QKqlzZjjMF6pqQdlo+xNmyfRWfoYQzWOF3aUQX9qIy1
xdZbxcqNku2dAUovx4bbiscX9nUcrBOBisNYc9mluLeOZ9B7beH1fLBlw0yAIJcojN9Yl2Qy
SWVl5XrtWzYEHaClpQUIKj0cxyGZTOI4nZ2ySu/brbbHmIiIiIiIiIiIiIh8VLhkevx59b9f
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
IxKC/D+wNINvhWNsbQAAAABJRU5ErkJggg==
--------------000002090607050602040201
Content-Type: image/png;
 name="=?UTF-8?B?S8OpcGVybnnFkWvDqXAgZXJyxZFsOiAyMDE1LTEwLTI4IDA5OjQ5OjM4?=
 =?UTF-8?Q?.png?="
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename*0*=UTF-8''%4B%C3%A9%70%65%72%6E%79%C5%91%6B%C3%A9%70%20%65%72%72;
 filename*1*=%C5%91%6C%3A%20%32%30%31%35%2D%31%30%2D%32%38%20%30%39%3A%34;
 filename*2*=%39%3A%33%38%2E%70%6E%67

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
VGO/llLLlYXcf/AV+kxD4ylvybOq6gptV7/fr7Yt83kJxl3RPiQno4rarmw7Oo7Dk08+yahR
o2owWhERERERERE5GiZNmqQZICInsuDgaHCQN3QAv7zB09BzZZVNOpQ3aBs8Xl4SIajsgHB5
My3Kq6eiuCpS3nI3hxpz6MB92WsratfQa4LvCa3f8mex8uN3iLzuL9x0XytWzpnHys07Sc3x
Ed2oBc3rFrHt1914DOuARMKh1Fnes7Ysq9RAflXKu/+K2rlsmQfz7EKTc8H7qO59nkxtq+SH
iIiIiIiIiEjllAAROUiPP/54hecefvjhoxjJftVZ2746A6aVna/oXGXXVCemsn8/XIO6ld3v
H4n5YOsq73zJ3727mP/2c2w5owe9egzjhkvjiHIVkZOaSkrCYnZvScFnlD+D4GDrLO98qViq
UFlbVqeMQ917QW17ePvqiaq8GSChfw/9t4iIiIiIiIicPJQAETlINZXk+COOtW+KH0pi4lh1
qEml4IwTwy4kef0PTF43u2RwNnQ5LrOcQfA/ksj6o47mM1LbioiIiIiIiIjIH6EEiIhIDaho
mafgOS1xdOjUtiIiIiIiIiIiAkqAiIjUmOBAfEXL8miQ/tCpbUVERERERERERBL13AYAACAA
SURBVAkQkeOcZVnk5+cTFham9e2PUxqMP3LUtiIiIiIiIiIiJy8lQESOc82bNycxMRGfz1fT
oYiIiIiIiIiIiIgcM5QAETnOxcTE0Llz55oOQ0SkxgRnv4X+dBwH27YP+CkiIiIiIiIiJw8l
QESOc/n5+eTn59d0GCIiNaqiJEjZl4iIiIiIiIicPMyaDkBERERERERERERERORwUwJERERE
REREREREREROOFoCS+Q4l5CQUNMhiIiIiIiIiIiIiBxzlAAROQG0b9++pkMQEakxoXt7hO71
UXYzdO0BIiIiIiIiInJyqTABkpeXR0ZGBl6v92jGIyIh3G43DRs2JDw8vKZDERERERERERER
ETmuVJgASUtLo3379kRFRekbkyI1wDRNsrKySEpKolmzZjUdjoiIiIiIiIiIiMhxpcIEiN/v
JyoqiqKioqMZj4iEiIuLY8uWLTUdhoiIiIiIiIiIiMhxp9I9QIJrZotIzfD7/TUdgoiIiIiI
iIiIiMhxyazpAERERERERERERERERA43JUBEREREREREREREROSEU+kSWCLHmuosyeY4DoZh
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
iIiIiIiInIQqTIDk5eWRkZGB1+s9mvGISAi3203Dhg0JDw+v6VBEREREREREREREjisVJkDS
0tJo3749UVFR+sakSA0wTZOsrCySkpJo1qxZTYcjIiIiIiIiIiIiclypMAHi9/uJioqiqKjo
aMYjIiHi4uLYsmVLTYchIiIiIiIiIiIictypMAEClKyZLSI1w+/313QIIiIiIiIiIiIiIscl
s6YDEBEREREREREREREROdyUABERERERERERERERkRNOpUtgiRxLyi7HZhhGlecrWsKt7LWH
GssfLUdEREREREREREREjgwlQOS44DhOqZdhGKVeoeegdPKj7HHTPPSJT6FlBVWVBFGyRERE
REREREREROToqzQBUt5gr8jRFuyHfr8fv9+P4ziYpollWZimiWEY2LaN3+/Htm0ATNMsSXQ4
joMT3pQefVuxe/4ydnrsksTJocRh23apJEwwhvLeH/oTOOh69fkTEREREREREREROTSaASLH
Bcdx8DsxdPvrXVzWeB+r3n6BGTt84HJhGAZ+vx+vP5pzb7yLYS2zmf/yeOZl+AGwYs/gsrFD
aZzwPzZ6/DiOVeXyWOWdCyY//K42jL7nMrLeG893eypOEgbfH0zKBJMl5c1A0eyQI8kkqsU5
XNK/N907taVJbTd2UQ7paamkbFvH4u9+YPXOfOzg2yM7cddL15P67P18nOgJ/Hv8zex74S7e
+rWoJm9ETgrqryIiIiIiIiIih4sSIHJcKJkB4gBEc87grix6fQl7/UZxAsTG3aYfl7Q0AQfb
9uP3g+FqyAXD++BaOIEJa1KxLReW5ZQkJcouT1XR0llBgZkmNg4OjmNj2wcuuVU6ZoP4/ndy
c4vveG7iegodq1R9oZQEOQJcdTn76tu5+eIofvluOp8+N5GElGyKzCjiGrel84WD+PNj/Tj/
42d4Y+5uPOWVUbSFjx9/Gn+qt4rKwmh5zbM83PZz7npyGTmavCMHS/1VREREREREROSwUgJE
jgv7kxF+MletoODsi+nf7kcm/1oEhoHfbESfoWeSv3IxOV07gG3jOAaOdw8L3hyP7fOBYWAR
mBVSdt+Q4MyMYBIiOHOjbILEcRxswwEHsPcnQILXhCZBggkQr98Bx4fH48Ef5i5VHlAyI0QJ
kMPMiKLd8Pv5R49dfPDwkyzc7WH/09lH+vaf+GH7Olauv45Hb7+Xkbv/xYeb8zlgHNguIHXH
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
p4iIiIiIiIicOlQAETnJORwOHA5HQ4chItKgghVBjv0SERERERERkVOH3gEiIiIiIiIiIiIi
IiJNjgogIiIiIiIiIiIiIiLS5KgAIiIiIiIiIiIiIiIiTY4KICIiIiIiIiIiIiIi0uSoACIi
IiIiIiIiIiIiIk2OCiAiIiIiIiIiIiIiItLkWA9/s2XLloaMQ0REREREREREREREpM7oCRAR
EREREREREREREWlyrADt27dv6DhEREREIhYIBI77s7ovERERERERETl16AkQERERERERERER
ERFpclQAERERERERERERERGRJkcFEBERERERERERERERaXJUABERERERERERERERkSbHCrB5
8+aGjkNEREQkbFVfdu73+498eb1evF4vHo8Hl8uFy+XC6XTidDpxOBzs2rWrgSMXERERERER
kRPF2tABiIiIiIiIiEgj1dfU0BHUnabUFxEREQmLtsASEREREREREREREZEmRwUQERERERER
ERERERFpcrQFloiIiIiIiIhUb3mgoSOonarbXp3sfYmUtv4SEZFTmJ4AERERERERERERERGR
JkcFEBERERERERERERERaXJUABERERERERERERERkSZHBRAREREREREREREREWlyVAARERER
EREREREREZEmp+4KIK41/KVzGuO/KauzJiWIQCnLHxtGps2EydaOWxdXHP1ZYx8Hx3KmtGvN
H6rGfKrF0hjGqDGNQzhO5jl/2MkSZyPn3zuLi1vbaRFrwtT7H+zwhnlgA855785XGdH1Bv5b
FKjbhg/OYbS9B3/b7KnbdkVEREREREREmoiwCiCOHyaTGTOEj0oq/8K7lWd6xNDrue0cufcU
lcGoBx/jhpzoWoZUwYr/ySG+/zMcvadTxuIpbYk/+3m2nuj7PK5V3N/OhMlU9escZu6v4xtZ
NRAo/JL7p+Zx289OAu6tPH9W3NEf1tk41JaL1X/uTPpV86i727310WYDOKFj1DRy1iTmvMa9
TpjTx/PxzkK2v30+CQ0dTFjKWPr4/5F31d2c18LU0MGIiIiIiIiIiJxSrHXWktlO/wmT6qCh
OHr/6e9cOv16Hph7DTMvSsG39XXues3G5HmTaBdVB6eoieju/HW9gweLPuei026l49w1PN2v
GbaYhruR5Svezl5Ta3pkVXMjtc7GQeqNxqjGmsScP1nilDoVKFrA0x/Ec+13HbE1dDAiIiIi
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
EREREREREREREREBIKZac6/blVdyDK9UayEiIiIiIiIiIiIiIiJHOw5bYImIiIiIiIiIiIiI
iBxfWgAREREREREREREREZFaRwsgIiIiIiIiIiIiIiJS62gBREREREREREREREREah0tgIiI
iIiIiIiIiIiISK2jBRAREREREREREREREal1tAAiIiIiIiIiIiIiIiK1jhZARERERERERERE
RESk1tECiIiIiIiIiIiIiIiI1DpaABERERERERERERERkVpHCyAiIiIiIiIiIiIiIlLraAFE
RERERERERERERERqHS2AiIiIiIiIiIiIiIhIraMFEBERERERERERERERqXW0ACIiIiIiIiIi
IiIiIrWOFkBERERERERERERERKTW0QLIKS+fjwamceYf/oenEqn8P83mmuapNEh04Tr//7Hd
V20B/rLsvYu4+9wLGPPRXvzVVUYN1q/KuL9k9BnNGbWiKPR3vOuY0LYJgxYXHLewzMHF3NWm
HfcsOVBt/SciIiIiIiIiIiLibAHEvY6Xbr+UVvWjcblcpJ5zA9NWlt+89O18lzFd04lxuUhs
1Y9Jy8vOFfP9ayPp0b4R0S4XKTct4efbrCXfMeUsFy5X+RHXZwGHbYOxyNMylvDq5149hkzX
0XG6XHXp/2F+BG1mXYeQrNrMpo+qWlT6IN7dsZ9tcy6jXoXf8LL20bakO62bU55NvHDbY5g/
v8fUy9OqbQXPvn6V5eF/f2iJy5XKsMWBsVOa+ypdo124Lp7FbmOX3qo9I2jr2Kb0eWQit2TF
VzZleMxBPnn4fr4ZPpvJPRo47L9qGksiIiIiIiIiIiJSqzm6/2i8e8hNupZpH24k98dveaXH
N4y9ejSfHAZKdzH3lqHMbPoUm/IPsGzUfv48cCxLDwO4iE3rxOAnXufFq+sT84vSG9DnnTzc
bjdut5v8d64k2TYaizwtYwmvfokdp7AlGJ/b7Wb/5/fSomFvbrsgKfw2s2sXKyHazLq8WiSh
DXe/s5znr04nuqZjqbRoEhrX478zvySfUn76cCY5LesRV5MhRaXSZcit9D4t9rgUZ/J/YHu7
icx+8FzqHJcSRURERERERERE5FTlaAHEVf/XPP70GK7t0pqMZmdz7f13cVb+l6zOK8Hs/4x/
fN6QW/44gFZJ9ek06hGuKHqH6V8XArE07zuK2wd0p02Dim6wuoiKSyAhIXDExzoJJ3Se1rGE
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
gviwUOI6jOSj2Lv55OMbaWUBInrwxJdv02/jBE6PNGOOOZWRszZSVH2kvS5l8JdHXevmeKlD
GwTDX1/DV586jrH5baNg+8/RCLZcfu4zxV7AjPkPEjmzJ7EhCfR4ysHwQc0ItZgOpmHEcd6t
AzF+z6HLLVfQosbZhRDaj7yV1qvfYtV+X2tAav4uCfgeEkrHO5fy8+x+7JxxBR0SIolM7sF1
b+TQ+6a+JJm9FPwwmxWpNzO6Y6iPvEVEREREREREROREMABvXl5ejTd4PB7sdjvFxcWsX7+e
ESNG1CnDdevW0a1btzqlISInIW8uH1/cnqcH/4ef72pTtZLCmfYsZ/VYxoO//4trk/3M2XoL
+frmc3ii21L+dUur47cSw7WTN/tfwqr7f+Cd/vH1M7ElIgF5K/ce9Hq9eDyeqn8ulwuXy4XT
6cRut2O327HZbNhsNsrLy9m1axcjR448wdGLiIiIiIiIyLE2d+5c7dYiIieKk6xvl5HVsR89
kiFr6VNMXdOcUS+lHvxi8hayeuYssi95mcuaBFiwZsRy4Usr6FgYcXyXtpkbM/jdFYxO0eSH
iIiIiIiIiIhIQ9LAt8ASkZOXl5JNr3F1+0islnDa3vADvV7+mHs7VRxz7sn+kItj4rhk8V94
bvolJAQxu2CEJZLS5DhPgBjhNEltTJhmP0RERERERERERBoUrQARkRMkhI4TFpE+wfdfTU1G
sLy4blvuiYiIiIiIiIiIyP8urQAREREREREREREREZGTjiZARERERERERERERETkpKMJEBER
EREREREREREROeloAkRERERERERERERERE46mgAREREREREREREREZGTjiZARERERERERERE
RETkpKMJEBEREREREREREREROeloAkRERERERERERERERE46mgAREREREREREREREZGTjiZA
RERERERERERERETkpKMJEBEREREREREREREROeloAkRERERERERERERERE46mgARERERERER
EREREZGTjiZARERERERERERERETkpKMJEBEREREREREREREROeloAkRERERERERERERERE46
mgCpi7Ifub1lKyasLa//tB3ljH8kgymZ3vpP+3hy2LhnajoTdwRZjvoud23zP4yXtfPSOe1T
G8eghWtW73XQwNM7VurU9iIiIiIiIiIiIvJn1/AmQOy/8HCbMHp9tI+KYUsXe764lY4RLbj2
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
--------------000002090607050602040201--

--M7oipOhf3FbnveUgVXFjI3JnLp8hd1upp
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)

iQIcBAEBAgAGBQJWMI4FAAoJENWYes1C3s/C4u0QAJCdptOmnJCzzmwX7+XDlTpR
gDbRC/Rn1yaFptDStBsZNOQAvg+dX/aKyKp75XappINeKCq8ZM+Gc0Jyq+jkYTUk
NcmgCzpnqgS3TijVjB04JMOc9Z1LjbUvRmjmqucYKXmKL3BzmJ+ATfShXyc5RJUU
b7jX1ry/VKVoi7lzX1pPQTAVC5SdyWHttRV9O4/KKKJi2QXzMyYcDtsEgMG1epJ+
vj4+iig5VS5hV5fRHCoHjx6Mnu81adztsdkSgrc2i5XXXG66tbhxVEA4QhSnaFEo
qEXVBpFEuaj6qjjMwOrH+JL5Ri71pYLsRNVnk8iQbrWKzy/I/Zc5JUJ9v49ArUgk
sqVNc2qNStKVZfK65HpZmhMucktUSeudSngCISh1JayTX/UX8YpuK5q7WXKrc9YS
YQxqKlcawHSHt29dB+bNF6qoet29h1dObgivMZ4CDy9EGqxN/veSOKCoZkGdtJMj
jF8mxcUILGCc24GG8PLVB/bAAUKrSfpHdYrCZ6m50U/yo5hF3RFfsq74NDeD0/KF
N0uHiYMQ/l7nPeg+ZygMOHpdwZh61LU+Q4Zr0JUD/ByrJ2Eb/bBMqETZ6EJQJ/Q+
Tld5gNsZEiIZIC3cfAtNu18M1j3g6toRAuyzoz/MZZOpY8D+wp24TOcslkHOYJ+v
rW5fnGidKnWrAhyeVitZ
=UckK
-----END PGP SIGNATURE-----

--M7oipOhf3FbnveUgVXFjI3JnLp8hd1upp--


--===============4026057686044234871==
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
--===============4026057686044234871==--


From win-pv-devel-bounces@lists.xenproject.org Wed Oct 28 09:20:29 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 28 Oct 2015 09:20:29 +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 1ZrMuC-0001ME-Sc; Wed, 28 Oct 2015 09:20:28 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabio.fantoni@m2r.biz>) id 1ZrMuC-0001M5-2j
	for win-pv-devel@lists.xenproject.org; Wed, 28 Oct 2015 09:20:28 +0000
Received: from [85.158.139.211] by server-3.bemta-5.messagelabs.com id
	A2/B4-06179-B5390365; Wed, 28 Oct 2015 09:20:27 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-4.tower-206.messagelabs.com!1446024026!45700719!1
X-Originating-IP: [209.85.212.172]
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 26383 invoked from network); 28 Oct 2015 09:20:26 -0000
Received: from mail-wi0-f172.google.com (HELO mail-wi0-f172.google.com)
	(209.85.212.172)
	by server-4.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	28 Oct 2015 09:20:26 -0000
Received: by wikq8 with SMTP id q8so244734261wik.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 28 Oct 2015 02:20:26 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=m2r_biz.20150623.gappssmtp.com; s=20150623;
	h=subject:to:references:from:message-id:date:user-agent:mime-version
	:in-reply-to:content-type;
	bh=Vw053u0wP+2mP0ClvNAF/zfPA6kUV33LB5NpUMH5Xyc=;
	b=chYHVxJ3GdNZbPU/OkUfniuj7EkiLk46BBJzH4wnXxaqlEO08fk7BC0f6HQ8nYbG8K
	DtJT1uczis04AxZ1cLyqd4tRmErE5m2UvSUZiISYuP0BE1vXOXV+hLaYFpGK8Eci6U3m
	YqREfd0uxUmMNTEl7IuJuSPi0fEwiGlNDqBuIIcWcPNzqG7XFYWR7kPORBZs3tPeKJa0
	C2nKXGCOYrVkruh1eCNWqBfp5p9XLwKHgVFnw31gqurcAoipNQBHJZ5WPNF8sRz0l1Ga
	vWt8iuOpFHB2CkkVwANG+o6WejLHkKkbAFJP4XpNCTBF0r8cAVg5oa7MFqiKj0It2j5A
	EmVw==
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;
	bh=Vw053u0wP+2mP0ClvNAF/zfPA6kUV33LB5NpUMH5Xyc=;
	b=TzgDyMDgxsXWJ/TSSEnCJ/bg+NosHGnP1i1ZMDnjCtDLsKnptdm3Ukz+2WDUfZnFKp
	xPzDQSl5EvCSx8MsfHMaCCBVYp+asHLyjGWnLeFqPsjU8ZW+RfZpDVx1homVLWOXqFPM
	RM5x9Mp820EQK5R0VS3xWSQOXi8c0NNJbrwby5KMC7PvsY2gw+UTkpDIBnkttLabbgYj
	3Roog+n+kS77gD3xLq4v9TDzuwRx6ulmx6RfKk3NZOMHsrDmxX3sCSq0yBEx00tLHjkK
	V333u8YqI+Kq5DOY3v+aplOFpB7t8xO3QZ8q/WPn2srfp1sVZG9G6b43cKGfx3ZLbSiz
	BqQw==
X-Gm-Message-State: ALoCoQkQ8Dced69+srBhdbtxqiimtOAjImJYUnR04NxfwDE8eFXrs5lvROQmM1lUJ3guzMgVQU5A
X-Received: by 10.194.190.47 with SMTP id gn15mr36160597wjc.119.1446024025832; 
	Wed, 28 Oct 2015 02:20:25 -0700 (PDT)
Received: from [192.168.1.37] (ip-73-126.sn2.eutelia.it. [83.211.73.126])
	by smtp.googlemail.com with ESMTPSA id
	p10sm49053923wjx.36.2015.10.28.02.20.24
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 28 Oct 2015 02:20:25 -0700 (PDT)
To: =?UTF-8?B?w4lsacOhcyBUYW3DoXM=?= <et@etit.hu>,
	win-pv-devel@lists.xenproject.org
References: <1AD33E34BA5E3649B4F6C7FE476686F4211C60AD@AMSPEX01CL03.citrite.net>
	<56308E05.60203@etit.hu>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <5630935D.6020903@m2r.biz>
Date: Wed, 28 Oct 2015 10:20:29 +0100
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <56308E05.60203@etit.hu>
Content-Type: multipart/mixed; boundary="------------050806010907000000010602"
Subject: Re: [win-pv-devel] Removing old glpv windows drivers to install new
 -> inaccessible boot device
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.
--------------050806010907000000010602
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Length: 3866
Content-Transfer-Encoding: quoted-printable

Il 28/10/2015 09:57, =C3=89li=C3=A1s Tam=C3=A1s ha scritto:
> Hi.
>
> I could successfully boot into safe mode, then used bcdedit for
> testsigning and now the installer worked (interesting that installing
> the pfx files previously did not make any difference). The install went
> fine, I could reboot. Unfortunately since then (it is more then 8 hours
> now) I'm facing the attached screen. The animation is just rolling,
> rolling rolling and nothing happens. CPU ticks are used, so I assume
> something is happening, but it seemes pretty much stuck.
>
> I think I will try what you recommended to remove all old/new drivers
> completely and then I might be able to revert back to the old glpv drivers.
>
> I received an other response on xen-users, where someone is facing the
> same problem, so it does not seem to exceptional.

The problem installing/removing/updating old and new pv drivers for 
windows are many unfortunately.
About gplpv remove after uninstall them from windows control panel you 
execute the uninstall bat from james harpes site=3F (now offline)
If no take from attachment (must be renamed to .bat) and run it to clean 
gplpv (>=3D0.10) things.

>
> 2015-10-28 09:47 keltez=C3=A9ssel, Ben Chalmers =C3=ADrta:
>> Your best bet is to boot with windows PE (Or mount the disk image and
>> use a linux registry editor)
>>
>>   
>>
>> Then in the registry search user
>> HKLM\system\currentcontrolset\control\class for XENFILT =E2=80=93 every time you
>> see it appearing in UpperFilters, remove it.
>>
>>   
>>
>> The go through the HKLM\system\currentcontrolset\services\xen* keys and
>> set Start to 3
>>
>>   
>>
>> This should let you boot up.
>>
>>   
>>
>>   
>>
>> Ben Chalmers
>>
>>   
>>
>>   
>>
>>
>> *From: *=C3=89li=C3=A1s Tam=C3=A1s
>> *Sent: *27 October 2015 15:14
>> *To: *win-pv-devel@lists.xenproject.org
>> *Subject: *[win-pv-devel] Removing old glpv windows drivers to install
>> new -> inaccessible boot device
>>
>>   
>>
>>   
>>
>> Hi all. I already issued this same question at xen users, but I might
>>
>> get more response at the developer list.
>>
>>   
>>
>> I have some Windows7 HVM domu (debian dom0) and xen 4.5. I'm
>>
>> successfully using the old uninvention gplpv windows drivers. I decided
>>
>> that follwoing an upgrade to xen 4.6 I will go to the official xen
>>
>> windows device drivers:
>>
>> http://www.xenproject.org/developers/teams/windows-pv-drivers.html
>>
>>   
>>
>> The installer failed installing these new drivers, so I guessed that the
>>
>> problem might be the presence of the old uninvention drivers. I
>>
>> uninstalled them, and rebooted the machine. Since then I'm getting BSOD
>>
>> saying that Windows failed to boot, INACCESSIBLE_BOOT_DEVICE.
>>
>>   
>>
>> Is there a way to let Windows boot again=3F I guess if I cold turn on some
>>
>> basic harddisk emulation what windows should know by default, my problem
>>
>> should gone (so instead of PVHVM stubdomain I would have a normal HVM
>>
>> domain at least until I install the new drivers)=3F
>>
>>   
>>
>> Thank you.
>>
>>   
>>
>> -- 
>>
>>   
>>
>>   
>>
>> =C3=89li=C3=A1s Tam=C3=A1s
>>
>> Thomas Elias
>>
>>   
>>
>> ETIT[nwpro] KFT, =C3=9Cgyvezet=C5=91
>>
>> ETIT[nwpro] Ltd, General Manager
>>
>>   
>>
>> Tel. HU: +36/30-497-1626
>>
>> Tel. DE: +49/160-651-8723
>>
>> OpenPGP pubkey: http://etit.hu/doc/et-pub.asc
>>
>>   
>>
>> Okleveles m=C3=A9rn=C3=B6k-informatikus (MSC)
>>
>> Master of Science in Information Technology (MSC)
>>
>>   
>>
>> Kapcsolat: http://etit.hu/index.php/hu/kapcsolat
>>
>> Jogi nyilatkozat: http://etit.hu/disclaimer-email-hu.txt
>>
>> Contact: http://etit.hu/index.php/en/contact
>>
>> Disclaimer: http://etit.hu/disclaimer-email-en.txt
>>

--------------050806010907000000010602
Content-Type: application/octet-stream;
 name="uninstall_0.10.x.bin"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="uninstall_0.10.x.bin"

QEVDSE8gT0ZGDQoNClJFTSBzdG9wIGFuZCByZW1vdmUgc2h1dGRvd25tb24gc2VydmljZQ0K
bmV0IHN0b3Agc2h1dGRvd25tb24NCiIlUHJvZ3JhbUZpbGVzJVxYZW4gUFYgRHJpdmVyc1xi
aW5cU2h1dGRvd25Nb24uZXhlIiAtdQ0KDQpSRU0gcmVtb3ZlIFhFTiBmcm9tIFByb2dyYW0g
RmlsZXMNCnJtZGlyIC9xIC9zICIlUHJvZ3JhbUZpbGVzJVxYZW4gUFYgRHJpdmVycyINCg0K
UkVNIHJlbW92ZSBzdGFydCBtZW51IHN0dWZmDQpFQ0hPICJQbGVhc2UgcmVtb3ZlIFN0YXJ0
IE1lbnUgc3R1ZmYgbWFudWFsbHkiDQoNCmRlbCAvcSAiJVN5c3RlbVJvb3QlXHN5c3RlbTMy
XGRyaXZlcnNceGVuKiINCg0KUkVNIGRlbGV0ZSBpbmYgYW5kIHBuZiBmaWxlcw0KRk9SIC9G
ICJkZWxpbXM9LiB0b2tlbnM9MSIgJSVJIElOICgnRElSIC9CICIlU1lTVEVNUk9PVCVcSU5G
XE9FTSouSU5GIicpIERPICgNCiBUWVBFICIlU1lTVEVNUk9PVCVcSU5GXCUlSS5pbmYiIHwg
RklORCAvYyAvaSAieGVuIiA+JVRFTVAlXGphbWVzDQogRk9SIC9mICUlYyBJTiAoJVRFTVAl
XGphbWVzKSBETyAoDQogIElGIC9JICUlYyBORVEgMCAoDQogICBERUwgIiVTWVNURU1ST09U
JVxJTkZcJSVJLmluZiINCiAgIERFTCAiJVNZU1RFTVJPT1QlXElORlwlJUkucG5mIg0KICAp
DQogKQ0KKQ0KDQpSRU0gY2xlYW4gcmVnaXN0cnkNClJFRyBERUxFVEUgSEtMTVxTWVNURU1c
Q3VycmVudENvbnRyb2xTZXRcU2VydmljZXNcWGVuSGlkZSAvZg0KUkVHIERFTEVURSBIS0xN
XFNZU1RFTVxDdXJyZW50Q29udHJvbFNldFxTZXJ2aWNlc1xYZW5OZXQgL2YNClJFRyBERUxF
VEUgSEtMTVxTWVNURU1cQ3VycmVudENvbnRyb2xTZXRcU2VydmljZXNcWGVuUGNpIC9mDQpS
RUcgREVMRVRFIEhLTE1cU1lTVEVNXEN1cnJlbnRDb250cm9sU2V0XFNlcnZpY2VzXFhlblZi
ZCAvZg0KUkVHIERFTEVURSBIS0xNXFNZU1RFTVxDdXJyZW50Q29udHJvbFNldFxDb250cm9s
XENsYXNzXHs0RDM2RTk2QS1FMzI1LTExQ0UtQkZDMS0wODAwMkJFMTAzMTh9IC92IFVwcGVy
RmlsdGVycyAvZg0KUkVHIERFTEVURSBIS0xNXFNZU1RFTVxDdXJyZW50Q29udHJvbFNldFxD
b250cm9sXENsYXNzXHs0RDM2RTk3Mi1FMzI1LTExQ0UtQkZDMS0wODAwMmJFMTAzMTh9IC92
IFVwcGVyRmlsdGVycyAvZg0KUkVHIERFTEVURSBIS0xNXFNZU1RFTVxDdXJyZW50Q29udHJv
bFNldFxDb250cm9sXENsYXNzXHs0RDM2RTk3Qi1FMzI1LTExQ0UtQkZDMS0wODAwMkJFMTAz
MTh9IC92IFVwcGVyRmlsdGVycyAvZg0KRUNITyBkb25lDQo=
--------------050806010907000000010602
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
--------------050806010907000000010602--


From win-pv-devel-bounces@lists.xenproject.org Wed Oct 28 09:20:29 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 28 Oct 2015 09:20:29 +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 1ZrMuC-0001ME-Sc; Wed, 28 Oct 2015 09:20:28 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabio.fantoni@m2r.biz>) id 1ZrMuC-0001M5-2j
	for win-pv-devel@lists.xenproject.org; Wed, 28 Oct 2015 09:20:28 +0000
Received: from [85.158.139.211] by server-3.bemta-5.messagelabs.com id
	A2/B4-06179-B5390365; Wed, 28 Oct 2015 09:20:27 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-4.tower-206.messagelabs.com!1446024026!45700719!1
X-Originating-IP: [209.85.212.172]
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 26383 invoked from network); 28 Oct 2015 09:20:26 -0000
Received: from mail-wi0-f172.google.com (HELO mail-wi0-f172.google.com)
	(209.85.212.172)
	by server-4.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	28 Oct 2015 09:20:26 -0000
Received: by wikq8 with SMTP id q8so244734261wik.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 28 Oct 2015 02:20:26 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=m2r_biz.20150623.gappssmtp.com; s=20150623;
	h=subject:to:references:from:message-id:date:user-agent:mime-version
	:in-reply-to:content-type;
	bh=Vw053u0wP+2mP0ClvNAF/zfPA6kUV33LB5NpUMH5Xyc=;
	b=chYHVxJ3GdNZbPU/OkUfniuj7EkiLk46BBJzH4wnXxaqlEO08fk7BC0f6HQ8nYbG8K
	DtJT1uczis04AxZ1cLyqd4tRmErE5m2UvSUZiISYuP0BE1vXOXV+hLaYFpGK8Eci6U3m
	YqREfd0uxUmMNTEl7IuJuSPi0fEwiGlNDqBuIIcWcPNzqG7XFYWR7kPORBZs3tPeKJa0
	C2nKXGCOYrVkruh1eCNWqBfp5p9XLwKHgVFnw31gqurcAoipNQBHJZ5WPNF8sRz0l1Ga
	vWt8iuOpFHB2CkkVwANG+o6WejLHkKkbAFJP4XpNCTBF0r8cAVg5oa7MFqiKj0It2j5A
	EmVw==
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;
	bh=Vw053u0wP+2mP0ClvNAF/zfPA6kUV33LB5NpUMH5Xyc=;
	b=TzgDyMDgxsXWJ/TSSEnCJ/bg+NosHGnP1i1ZMDnjCtDLsKnptdm3Ukz+2WDUfZnFKp
	xPzDQSl5EvCSx8MsfHMaCCBVYp+asHLyjGWnLeFqPsjU8ZW+RfZpDVx1homVLWOXqFPM
	RM5x9Mp820EQK5R0VS3xWSQOXi8c0NNJbrwby5KMC7PvsY2gw+UTkpDIBnkttLabbgYj
	3Roog+n+kS77gD3xLq4v9TDzuwRx6ulmx6RfKk3NZOMHsrDmxX3sCSq0yBEx00tLHjkK
	V333u8YqI+Kq5DOY3v+aplOFpB7t8xO3QZ8q/WPn2srfp1sVZG9G6b43cKGfx3ZLbSiz
	BqQw==
X-Gm-Message-State: ALoCoQkQ8Dced69+srBhdbtxqiimtOAjImJYUnR04NxfwDE8eFXrs5lvROQmM1lUJ3guzMgVQU5A
X-Received: by 10.194.190.47 with SMTP id gn15mr36160597wjc.119.1446024025832; 
	Wed, 28 Oct 2015 02:20:25 -0700 (PDT)
Received: from [192.168.1.37] (ip-73-126.sn2.eutelia.it. [83.211.73.126])
	by smtp.googlemail.com with ESMTPSA id
	p10sm49053923wjx.36.2015.10.28.02.20.24
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 28 Oct 2015 02:20:25 -0700 (PDT)
To: =?UTF-8?B?w4lsacOhcyBUYW3DoXM=?= <et@etit.hu>,
	win-pv-devel@lists.xenproject.org
References: <1AD33E34BA5E3649B4F6C7FE476686F4211C60AD@AMSPEX01CL03.citrite.net>
	<56308E05.60203@etit.hu>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <5630935D.6020903@m2r.biz>
Date: Wed, 28 Oct 2015 10:20:29 +0100
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <56308E05.60203@etit.hu>
Content-Type: multipart/mixed; boundary="------------050806010907000000010602"
Subject: Re: [win-pv-devel] Removing old glpv windows drivers to install new
 -> inaccessible boot device
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.
--------------050806010907000000010602
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Length: 3866
Content-Transfer-Encoding: quoted-printable

Il 28/10/2015 09:57, =C3=89li=C3=A1s Tam=C3=A1s ha scritto:
> Hi.
>
> I could successfully boot into safe mode, then used bcdedit for
> testsigning and now the installer worked (interesting that installing
> the pfx files previously did not make any difference). The install went
> fine, I could reboot. Unfortunately since then (it is more then 8 hours
> now) I'm facing the attached screen. The animation is just rolling,
> rolling rolling and nothing happens. CPU ticks are used, so I assume
> something is happening, but it seemes pretty much stuck.
>
> I think I will try what you recommended to remove all old/new drivers
> completely and then I might be able to revert back to the old glpv drivers.
>
> I received an other response on xen-users, where someone is facing the
> same problem, so it does not seem to exceptional.

The problem installing/removing/updating old and new pv drivers for 
windows are many unfortunately.
About gplpv remove after uninstall them from windows control panel you 
execute the uninstall bat from james harpes site=3F (now offline)
If no take from attachment (must be renamed to .bat) and run it to clean 
gplpv (>=3D0.10) things.

>
> 2015-10-28 09:47 keltez=C3=A9ssel, Ben Chalmers =C3=ADrta:
>> Your best bet is to boot with windows PE (Or mount the disk image and
>> use a linux registry editor)
>>
>>   
>>
>> Then in the registry search user
>> HKLM\system\currentcontrolset\control\class for XENFILT =E2=80=93 every time you
>> see it appearing in UpperFilters, remove it.
>>
>>   
>>
>> The go through the HKLM\system\currentcontrolset\services\xen* keys and
>> set Start to 3
>>
>>   
>>
>> This should let you boot up.
>>
>>   
>>
>>   
>>
>> Ben Chalmers
>>
>>   
>>
>>   
>>
>>
>> *From: *=C3=89li=C3=A1s Tam=C3=A1s
>> *Sent: *27 October 2015 15:14
>> *To: *win-pv-devel@lists.xenproject.org
>> *Subject: *[win-pv-devel] Removing old glpv windows drivers to install
>> new -> inaccessible boot device
>>
>>   
>>
>>   
>>
>> Hi all. I already issued this same question at xen users, but I might
>>
>> get more response at the developer list.
>>
>>   
>>
>> I have some Windows7 HVM domu (debian dom0) and xen 4.5. I'm
>>
>> successfully using the old uninvention gplpv windows drivers. I decided
>>
>> that follwoing an upgrade to xen 4.6 I will go to the official xen
>>
>> windows device drivers:
>>
>> http://www.xenproject.org/developers/teams/windows-pv-drivers.html
>>
>>   
>>
>> The installer failed installing these new drivers, so I guessed that the
>>
>> problem might be the presence of the old uninvention drivers. I
>>
>> uninstalled them, and rebooted the machine. Since then I'm getting BSOD
>>
>> saying that Windows failed to boot, INACCESSIBLE_BOOT_DEVICE.
>>
>>   
>>
>> Is there a way to let Windows boot again=3F I guess if I cold turn on some
>>
>> basic harddisk emulation what windows should know by default, my problem
>>
>> should gone (so instead of PVHVM stubdomain I would have a normal HVM
>>
>> domain at least until I install the new drivers)=3F
>>
>>   
>>
>> Thank you.
>>
>>   
>>
>> -- 
>>
>>   
>>
>>   
>>
>> =C3=89li=C3=A1s Tam=C3=A1s
>>
>> Thomas Elias
>>
>>   
>>
>> ETIT[nwpro] KFT, =C3=9Cgyvezet=C5=91
>>
>> ETIT[nwpro] Ltd, General Manager
>>
>>   
>>
>> Tel. HU: +36/30-497-1626
>>
>> Tel. DE: +49/160-651-8723
>>
>> OpenPGP pubkey: http://etit.hu/doc/et-pub.asc
>>
>>   
>>
>> Okleveles m=C3=A9rn=C3=B6k-informatikus (MSC)
>>
>> Master of Science in Information Technology (MSC)
>>
>>   
>>
>> Kapcsolat: http://etit.hu/index.php/hu/kapcsolat
>>
>> Jogi nyilatkozat: http://etit.hu/disclaimer-email-hu.txt
>>
>> Contact: http://etit.hu/index.php/en/contact
>>
>> Disclaimer: http://etit.hu/disclaimer-email-en.txt
>>

--------------050806010907000000010602
Content-Type: application/octet-stream;
 name="uninstall_0.10.x.bin"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="uninstall_0.10.x.bin"

QEVDSE8gT0ZGDQoNClJFTSBzdG9wIGFuZCByZW1vdmUgc2h1dGRvd25tb24gc2VydmljZQ0K
bmV0IHN0b3Agc2h1dGRvd25tb24NCiIlUHJvZ3JhbUZpbGVzJVxYZW4gUFYgRHJpdmVyc1xi
aW5cU2h1dGRvd25Nb24uZXhlIiAtdQ0KDQpSRU0gcmVtb3ZlIFhFTiBmcm9tIFByb2dyYW0g
RmlsZXMNCnJtZGlyIC9xIC9zICIlUHJvZ3JhbUZpbGVzJVxYZW4gUFYgRHJpdmVycyINCg0K
UkVNIHJlbW92ZSBzdGFydCBtZW51IHN0dWZmDQpFQ0hPICJQbGVhc2UgcmVtb3ZlIFN0YXJ0
IE1lbnUgc3R1ZmYgbWFudWFsbHkiDQoNCmRlbCAvcSAiJVN5c3RlbVJvb3QlXHN5c3RlbTMy
XGRyaXZlcnNceGVuKiINCg0KUkVNIGRlbGV0ZSBpbmYgYW5kIHBuZiBmaWxlcw0KRk9SIC9G
ICJkZWxpbXM9LiB0b2tlbnM9MSIgJSVJIElOICgnRElSIC9CICIlU1lTVEVNUk9PVCVcSU5G
XE9FTSouSU5GIicpIERPICgNCiBUWVBFICIlU1lTVEVNUk9PVCVcSU5GXCUlSS5pbmYiIHwg
RklORCAvYyAvaSAieGVuIiA+JVRFTVAlXGphbWVzDQogRk9SIC9mICUlYyBJTiAoJVRFTVAl
XGphbWVzKSBETyAoDQogIElGIC9JICUlYyBORVEgMCAoDQogICBERUwgIiVTWVNURU1ST09U
JVxJTkZcJSVJLmluZiINCiAgIERFTCAiJVNZU1RFTVJPT1QlXElORlwlJUkucG5mIg0KICAp
DQogKQ0KKQ0KDQpSRU0gY2xlYW4gcmVnaXN0cnkNClJFRyBERUxFVEUgSEtMTVxTWVNURU1c
Q3VycmVudENvbnRyb2xTZXRcU2VydmljZXNcWGVuSGlkZSAvZg0KUkVHIERFTEVURSBIS0xN
XFNZU1RFTVxDdXJyZW50Q29udHJvbFNldFxTZXJ2aWNlc1xYZW5OZXQgL2YNClJFRyBERUxF
VEUgSEtMTVxTWVNURU1cQ3VycmVudENvbnRyb2xTZXRcU2VydmljZXNcWGVuUGNpIC9mDQpS
RUcgREVMRVRFIEhLTE1cU1lTVEVNXEN1cnJlbnRDb250cm9sU2V0XFNlcnZpY2VzXFhlblZi
ZCAvZg0KUkVHIERFTEVURSBIS0xNXFNZU1RFTVxDdXJyZW50Q29udHJvbFNldFxDb250cm9s
XENsYXNzXHs0RDM2RTk2QS1FMzI1LTExQ0UtQkZDMS0wODAwMkJFMTAzMTh9IC92IFVwcGVy
RmlsdGVycyAvZg0KUkVHIERFTEVURSBIS0xNXFNZU1RFTVxDdXJyZW50Q29udHJvbFNldFxD
b250cm9sXENsYXNzXHs0RDM2RTk3Mi1FMzI1LTExQ0UtQkZDMS0wODAwMmJFMTAzMTh9IC92
IFVwcGVyRmlsdGVycyAvZg0KUkVHIERFTEVURSBIS0xNXFNZU1RFTVxDdXJyZW50Q29udHJv
bFNldFxDb250cm9sXENsYXNzXHs0RDM2RTk3Qi1FMzI1LTExQ0UtQkZDMS0wODAwMkJFMTAz
MTh9IC92IFVwcGVyRmlsdGVycyAvZg0KRUNITyBkb25lDQo=
--------------050806010907000000010602
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
--------------050806010907000000010602--


From win-pv-devel-bounces@lists.xenproject.org Wed Oct 28 12:06:32 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 28 Oct 2015 12:06: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 1ZrPUu-0006cm-1L; Wed, 28 Oct 2015 12:06:32 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <lars.kurth.xen@gmail.com>)
	id 1ZrPUs-0006cV-U9; Wed, 28 Oct 2015 12:06:31 +0000
Received: from [85.158.137.68] by server-7.bemta-3.messagelabs.com id
	2A/F3-16965-54AB0365; Wed, 28 Oct 2015 12:06:29 +0000
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-10.tower-31.messagelabs.com!1446033988!57561829!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 15438 invoked from network); 28 Oct 2015 12:06:28 -0000
Received: from mail-wi0-f174.google.com (HELO mail-wi0-f174.google.com)
	(209.85.212.174)
	by server-10.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	28 Oct 2015 12:06:28 -0000
Received: by wicfv8 with SMTP id fv8so9973989wic.0;
	Wed, 28 Oct 2015 05:06:28 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:content-type:content-transfer-encoding:subject:date:references
	:to:message-id:mime-version;
	bh=esesYJITiqCvLjUC2oRcL+R2LSey/y9QoChH/Jx5/h4=;
	b=VAEWgtylWsMbBFPVBkbCgM/+ZSxJ9Rp6HzcosBEbTXZ5Bm/DGnc9PSnDms1h9OlwN5
	D2Thn3SGeZxqiqDsaqVC5Tm20Z1TrD5bh0eQWLQ7A+7TMrJkpa1kQ1nYmcOVo31+nmME
	CBSMAh03HJtBt+5Cm4/Rp4U5x0/MNLgGiIggMIjXAqcHeWx5m7cPNpRBgeKtzonpV+de
	DBArHIoXe4vTEeEK7qELqFZlJrwca39cf3A85QQSGl4pgGxWILRTLh4bZ+ye5NojVcDJ
	gE/5KuSt7LJ6BIW1M+QVVVmRt4KBBAeA+ChYcD1XFFsoMfKfnbRS77pg+x4rodiS+DKb
	lHBA==
X-Received: by 10.194.116.167 with SMTP id jx7mr22344047wjb.4.1446033988360;
	Wed, 28 Oct 2015 05:06:28 -0700 (PDT)
Received: from [192.168.0.9] (97e3cc8b.skybroadband.com. [151.227.204.139])
	by smtp.gmail.com with ESMTPSA id bn5sm5954307wib.0.2015.10.28.05.06.27
	(version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128);
	Wed, 28 Oct 2015 05:06:27 -0700 (PDT)
From: Lars Kurth <lars.kurth.xen@gmail.com>
Date: Wed, 28 Oct 2015 12:06:28 +0000
References: <56300786.5000204@redhat.com>
To: Xen-devel <xen-devel@lists.xen.org>,
	mirageos-devel <mirageos-devel@lists.xenproject.org>,
	Win-pv-devel@lists.xenproject.org, publicity@lists.xenproject.org
Message-Id: <06007853-CB66-44BE-9F2D-4AB6E5E07AA9@gmail.com>
Mime-Version: 1.0 (Mac OS X Mail 8.2 \(2104\))
X-Mailer: Apple Mail (2.2104)
Subject: [win-pv-devel] Virtualization & IaaS Devroom CFP @ FOSDEM'16
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



> Begin forwarded message:
> 
> From: Mikey Ariel <mariel@redhat.com>
> Subject: [devroom-managers] Virtualization & IaaS Devroom CFP
> Date: 27 October 2015 23:23:50 GMT
> To: fosdem@lists.fosdem.org, devroom-managers@lists.fosdem.org, iaas-virt-devroom@lists.fosdem.org
> 
> **Please forward to any project or individual that might be interested in participating in this devroom!**
> 
> -------------------------
> Call for Participation
> -------------------------
> 
> The Virtualization & IaaS devroom will feature sessions around virtualization and Infrastructure-as-a-Service, with topics to include open source hypervisors and virtual machine managers such as KVM, Xen, bhyve, and VirtualBox, and Infrastructure-as-a-Service projects such as Apache CloudStack, OpenStack, oVirt, OpenNebula, and Ganeti.
> 
> This devroom will host presentations and labs that focus on topics of shared interest, such as KVM, libvirt, shared storage, virtualized networking, clustering and high availability, interfacing with multiple hypervisors, and scaling across hundreds or thousands of servers.
> 
> Presentations in this devroom will be aimed at developers working on these platforms who are looking to collaborate and improve shared infrastructure or solve common problems.
> 
> The devroom organizers will seek topics that encourage dialog between projects and continued work post-FOSDEM.
> 
> -------------------------
> Important Dates
> -------------------------
> 
> Submission deadline: 1 December 2015
> Acceptance notifications: 10 December 2015
> Final schedule announcement: 17 December 2015
> Devroom: 30-31 January 2016 (two days)
> 
> -------------------------
> Submission Guidelines: READ CAREFULLY
> -------------------------
> 
> ** Please note that we expect more proposals than we can possibly accept, so it is vitally important that you submit your proposal on or before the deadline. Late submissions are unlikely to be considered.**
> 
> * All presentation slots are 45 minutes, with 35 minutes planned for presentations, and 10 minutes for Q&A.
> 
> * All presentations *will* be recorded and made available under Creative Commons licenses. In the "Submission notes" field, please indicate that you agree that your presentation will be licensed under the CC-By-SA-4.0 or CC-By-4.0 license and that you agree to have your presentation recorded. For example:
> 
>    "If my presentation is accepted for FOSDEM, I hereby agree to license all recordings, slides, and other associated materials under the Creative Commons Attribution Share-Alike 4.0 International License. Sincerely, <NAME>."
> 
> * In the "Submission notes" field, please also confirm that if your talk is accepted, you *will* be able to attend FOSDEM and deliver your presentation. We will not consider proposals from prospective speakers who are unsure whether they will be able to secure funds for travel and lodging to attend FOSDEM. (Sadly, we are not able to offer travel funding for prospective speakers.)
> 
> -------------------------
> How to Submit
> -------------------------
> 
> All submissions must be made via the Pentabarf event planning site:
> https://penta.fosdem.org/submission/FOSDEM16
> 
> If you have not used Pentabarf before, you will need to create an account. If you submitted proposals for FOSDEM in previous years, you can use your existing account.
> 
> After creating the account, select "Create Event" to start the submission process. Make sure to select "Virtualization & IaaS devroom" from the Track list.
> 
> Please fill out all the required fields, and provide a meaningful abstract and description of your proposed session.
> 
> -------------------------
> Call for Volunteers
> -------------------------
> 
> We are also looking for volunteers to help run the devroom. We need assistance watching time for the speakers, and helping with video for the devroom. Please contact Mikey Ariel (mariel at redhat.com) for more information.
> 
> -------------------------
> Questions
> -------------------------
> 
> If you have any questions about this devroom, please send your questions to: iaas-virt-devroom at lists.fosdem.org
> 
> We will respond as quickly as possible. Thanks!
> 
> -- 
> Mikey Ariel
> Community Lead, oVirt
> www.ovirt.org
> 
> "To be is to do" (Socrates)
> "To do is to be" (Jean-Paul Sartre)
> "Do be do be do" (Frank Sinatra)
> 
> Mobile: +420-702-131-141
> IRC: mariel / thatdocslady
> Twitter: @ThatDocsLady
> _______________________________________________
> devroom-managers mailing list
> devroom-managers@lists.fosdem.org
> https://lists.fosdem.org/listinfo/devroom-managers


_______________________________________________
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 Oct 28 12:06:32 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 28 Oct 2015 12:06: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 1ZrPUu-0006cm-1L; Wed, 28 Oct 2015 12:06:32 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <lars.kurth.xen@gmail.com>)
	id 1ZrPUs-0006cV-U9; Wed, 28 Oct 2015 12:06:31 +0000
Received: from [85.158.137.68] by server-7.bemta-3.messagelabs.com id
	2A/F3-16965-54AB0365; Wed, 28 Oct 2015 12:06:29 +0000
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-10.tower-31.messagelabs.com!1446033988!57561829!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 15438 invoked from network); 28 Oct 2015 12:06:28 -0000
Received: from mail-wi0-f174.google.com (HELO mail-wi0-f174.google.com)
	(209.85.212.174)
	by server-10.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	28 Oct 2015 12:06:28 -0000
Received: by wicfv8 with SMTP id fv8so9973989wic.0;
	Wed, 28 Oct 2015 05:06:28 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:content-type:content-transfer-encoding:subject:date:references
	:to:message-id:mime-version;
	bh=esesYJITiqCvLjUC2oRcL+R2LSey/y9QoChH/Jx5/h4=;
	b=VAEWgtylWsMbBFPVBkbCgM/+ZSxJ9Rp6HzcosBEbTXZ5Bm/DGnc9PSnDms1h9OlwN5
	D2Thn3SGeZxqiqDsaqVC5Tm20Z1TrD5bh0eQWLQ7A+7TMrJkpa1kQ1nYmcOVo31+nmME
	CBSMAh03HJtBt+5Cm4/Rp4U5x0/MNLgGiIggMIjXAqcHeWx5m7cPNpRBgeKtzonpV+de
	DBArHIoXe4vTEeEK7qELqFZlJrwca39cf3A85QQSGl4pgGxWILRTLh4bZ+ye5NojVcDJ
	gE/5KuSt7LJ6BIW1M+QVVVmRt4KBBAeA+ChYcD1XFFsoMfKfnbRS77pg+x4rodiS+DKb
	lHBA==
X-Received: by 10.194.116.167 with SMTP id jx7mr22344047wjb.4.1446033988360;
	Wed, 28 Oct 2015 05:06:28 -0700 (PDT)
Received: from [192.168.0.9] (97e3cc8b.skybroadband.com. [151.227.204.139])
	by smtp.gmail.com with ESMTPSA id bn5sm5954307wib.0.2015.10.28.05.06.27
	(version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128);
	Wed, 28 Oct 2015 05:06:27 -0700 (PDT)
From: Lars Kurth <lars.kurth.xen@gmail.com>
Date: Wed, 28 Oct 2015 12:06:28 +0000
References: <56300786.5000204@redhat.com>
To: Xen-devel <xen-devel@lists.xen.org>,
	mirageos-devel <mirageos-devel@lists.xenproject.org>,
	Win-pv-devel@lists.xenproject.org, publicity@lists.xenproject.org
Message-Id: <06007853-CB66-44BE-9F2D-4AB6E5E07AA9@gmail.com>
Mime-Version: 1.0 (Mac OS X Mail 8.2 \(2104\))
X-Mailer: Apple Mail (2.2104)
Subject: [win-pv-devel] Virtualization & IaaS Devroom CFP @ FOSDEM'16
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



> Begin forwarded message:
> 
> From: Mikey Ariel <mariel@redhat.com>
> Subject: [devroom-managers] Virtualization & IaaS Devroom CFP
> Date: 27 October 2015 23:23:50 GMT
> To: fosdem@lists.fosdem.org, devroom-managers@lists.fosdem.org, iaas-virt-devroom@lists.fosdem.org
> 
> **Please forward to any project or individual that might be interested in participating in this devroom!**
> 
> -------------------------
> Call for Participation
> -------------------------
> 
> The Virtualization & IaaS devroom will feature sessions around virtualization and Infrastructure-as-a-Service, with topics to include open source hypervisors and virtual machine managers such as KVM, Xen, bhyve, and VirtualBox, and Infrastructure-as-a-Service projects such as Apache CloudStack, OpenStack, oVirt, OpenNebula, and Ganeti.
> 
> This devroom will host presentations and labs that focus on topics of shared interest, such as KVM, libvirt, shared storage, virtualized networking, clustering and high availability, interfacing with multiple hypervisors, and scaling across hundreds or thousands of servers.
> 
> Presentations in this devroom will be aimed at developers working on these platforms who are looking to collaborate and improve shared infrastructure or solve common problems.
> 
> The devroom organizers will seek topics that encourage dialog between projects and continued work post-FOSDEM.
> 
> -------------------------
> Important Dates
> -------------------------
> 
> Submission deadline: 1 December 2015
> Acceptance notifications: 10 December 2015
> Final schedule announcement: 17 December 2015
> Devroom: 30-31 January 2016 (two days)
> 
> -------------------------
> Submission Guidelines: READ CAREFULLY
> -------------------------
> 
> ** Please note that we expect more proposals than we can possibly accept, so it is vitally important that you submit your proposal on or before the deadline. Late submissions are unlikely to be considered.**
> 
> * All presentation slots are 45 minutes, with 35 minutes planned for presentations, and 10 minutes for Q&A.
> 
> * All presentations *will* be recorded and made available under Creative Commons licenses. In the "Submission notes" field, please indicate that you agree that your presentation will be licensed under the CC-By-SA-4.0 or CC-By-4.0 license and that you agree to have your presentation recorded. For example:
> 
>    "If my presentation is accepted for FOSDEM, I hereby agree to license all recordings, slides, and other associated materials under the Creative Commons Attribution Share-Alike 4.0 International License. Sincerely, <NAME>."
> 
> * In the "Submission notes" field, please also confirm that if your talk is accepted, you *will* be able to attend FOSDEM and deliver your presentation. We will not consider proposals from prospective speakers who are unsure whether they will be able to secure funds for travel and lodging to attend FOSDEM. (Sadly, we are not able to offer travel funding for prospective speakers.)
> 
> -------------------------
> How to Submit
> -------------------------
> 
> All submissions must be made via the Pentabarf event planning site:
> https://penta.fosdem.org/submission/FOSDEM16
> 
> If you have not used Pentabarf before, you will need to create an account. If you submitted proposals for FOSDEM in previous years, you can use your existing account.
> 
> After creating the account, select "Create Event" to start the submission process. Make sure to select "Virtualization & IaaS devroom" from the Track list.
> 
> Please fill out all the required fields, and provide a meaningful abstract and description of your proposed session.
> 
> -------------------------
> Call for Volunteers
> -------------------------
> 
> We are also looking for volunteers to help run the devroom. We need assistance watching time for the speakers, and helping with video for the devroom. Please contact Mikey Ariel (mariel at redhat.com) for more information.
> 
> -------------------------
> Questions
> -------------------------
> 
> If you have any questions about this devroom, please send your questions to: iaas-virt-devroom at lists.fosdem.org
> 
> We will respond as quickly as possible. Thanks!
> 
> -- 
> Mikey Ariel
> Community Lead, oVirt
> www.ovirt.org
> 
> "To be is to do" (Socrates)
> "To do is to be" (Jean-Paul Sartre)
> "Do be do be do" (Frank Sinatra)
> 
> Mobile: +420-702-131-141
> IRC: mariel / thatdocslady
> Twitter: @ThatDocsLady
> _______________________________________________
> devroom-managers mailing list
> devroom-managers@lists.fosdem.org
> https://lists.fosdem.org/listinfo/devroom-managers


_______________________________________________
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 Oct 29 05:55:20 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 05: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 1ZrgBD-0000ll-Ep; Thu, 29 Oct 2015 05:55:19 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xennewbie@gmail.com>) id 1ZrgBC-0000ld-11
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 05:55:18 +0000
Received: from [193.109.254.147] by server-14.bemta-14.messagelabs.com id
	DE/70-04752-5C4B1365; Thu, 29 Oct 2015 05:55:17 +0000
X-Env-Sender: xennewbie@gmail.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1446098115!56377299!1
X-Originating-IP: [209.85.218.67]
X-SpamReason: No, hits=1.7 required=7.0 tests=BODY_RANDOM_LONG,
	HTML_10_20,HTML_MESSAGE,RCVD_BY_IP
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12201 invoked from network); 29 Oct 2015 05:55:16 -0000
Received: from mail-oi0-f67.google.com (HELO mail-oi0-f67.google.com)
	(209.85.218.67)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	29 Oct 2015 05:55:16 -0000
Received: by oiaw3 with SMTP id w3so1604311oia.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 28 Oct 2015 22:55:14 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=mime-version:date:message-id:subject:from:to:content-type;
	bh=Hr1oQht1+dBI6WwZaKLa8iRPUKmPoI6EYSXKiQRCEmk=;
	b=DZq+ti/MF0cDWoVKnG9foZvcf0B7RccYWAwINyTK4jcrRITXw4AhFdXGbPjQ6XKD99
	6FwrPzigywxXdA+Kt4FbanstlAfftNk2+C6xldvK/Zuzu9lutgw5tSF2PV/8AY1Cp7Qu
	wwuL5DgiqPpob5/EV5tcfZu8SGO7u6io9db/f7r8g8/ylgKA62aBu0Qr5v/yH3uQgZMy
	WprNG4/e8747YQ5WSGTsf/Pk465HGEgw/RLTDiJQG6B+m4f2W2XYcu90rLe60w50Rx9v
	N3hrwPf6rU+ULYdUkkwmp+vXGjW2YnpyzYljh4JD1cszY3VNTHhl4Jw4NjQ0J/t5GGiA
	3KtQ==
MIME-Version: 1.0
X-Received: by 10.202.231.79 with SMTP id e76mr24481541oih.129.1446098114734; 
	Wed, 28 Oct 2015 22:55:14 -0700 (PDT)
Received: by 10.76.37.200 with HTTP; Wed, 28 Oct 2015 22:55:14 -0700 (PDT)
Date: Thu, 29 Oct 2015 13:55:14 +0800
Message-ID: <CANXFt05Fop=K5EtrbmGwNj9AsKMR0qqBf9tKd1j2sXd+TBXZxA@mail.gmail.com>
From: Xen Newbie <xennewbie@gmail.com>
To: Xen Windows PV Drivers Development Mailing List
	<win-pv-devel@lists.xenproject.org>
Subject: [win-pv-devel] Signed Windows PV 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>
Content-Type: multipart/mixed; boundary="===============1519172523107760243=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

--===============1519172523107760243==
Content-Type: multipart/alternative; boundary=001a11406f5a707dcd052337f41b

--001a11406f5a707dcd052337f41b
Content-Type: text/plain; charset=UTF-8

I've asked the questions at the Xen users mailing list but nobody has
interest to offer me a help.  If the questions are too basic and should not
be raised in this devel mailing list, please forgive me.

I want to install a signed PV drivers in my HVM windows guest since I
learnt from the web that a test signed driver may lead to conflicts with
some Windows applications.

I studied a lot from the Xen project pages and Xen mailing list for users
and pv driver development. I am confused since some of the information
seems to be out-dated.

I consolidated what I learnt so far and would like to seek for help to
clarify the following conecpts before I make my next move:

1) Those signed Windows drivers resided on univention seemed to be already
out-dated.
2) Those PV drivers provided on
http://www.xenproject.org/developers/teams/windows-pv-drivers.html requires
my own compilation. The drivers compiled are test signed and requires
setting the Windows to test mode.
3) The PV drivers provided by Citrix XenServer seems to work also with Xen
Hypervisor but I'm not sure whether there is any license conflict.
4) There are Microsoft signed PV drivers provided by Oracle VM but I need
to use Oracle VM as my Domain 0 in order to use them.

Can anyone confirm my understanding as fore-mentioned?

I want to make a PC as a HTPC/NAS combo with HTPC part played by a Windows
7 (Windows 10 preferred if feasible) PV HVM guest.

I'm now stuck at the planning stage of Windows PV drivers. I don't want to
compile anything and set the Windows to test mode.

So can I just download the PV drivers from Citrix and installed to the
guest? Will it work with my Xen 4.5/4.6 Hypervisor with Ubuntu 15.04 Domain
0?

I'll be very grateful if anyone can help me.

Regards
Lok

--001a11406f5a707dcd052337f41b
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div>I&#39;ve asked the questions at the Xen users mailing=
 list but nobody has interest to offer me a help.=C2=A0 If the questions ar=
e too basic and should not be raised in this devel mailing list, please for=
give me.<br></div><div><br></div><div>I want to install a signed PV drivers=
 in my HVM windows guest since I learnt from the web that a test signed dri=
ver may lead to conflicts with some Windows applications.<br></div><div><br=
></div><div>I studied a lot from the Xen project pages and Xen mailing list=
 for users and pv driver development. I am confused since some of the infor=
mation seems to be out-dated.=C2=A0</div><div><br></div><div>I consolidated=
 what I learnt so far and would like to seek for help to clarify the follow=
ing conecpts before I make my next move:</div><div><br></div><div>1) Those =
signed Windows drivers resided on univention seemed to be already out-dated=
.</div><div>2) Those PV drivers provided on <a href=3D"http://www.xenprojec=
t.org/developers/teams/windows-pv-drivers.html">http://www.xenproject.org/d=
evelopers/teams/windows-pv-drivers.html</a> requires my own compilation. Th=
e drivers compiled are test signed and requires setting the Windows to test=
 mode.</div><div>3) The PV drivers provided by Citrix XenServer seems to wo=
rk also with Xen Hypervisor but I&#39;m not sure whether there is any licen=
se conflict.</div><div>4) There are Microsoft signed PV drivers provided by=
 Oracle VM but I need to use Oracle VM as my Domain 0 in order to use them.=
</div><div><br></div><div>Can anyone confirm my understanding as fore-menti=
oned?</div><div><br></div><div>I want to make a PC as a HTPC/NAS combo with=
 HTPC part played by a Windows 7 (Windows 10 preferred if feasible) PV HVM =
guest.</div><div><br></div><div>I&#39;m now stuck at the planning stage of =
Windows PV drivers. I don&#39;t want to compile anything and set the Window=
s to test mode.</div><div><br></div><div>So can I just download the PV driv=
ers from Citrix and installed to the guest? Will it work with my Xen 4.5/4.=
6 Hypervisor with Ubuntu 15.04 Domain 0?</div><div><br></div><div>I&#39;ll =
be very grateful if anyone can help me.</div><div><br></div><div>Regards</d=
iv><div>Lok</div></div>

--001a11406f5a707dcd052337f41b--


--===============1519172523107760243==
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
--===============1519172523107760243==--


From win-pv-devel-bounces@lists.xenproject.org Thu Oct 29 05:55:20 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 05: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 1ZrgBD-0000ll-Ep; Thu, 29 Oct 2015 05:55:19 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xennewbie@gmail.com>) id 1ZrgBC-0000ld-11
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 05:55:18 +0000
Received: from [193.109.254.147] by server-14.bemta-14.messagelabs.com id
	DE/70-04752-5C4B1365; Thu, 29 Oct 2015 05:55:17 +0000
X-Env-Sender: xennewbie@gmail.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1446098115!56377299!1
X-Originating-IP: [209.85.218.67]
X-SpamReason: No, hits=1.7 required=7.0 tests=BODY_RANDOM_LONG,
	HTML_10_20,HTML_MESSAGE,RCVD_BY_IP
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12201 invoked from network); 29 Oct 2015 05:55:16 -0000
Received: from mail-oi0-f67.google.com (HELO mail-oi0-f67.google.com)
	(209.85.218.67)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	29 Oct 2015 05:55:16 -0000
Received: by oiaw3 with SMTP id w3so1604311oia.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 28 Oct 2015 22:55:14 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=mime-version:date:message-id:subject:from:to:content-type;
	bh=Hr1oQht1+dBI6WwZaKLa8iRPUKmPoI6EYSXKiQRCEmk=;
	b=DZq+ti/MF0cDWoVKnG9foZvcf0B7RccYWAwINyTK4jcrRITXw4AhFdXGbPjQ6XKD99
	6FwrPzigywxXdA+Kt4FbanstlAfftNk2+C6xldvK/Zuzu9lutgw5tSF2PV/8AY1Cp7Qu
	wwuL5DgiqPpob5/EV5tcfZu8SGO7u6io9db/f7r8g8/ylgKA62aBu0Qr5v/yH3uQgZMy
	WprNG4/e8747YQ5WSGTsf/Pk465HGEgw/RLTDiJQG6B+m4f2W2XYcu90rLe60w50Rx9v
	N3hrwPf6rU+ULYdUkkwmp+vXGjW2YnpyzYljh4JD1cszY3VNTHhl4Jw4NjQ0J/t5GGiA
	3KtQ==
MIME-Version: 1.0
X-Received: by 10.202.231.79 with SMTP id e76mr24481541oih.129.1446098114734; 
	Wed, 28 Oct 2015 22:55:14 -0700 (PDT)
Received: by 10.76.37.200 with HTTP; Wed, 28 Oct 2015 22:55:14 -0700 (PDT)
Date: Thu, 29 Oct 2015 13:55:14 +0800
Message-ID: <CANXFt05Fop=K5EtrbmGwNj9AsKMR0qqBf9tKd1j2sXd+TBXZxA@mail.gmail.com>
From: Xen Newbie <xennewbie@gmail.com>
To: Xen Windows PV Drivers Development Mailing List
	<win-pv-devel@lists.xenproject.org>
Subject: [win-pv-devel] Signed Windows PV 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>
Content-Type: multipart/mixed; boundary="===============1519172523107760243=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

--===============1519172523107760243==
Content-Type: multipart/alternative; boundary=001a11406f5a707dcd052337f41b

--001a11406f5a707dcd052337f41b
Content-Type: text/plain; charset=UTF-8

I've asked the questions at the Xen users mailing list but nobody has
interest to offer me a help.  If the questions are too basic and should not
be raised in this devel mailing list, please forgive me.

I want to install a signed PV drivers in my HVM windows guest since I
learnt from the web that a test signed driver may lead to conflicts with
some Windows applications.

I studied a lot from the Xen project pages and Xen mailing list for users
and pv driver development. I am confused since some of the information
seems to be out-dated.

I consolidated what I learnt so far and would like to seek for help to
clarify the following conecpts before I make my next move:

1) Those signed Windows drivers resided on univention seemed to be already
out-dated.
2) Those PV drivers provided on
http://www.xenproject.org/developers/teams/windows-pv-drivers.html requires
my own compilation. The drivers compiled are test signed and requires
setting the Windows to test mode.
3) The PV drivers provided by Citrix XenServer seems to work also with Xen
Hypervisor but I'm not sure whether there is any license conflict.
4) There are Microsoft signed PV drivers provided by Oracle VM but I need
to use Oracle VM as my Domain 0 in order to use them.

Can anyone confirm my understanding as fore-mentioned?

I want to make a PC as a HTPC/NAS combo with HTPC part played by a Windows
7 (Windows 10 preferred if feasible) PV HVM guest.

I'm now stuck at the planning stage of Windows PV drivers. I don't want to
compile anything and set the Windows to test mode.

So can I just download the PV drivers from Citrix and installed to the
guest? Will it work with my Xen 4.5/4.6 Hypervisor with Ubuntu 15.04 Domain
0?

I'll be very grateful if anyone can help me.

Regards
Lok

--001a11406f5a707dcd052337f41b
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div>I&#39;ve asked the questions at the Xen users mailing=
 list but nobody has interest to offer me a help.=C2=A0 If the questions ar=
e too basic and should not be raised in this devel mailing list, please for=
give me.<br></div><div><br></div><div>I want to install a signed PV drivers=
 in my HVM windows guest since I learnt from the web that a test signed dri=
ver may lead to conflicts with some Windows applications.<br></div><div><br=
></div><div>I studied a lot from the Xen project pages and Xen mailing list=
 for users and pv driver development. I am confused since some of the infor=
mation seems to be out-dated.=C2=A0</div><div><br></div><div>I consolidated=
 what I learnt so far and would like to seek for help to clarify the follow=
ing conecpts before I make my next move:</div><div><br></div><div>1) Those =
signed Windows drivers resided on univention seemed to be already out-dated=
.</div><div>2) Those PV drivers provided on <a href=3D"http://www.xenprojec=
t.org/developers/teams/windows-pv-drivers.html">http://www.xenproject.org/d=
evelopers/teams/windows-pv-drivers.html</a> requires my own compilation. Th=
e drivers compiled are test signed and requires setting the Windows to test=
 mode.</div><div>3) The PV drivers provided by Citrix XenServer seems to wo=
rk also with Xen Hypervisor but I&#39;m not sure whether there is any licen=
se conflict.</div><div>4) There are Microsoft signed PV drivers provided by=
 Oracle VM but I need to use Oracle VM as my Domain 0 in order to use them.=
</div><div><br></div><div>Can anyone confirm my understanding as fore-menti=
oned?</div><div><br></div><div>I want to make a PC as a HTPC/NAS combo with=
 HTPC part played by a Windows 7 (Windows 10 preferred if feasible) PV HVM =
guest.</div><div><br></div><div>I&#39;m now stuck at the planning stage of =
Windows PV drivers. I don&#39;t want to compile anything and set the Window=
s to test mode.</div><div><br></div><div>So can I just download the PV driv=
ers from Citrix and installed to the guest? Will it work with my Xen 4.5/4.=
6 Hypervisor with Ubuntu 15.04 Domain 0?</div><div><br></div><div>I&#39;ll =
be very grateful if anyone can help me.</div><div><br></div><div>Regards</d=
iv><div>Lok</div></div>

--001a11406f5a707dcd052337f41b--


--===============1519172523107760243==
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
--===============1519172523107760243==--


From win-pv-devel-bounces@lists.xenproject.org Thu Oct 29 08:52:39 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 08:52: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 1Zriwo-0006Bb-1b; Thu, 29 Oct 2015 08:52:38 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=73749d786=ben.chalmers@citrix.com>)
	id 1Zriwm-0006BW-95
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 08:52:36 +0000
Received: from [85.158.139.211] by server-4.bemta-5.messagelabs.com id
	69/90-24856-35ED1365; Thu, 29 Oct 2015 08:52:35 +0000
X-Env-Sender: prvs=73749d786=ben.chalmers@citrix.com
X-Msg-Ref: server-9.tower-206.messagelabs.com!1446108754!46002805!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.8 required=7.0 tests=BODY_RANDOM_LONG,
	HTML_60_70,HTML_MESSAGE,received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1049 invoked from network); 29 Oct 2015 08:52:34 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-9.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	29 Oct 2015 08:52:34 -0000
X-IronPort-AV: E=Sophos;i="5.20,213,1444694400"; d="scan'208,217";a="6439240"
From: Ben Chalmers <ben.chalmers@citrix.com>
To: Xen Newbie <xennewbie@gmail.com>, "Xen Windows PV Drivers Development
	Mailing List" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Signed Windows PV Driver
Thread-Index: AdESJx6BXZ+56YxPxUenI+PSTWAa4w==
Content-Class: urn:content-classes:message
Date: Thu, 29 Oct 2015 08:52:19 +0000
Message-ID: <1AD33E34BA5E3649B4F6C7FE476686F4211C6848@AMSPEX01CL03.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-GB
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Signed Windows PV 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>
Content-Type: multipart/mixed; boundary="===============7305199458872669132=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

--===============7305199458872669132==
Content-Class: urn:content-classes:message
Content-Language: en-GB
Content-Type: multipart/alternative;
	boundary="_000_1AD33E34BA5E3649B4F6C7FE476686F4211C6848AMSPEX01CL03cit_"

--_000_1AD33E34BA5E3649B4F6C7FE476686F4211C6848AMSPEX01CL03cit_
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

VGhvc2Ugc3RhdGVtZW50cyBhcmUgY29ycmVjdC4NCg0KDQoNClRoZSBkcml2ZXJzIHByb3ZpZGVk
IGJ5IENpdHJpeCBYZW5TZXJ2ZXIgYXJlIGZyb20gdGhlIHNhbWUgY29kZSBiYXNlIGFzIHRoZSBY
ZW4gcHJvamVjdCBQViBkcml2ZXJzIOKAkyBidXQgYXJlIGN1cnJlbnRseSBvbGRlciAoYW5kIHRh
a2VuIGZyb20gYSBwb2ludCBiZWZvcmUgdGhlIGRyaXZlcnMgd2VyZSBoYW5kZWQgb3ZlciBmcm9t
IHRoZSBYZW5TZXJ2ZXIgcHJvamVjdCB0byB0aGUgWGVuIHByb2plY3QpLiAgVGhvc2UgZHJpdmVy
cyBoYXZlIEJTRCBsaWNlbnNlZCBzb3VyY2UgY29kZSAoYXMgZG8gdGhlIFhlbiBwcm9qZWN0IGRy
aXZlcnMpIHNvIHRoZXJlIHNob3VsZG7igJl0IGJlIGEgY29uZmxpY3QgKGJ1dCBkb27igJl0IHRy
dXN0IG1lIOKAkyBJ4oCZbSBub3QgYSBsYXd5ZXIgYW5kIG5vdCBzcGVha2luZyBmb3IgQ2l0cml4
IGhlcmUpDQoNCg0KDQpJIHdvdWxkIGV4cGVjdCB0aGUgQ2l0cml4IGRyaXZlcnMgdG8gd29yayB3
aXRoIFhlbiAoYnV0IG5vIHByb21pc2VzLCBZTU1WISkuICBBbmQgZ29pbmcgZm9yd2FyZHMgKGFz
IENpdHJpeCBQViBkcml2ZXJzIGFyZSBpbmNyZWFzaW5nbHkgYnVpbHQgZnJvbSBYZW4gcHJvamVj
dCByYXRoZXIgdGhlbiB0aGUgWGVuU2VydmVyIHByb2plY3QgY29kZSkgdGhpcyB3aWxsIGJlIG1v
cmUgYW5kIG1vcmUgbGlrZWx5Lg0KDQoNCg0KKGluY2lkZW50YWxseSwgaWYgeW91IGhhdmUgYSBj
b2RlIHNpZ25pbmcgY2VydCB3aXRoIGEgY2hhaW4gb2YgdHJ1c3QgYmFjayB0byBhIHJvb3QgcHJv
dmlkZXIsIHlvdSBjYW4gc2lnbiBhbnkgZHJpdmVycyB5b3UgYnVpbGQg4oCTIGFuZCB0aGVuIGlu
c3RhbGwgdGhvc2UgY2VydGlmaWNhdGVzIGludG8gV2luZG93cyDigJMgYXZvaWRpbmcgd29ycnlp
bmcgYWJvdXQgbmVlZGluZyB0byB0dXJuIHRlc3Qgc2lnbmluZyBvbi4gIE5vdCBzdXJlIGlmIHRo
YXQgaGVscHMpDQoNCg0KDQpCZW4gQ2hhbG1lcnMNCg0KDQoNCg0KDQpGcm9tOiBYZW4gTmV3Ymll
DQpTZW50OiAyOSBPY3RvYmVyIDIwMTUgMDU6NTUNClRvOiBYZW4gV2luZG93cyBQViBEcml2ZXJz
IERldmVsb3BtZW50IE1haWxpbmcgTGlzdA0KU3ViamVjdDogW3dpbi1wdi1kZXZlbF0gU2lnbmVk
IFdpbmRvd3MgUFYgRHJpdmVyDQoNCg0KSSd2ZSBhc2tlZCB0aGUgcXVlc3Rpb25zIGF0IHRoZSBY
ZW4gdXNlcnMgbWFpbGluZyBsaXN0IGJ1dCBub2JvZHkgaGFzIGludGVyZXN0IHRvIG9mZmVyIG1l
IGEgaGVscC4gIElmIHRoZSBxdWVzdGlvbnMgYXJlIHRvbyBiYXNpYyBhbmQgc2hvdWxkIG5vdCBi
ZSByYWlzZWQgaW4gdGhpcyBkZXZlbCBtYWlsaW5nIGxpc3QsIHBsZWFzZSBmb3JnaXZlIG1lLg0K
DQpJIHdhbnQgdG8gaW5zdGFsbCBhIHNpZ25lZCBQViBkcml2ZXJzIGluIG15IEhWTSB3aW5kb3dz
IGd1ZXN0IHNpbmNlIEkgbGVhcm50IGZyb20gdGhlIHdlYiB0aGF0IGEgdGVzdCBzaWduZWQgZHJp
dmVyIG1heSBsZWFkIHRvIGNvbmZsaWN0cyB3aXRoIHNvbWUgV2luZG93cyBhcHBsaWNhdGlvbnMu
DQoNCkkgc3R1ZGllZCBhIGxvdCBmcm9tIHRoZSBYZW4gcHJvamVjdCBwYWdlcyBhbmQgWGVuIG1h
aWxpbmcgbGlzdCBmb3IgdXNlcnMgYW5kIHB2IGRyaXZlciBkZXZlbG9wbWVudC4gSSBhbSBjb25m
dXNlZCBzaW5jZSBzb21lIG9mIHRoZSBpbmZvcm1hdGlvbiBzZWVtcyB0byBiZSBvdXQtZGF0ZWQu
DQoNCkkgY29uc29saWRhdGVkIHdoYXQgSSBsZWFybnQgc28gZmFyIGFuZCB3b3VsZCBsaWtlIHRv
IHNlZWsgZm9yIGhlbHAgdG8gY2xhcmlmeSB0aGUgZm9sbG93aW5nIGNvbmVjcHRzIGJlZm9yZSBJ
IG1ha2UgbXkgbmV4dCBtb3ZlOg0KDQoxKSBUaG9zZSBzaWduZWQgV2luZG93cyBkcml2ZXJzIHJl
c2lkZWQgb24gdW5pdmVudGlvbiBzZWVtZWQgdG8gYmUgYWxyZWFkeSBvdXQtZGF0ZWQuDQoyKSBU
aG9zZSBQViBkcml2ZXJzIHByb3ZpZGVkIG9uIGh0dHA6Ly93d3cueGVucHJvamVjdC5vcmcvZGV2
ZWxvcGVycy90ZWFtcy93aW5kb3dzLXB2LWRyaXZlcnMuaHRtbCByZXF1aXJlcyBteSBvd24gY29t
cGlsYXRpb24uIFRoZSBkcml2ZXJzIGNvbXBpbGVkIGFyZSB0ZXN0IHNpZ25lZCBhbmQgcmVxdWly
ZXMgc2V0dGluZyB0aGUgV2luZG93cyB0byB0ZXN0IG1vZGUuDQozKSBUaGUgUFYgZHJpdmVycyBw
cm92aWRlZCBieSBDaXRyaXggWGVuU2VydmVyIHNlZW1zIHRvIHdvcmsgYWxzbyB3aXRoIFhlbiBI
eXBlcnZpc29yIGJ1dCBJJ20gbm90IHN1cmUgd2hldGhlciB0aGVyZSBpcyBhbnkgbGljZW5zZSBj
b25mbGljdC4NCjQpIFRoZXJlIGFyZSBNaWNyb3NvZnQgc2lnbmVkIFBWIGRyaXZlcnMgcHJvdmlk
ZWQgYnkgT3JhY2xlIFZNIGJ1dCBJIG5lZWQgdG8gdXNlIE9yYWNsZSBWTSBhcyBteSBEb21haW4g
MCBpbiBvcmRlciB0byB1c2UgdGhlbS4NCg0KQ2FuIGFueW9uZSBjb25maXJtIG15IHVuZGVyc3Rh
bmRpbmcgYXMgZm9yZS1tZW50aW9uZWQ/DQoNCkkgd2FudCB0byBtYWtlIGEgUEMgYXMgYSBIVFBD
L05BUyBjb21ibyB3aXRoIEhUUEMgcGFydCBwbGF5ZWQgYnkgYSBXaW5kb3dzIDcgKFdpbmRvd3Mg
MTAgcHJlZmVycmVkIGlmIGZlYXNpYmxlKSBQViBIVk0gZ3Vlc3QuDQoNCkknbSBub3cgc3R1Y2sg
YXQgdGhlIHBsYW5uaW5nIHN0YWdlIG9mIFdpbmRvd3MgUFYgZHJpdmVycy4gSSBkb24ndCB3YW50
IHRvIGNvbXBpbGUgYW55dGhpbmcgYW5kIHNldCB0aGUgV2luZG93cyB0byB0ZXN0IG1vZGUuDQoN
ClNvIGNhbiBJIGp1c3QgZG93bmxvYWQgdGhlIFBWIGRyaXZlcnMgZnJvbSBDaXRyaXggYW5kIGlu
c3RhbGxlZCB0byB0aGUgZ3Vlc3Q/IFdpbGwgaXQgd29yayB3aXRoIG15IFhlbiA0LjUvNC42IEh5
cGVydmlzb3Igd2l0aCBVYnVudHUgMTUuMDQgRG9tYWluIDA/DQoNCkknbGwgYmUgdmVyeSBncmF0
ZWZ1bCBpZiBhbnlvbmUgY2FuIGhlbHAgbWUuDQoNClJlZ2FyZHMNCkxvaw0KDQoNCg==

--_000_1AD33E34BA5E3649B4F6C7FE476686F4211C6848AMSPEX01CL03cit_
Content-Type: text/html; charset="utf-8"
Content-ID: <2228D6FC3D48CD40900B0AB5F6816A7E@citrix.com>
Content-Transfer-Encoding: base64

PGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIiB4
bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIiB4bWxuczptPSJo
dHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA0LzEyL29tbWwiIHhtbG5zPSJo
dHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4NCjxoZWFkPg0KPG1ldGEgaHR0cC1lcXVp
dj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KPG1l
dGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJNaWNyb3NvZnQgV29yZCAxNSAoZmlsdGVyZWQg
bWVkaXVtKSI+DQo8c3R5bGU+PCEtLQ0KLyogRm9udCBEZWZpbml0aW9ucyAqLw0KQGZvbnQtZmFj
ZQ0KCXtmb250LWZhbWlseToiQ2FtYnJpYSBNYXRoIjsNCglwYW5vc2UtMToyIDQgNSAzIDUgNCA2
IDMgMiA0O30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6Q2FsaWJyaTsNCglwYW5vc2UtMToy
IDE1IDUgMiAyIDIgNCAzIDIgNDt9DQovKiBTdHlsZSBEZWZpbml0aW9ucyAqLw0KcC5Nc29Ob3Jt
YWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbA0KCXttYXJnaW46MGNtOw0KCW1hcmdpbi1i
b3R0b206LjAwMDFwdDsNCglmb250LXNpemU6MTEuMHB0Ow0KCWZvbnQtZmFtaWx5OiJDYWxpYnJp
IixzYW5zLXNlcmlmO30NCmE6bGluaywgc3Bhbi5Nc29IeXBlcmxpbmsNCgl7bXNvLXN0eWxlLXBy
aW9yaXR5Ojk5Ow0KCWNvbG9yOmJsdWU7DQoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9DQph
OnZpc2l0ZWQsIHNwYW4uTXNvSHlwZXJsaW5rRm9sbG93ZWQNCgl7bXNvLXN0eWxlLXByaW9yaXR5
Ojk5Ow0KCWNvbG9yOiM5NTRGNzI7DQoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9DQpwDQoJ
e21zby1zdHlsZS1wcmlvcml0eTo5OTsNCgltYXJnaW46MGNtOw0KCW1hcmdpbi1ib3R0b206LjAw
MDFwdDsNCglmb250LXNpemU6MTEuMHB0Ow0KCWZvbnQtZmFtaWx5OiJDYWxpYnJpIixzYW5zLXNl
cmlmO30NCi5Nc29DaHBEZWZhdWx0DQoJe21zby1zdHlsZS10eXBlOmV4cG9ydC1vbmx5O30NCkBw
YWdlIFdvcmRTZWN0aW9uMQ0KCXtzaXplOjYxMi4wcHQgNzkyLjBwdDsNCgltYXJnaW46NzIuMHB0
IDcyLjBwdCA3Mi4wcHQgNzIuMHB0O30NCmRpdi5Xb3JkU2VjdGlvbjENCgl7cGFnZTpXb3JkU2Vj
dGlvbjE7fQ0KLS0+PC9zdHlsZT4NCjwvaGVhZD4NCjxib2R5IGxhbmc9IkVOLUdCIiBsaW5rPSJi
bHVlIiB2bGluaz0iIzk1NEY3MiI+DQo8ZGl2IGNsYXNzPSJXb3JkU2VjdGlvbjEiPg0KPHA+VGhv
c2Ugc3RhdGVtZW50cyBhcmUgY29ycmVjdC48L3A+DQo8cD48bzpwPiZuYnNwOzwvbzpwPjwvcD4N
CjxwPlRoZSBkcml2ZXJzIHByb3ZpZGVkIGJ5IENpdHJpeCBYZW5TZXJ2ZXIgYXJlIGZyb20gdGhl
IHNhbWUgY29kZSBiYXNlIGFzIHRoZSBYZW4gcHJvamVjdCBQViBkcml2ZXJzIOKAkyBidXQgYXJl
IGN1cnJlbnRseSBvbGRlciAoYW5kIHRha2VuIGZyb20gYSBwb2ludCBiZWZvcmUgdGhlIGRyaXZl
cnMgd2VyZSBoYW5kZWQgb3ZlciBmcm9tIHRoZSBYZW5TZXJ2ZXIgcHJvamVjdCB0byB0aGUgWGVu
IHByb2plY3QpLiAmbmJzcDtUaG9zZSBkcml2ZXJzIGhhdmUgQlNEDQogbGljZW5zZWQgc291cmNl
IGNvZGUgKGFzIGRvIHRoZSBYZW4gcHJvamVjdCBkcml2ZXJzKSBzbyB0aGVyZSBzaG91bGRu4oCZ
dCBiZSBhIGNvbmZsaWN0IChidXQgZG9u4oCZdCB0cnVzdCBtZSDigJMgSeKAmW0gbm90IGEgbGF3
eWVyIGFuZCBub3Qgc3BlYWtpbmcgZm9yIENpdHJpeCBoZXJlKTwvcD4NCjxwPjxvOnA+Jm5ic3A7
PC9vOnA+PC9wPg0KPHA+SSB3b3VsZCBleHBlY3QgdGhlIENpdHJpeCBkcml2ZXJzIHRvIHdvcmsg
d2l0aCBYZW4gKGJ1dCBubyBwcm9taXNlcywgWU1NViEpLiZuYnNwOyBBbmQgZ29pbmcgZm9yd2Fy
ZHMgKGFzIENpdHJpeCBQViBkcml2ZXJzIGFyZSBpbmNyZWFzaW5nbHkgYnVpbHQgZnJvbSBYZW4g
cHJvamVjdCByYXRoZXIgdGhlbiB0aGUgWGVuU2VydmVyIHByb2plY3QgY29kZSkgdGhpcyB3aWxs
IGJlIG1vcmUgYW5kIG1vcmUgbGlrZWx5LjwvcD4NCjxwPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0K
PHA+KGluY2lkZW50YWxseSwgaWYgeW91IGhhdmUgYSBjb2RlIHNpZ25pbmcgY2VydCB3aXRoIGEg
Y2hhaW4gb2YgdHJ1c3QgYmFjayB0byBhIHJvb3QgcHJvdmlkZXIsIHlvdSBjYW4gc2lnbiBhbnkg
ZHJpdmVycyB5b3UgYnVpbGQg4oCTIGFuZCB0aGVuIGluc3RhbGwgdGhvc2UgY2VydGlmaWNhdGVz
IGludG8gV2luZG93cyDigJMgYXZvaWRpbmcgd29ycnlpbmcgYWJvdXQgbmVlZGluZyB0byB0dXJu
IHRlc3Qgc2lnbmluZyBvbi4mbmJzcDsgTm90IHN1cmUgaWYgdGhhdA0KIGhlbHBzKTwvcD4NCjxw
PjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHA+QmVuIENoYWxtZXJzPC9wPg0KPHA+PG86cD4mbmJz
cDs8L286cD48L3A+DQo8cD48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxkaXYgc3R5bGU9Im1zby1l
bGVtZW50OnBhcmEtYm9yZGVyLWRpdjtib3JkZXI6bm9uZTtib3JkZXItdG9wOnNvbGlkICNFMUUx
RTEgMS4wcHQ7cGFkZGluZzozLjBwdCAwY20gMGNtIDBjbSI+DQo8cCBzdHlsZT0iYm9yZGVyOm5v
bmU7cGFkZGluZzowY20iPjxicj4NCjxiPkZyb206IDwvYj5YZW4gTmV3YmllPGJyPg0KPGI+U2Vu
dDogPC9iPjI5IE9jdG9iZXIgMjAxNSAwNTo1NTxicj4NCjxiPlRvOiA8L2I+WGVuIFdpbmRvd3Mg
UFYgRHJpdmVycyBEZXZlbG9wbWVudCBNYWlsaW5nIExpc3Q8YnI+DQo8Yj5TdWJqZWN0OiA8L2I+
W3dpbi1wdi1kZXZlbF0gU2lnbmVkIFdpbmRvd3MgUFYgRHJpdmVyPC9wPg0KPC9kaXY+DQo8cCBj
bGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3Jt
YWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDss
c2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi
PjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5l
dyBSb21hbiZxdW90OyxzZXJpZiI+SSd2ZSBhc2tlZCB0aGUgcXVlc3Rpb25zIGF0IHRoZSBYZW4g
dXNlcnMgbWFpbGluZyBsaXN0IGJ1dCBub2JvZHkgaGFzIGludGVyZXN0IHRvIG9mZmVyIG1lIGEg
aGVscC4mbmJzcDsgSWYgdGhlIHF1ZXN0aW9ucyBhcmUgdG9vIGJhc2ljIGFuZCBzaG91bGQgbm90
IGJlIHJhaXNlZCBpbiB0aGlzIGRldmVsDQogbWFpbGluZyBsaXN0LCBwbGVhc2UgZm9yZ2l2ZSBt
ZS48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7
VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8ZGl2
Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7Zm9u
dC1mYW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj48bzpwPiZuYnNwOzwv
bzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3Bh
biBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9t
YW4mcXVvdDssc2VyaWYiPkkgd2FudCB0byBpbnN0YWxsIGEgc2lnbmVkIFBWIGRyaXZlcnMgaW4g
bXkgSFZNIHdpbmRvd3MgZ3Vlc3Qgc2luY2UgSSBsZWFybnQgZnJvbSB0aGUgd2ViIHRoYXQgYSB0
ZXN0IHNpZ25lZCBkcml2ZXIgbWF5IGxlYWQgdG8gY29uZmxpY3RzIHdpdGggc29tZSBXaW5kb3dz
IGFwcGxpY2F0aW9ucy48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBj
bGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWls
eTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9z
cGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxl
PSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90
OyxzZXJpZiI+SSBzdHVkaWVkIGEgbG90IGZyb20gdGhlIFhlbiBwcm9qZWN0IHBhZ2VzIGFuZCBY
ZW4gbWFpbGluZyBsaXN0IGZvciB1c2VycyBhbmQgcHYgZHJpdmVyIGRldmVsb3BtZW50LiBJIGFt
IGNvbmZ1c2VkIHNpbmNlIHNvbWUgb2YgdGhlIGluZm9ybWF0aW9uIHNlZW1zIHRvIGJlIG91dC1k
YXRlZC4mbmJzcDs8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFz
cz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTom
cXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFu
PjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJm
b250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90Oyxz
ZXJpZiI+SSBjb25zb2xpZGF0ZWQgd2hhdCBJIGxlYXJudCBzbyBmYXIgYW5kIHdvdWxkIGxpa2Ug
dG8gc2VlayBmb3IgaGVscCB0byBjbGFyaWZ5IHRoZSBmb2xsb3dpbmcgY29uZWNwdHMgYmVmb3Jl
IEkgbWFrZSBteSBuZXh0IG1vdmU6PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2
Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7Zm9u
dC1mYW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj48bzpwPiZuYnNwOzwv
bzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3Bh
biBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9t
YW4mcXVvdDssc2VyaWYiPjEpIFRob3NlIHNpZ25lZCBXaW5kb3dzIGRyaXZlcnMgcmVzaWRlZCBv
biB1bml2ZW50aW9uIHNlZW1lZCB0byBiZSBhbHJlYWR5IG91dC1kYXRlZC48bzpwPjwvbzpwPjwv
c3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHls
ZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVv
dDssc2VyaWYiPjIpIFRob3NlIFBWIGRyaXZlcnMgcHJvdmlkZWQgb24NCjxhIGhyZWY9Imh0dHA6
Ly93d3cueGVucHJvamVjdC5vcmcvZGV2ZWxvcGVycy90ZWFtcy93aW5kb3dzLXB2LWRyaXZlcnMu
aHRtbCIgdGFyZ2V0PSJfQkxBTksiPg0KaHR0cDovL3d3dy54ZW5wcm9qZWN0Lm9yZy9kZXZlbG9w
ZXJzL3RlYW1zL3dpbmRvd3MtcHYtZHJpdmVycy5odG1sPC9hPiByZXF1aXJlcyBteSBvd24gY29t
cGlsYXRpb24uIFRoZSBkcml2ZXJzIGNvbXBpbGVkIGFyZSB0ZXN0IHNpZ25lZCBhbmQgcmVxdWly
ZXMgc2V0dGluZyB0aGUgV2luZG93cyB0byB0ZXN0IG1vZGUuPG86cD48L286cD48L3NwYW4+PC9w
Pg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQt
c2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlm
Ij4zKSBUaGUgUFYgZHJpdmVycyBwcm92aWRlZCBieSBDaXRyaXggWGVuU2VydmVyIHNlZW1zIHRv
IHdvcmsgYWxzbyB3aXRoIFhlbiBIeXBlcnZpc29yIGJ1dCBJJ20gbm90IHN1cmUgd2hldGhlciB0
aGVyZSBpcyBhbnkgbGljZW5zZSBjb25mbGljdC48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rp
dj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEy
LjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPjQpIFRo
ZXJlIGFyZSBNaWNyb3NvZnQgc2lnbmVkIFBWIGRyaXZlcnMgcHJvdmlkZWQgYnkgT3JhY2xlIFZN
IGJ1dCBJIG5lZWQgdG8gdXNlIE9yYWNsZSBWTSBhcyBteSBEb21haW4gMCBpbiBvcmRlciB0byB1
c2UgdGhlbS48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0i
TXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVv
dDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwv
cD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250
LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJp
ZiI+Q2FuIGFueW9uZSBjb25maXJtIG15IHVuZGVyc3RhbmRpbmcgYXMgZm9yZS1tZW50aW9uZWQ/
PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1h
bCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7VGltZXMg
TmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rp
dj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEy
LjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPkkgd2Fu
dCB0byBtYWtlIGEgUEMgYXMgYSBIVFBDL05BUyBjb21ibyB3aXRoIEhUUEMgcGFydCBwbGF5ZWQg
YnkgYSBXaW5kb3dzIDcgKFdpbmRvd3MgMTAgcHJlZmVycmVkIGlmIGZlYXNpYmxlKSBQViBIVk0g
Z3Vlc3QuPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1z
b05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7
VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+
DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1z
aXplOjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYi
PkknbSBub3cgc3R1Y2sgYXQgdGhlIHBsYW5uaW5nIHN0YWdlIG9mIFdpbmRvd3MgUFYgZHJpdmVy
cy4gSSBkb24ndCB3YW50IHRvIGNvbXBpbGUgYW55dGhpbmcgYW5kIHNldCB0aGUgV2luZG93cyB0
byB0ZXN0IG1vZGUuPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xh
c3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6
JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bh
bj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0i
Zm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDss
c2VyaWYiPlNvIGNhbiBJIGp1c3QgZG93bmxvYWQgdGhlIFBWIGRyaXZlcnMgZnJvbSBDaXRyaXgg
YW5kIGluc3RhbGxlZCB0byB0aGUgZ3Vlc3Q/IFdpbGwgaXQgd29yayB3aXRoIG15IFhlbiA0LjUv
NC42IEh5cGVydmlzb3Igd2l0aCBVYnVudHUgMTUuMDQgRG9tYWluIDA/PG86cD48L286cD48L3Nw
YW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9
ImZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7
LHNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBj
bGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWls
eTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPkknbGwgYmUgdmVyeSBncmF0ZWZ1
bCBpZiBhbnlvbmUgY2FuIGhlbHAgbWUuPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8
ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7
Zm9udC1mYW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj48bzpwPiZuYnNw
OzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48
c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcg
Um9tYW4mcXVvdDssc2VyaWYiPlJlZ2FyZHM8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4N
CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQt
ZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZiI+TG9rPG86cD48L286cD48
L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8L286cD48L3A+DQo8
cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjwvZGl2Pg0KPC9ib2R5
Pg0KPC9odG1sPg0K

--_000_1AD33E34BA5E3649B4F6C7FE476686F4211C6848AMSPEX01CL03cit_--


--===============7305199458872669132==
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
--===============7305199458872669132==--


From win-pv-devel-bounces@lists.xenproject.org Thu Oct 29 08:52:39 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 08:52: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 1Zriwo-0006Bb-1b; Thu, 29 Oct 2015 08:52:38 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=73749d786=ben.chalmers@citrix.com>)
	id 1Zriwm-0006BW-95
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 08:52:36 +0000
Received: from [85.158.139.211] by server-4.bemta-5.messagelabs.com id
	69/90-24856-35ED1365; Thu, 29 Oct 2015 08:52:35 +0000
X-Env-Sender: prvs=73749d786=ben.chalmers@citrix.com
X-Msg-Ref: server-9.tower-206.messagelabs.com!1446108754!46002805!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.8 required=7.0 tests=BODY_RANDOM_LONG,
	HTML_60_70,HTML_MESSAGE,received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1049 invoked from network); 29 Oct 2015 08:52:34 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-9.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	29 Oct 2015 08:52:34 -0000
X-IronPort-AV: E=Sophos;i="5.20,213,1444694400"; d="scan'208,217";a="6439240"
From: Ben Chalmers <ben.chalmers@citrix.com>
To: Xen Newbie <xennewbie@gmail.com>, "Xen Windows PV Drivers Development
	Mailing List" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Signed Windows PV Driver
Thread-Index: AdESJx6BXZ+56YxPxUenI+PSTWAa4w==
Content-Class: urn:content-classes:message
Date: Thu, 29 Oct 2015 08:52:19 +0000
Message-ID: <1AD33E34BA5E3649B4F6C7FE476686F4211C6848@AMSPEX01CL03.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-GB
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Signed Windows PV 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>
Content-Type: multipart/mixed; boundary="===============7305199458872669132=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

--===============7305199458872669132==
Content-Class: urn:content-classes:message
Content-Language: en-GB
Content-Type: multipart/alternative;
	boundary="_000_1AD33E34BA5E3649B4F6C7FE476686F4211C6848AMSPEX01CL03cit_"

--_000_1AD33E34BA5E3649B4F6C7FE476686F4211C6848AMSPEX01CL03cit_
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

VGhvc2Ugc3RhdGVtZW50cyBhcmUgY29ycmVjdC4NCg0KDQoNClRoZSBkcml2ZXJzIHByb3ZpZGVk
IGJ5IENpdHJpeCBYZW5TZXJ2ZXIgYXJlIGZyb20gdGhlIHNhbWUgY29kZSBiYXNlIGFzIHRoZSBY
ZW4gcHJvamVjdCBQViBkcml2ZXJzIOKAkyBidXQgYXJlIGN1cnJlbnRseSBvbGRlciAoYW5kIHRh
a2VuIGZyb20gYSBwb2ludCBiZWZvcmUgdGhlIGRyaXZlcnMgd2VyZSBoYW5kZWQgb3ZlciBmcm9t
IHRoZSBYZW5TZXJ2ZXIgcHJvamVjdCB0byB0aGUgWGVuIHByb2plY3QpLiAgVGhvc2UgZHJpdmVy
cyBoYXZlIEJTRCBsaWNlbnNlZCBzb3VyY2UgY29kZSAoYXMgZG8gdGhlIFhlbiBwcm9qZWN0IGRy
aXZlcnMpIHNvIHRoZXJlIHNob3VsZG7igJl0IGJlIGEgY29uZmxpY3QgKGJ1dCBkb27igJl0IHRy
dXN0IG1lIOKAkyBJ4oCZbSBub3QgYSBsYXd5ZXIgYW5kIG5vdCBzcGVha2luZyBmb3IgQ2l0cml4
IGhlcmUpDQoNCg0KDQpJIHdvdWxkIGV4cGVjdCB0aGUgQ2l0cml4IGRyaXZlcnMgdG8gd29yayB3
aXRoIFhlbiAoYnV0IG5vIHByb21pc2VzLCBZTU1WISkuICBBbmQgZ29pbmcgZm9yd2FyZHMgKGFz
IENpdHJpeCBQViBkcml2ZXJzIGFyZSBpbmNyZWFzaW5nbHkgYnVpbHQgZnJvbSBYZW4gcHJvamVj
dCByYXRoZXIgdGhlbiB0aGUgWGVuU2VydmVyIHByb2plY3QgY29kZSkgdGhpcyB3aWxsIGJlIG1v
cmUgYW5kIG1vcmUgbGlrZWx5Lg0KDQoNCg0KKGluY2lkZW50YWxseSwgaWYgeW91IGhhdmUgYSBj
b2RlIHNpZ25pbmcgY2VydCB3aXRoIGEgY2hhaW4gb2YgdHJ1c3QgYmFjayB0byBhIHJvb3QgcHJv
dmlkZXIsIHlvdSBjYW4gc2lnbiBhbnkgZHJpdmVycyB5b3UgYnVpbGQg4oCTIGFuZCB0aGVuIGlu
c3RhbGwgdGhvc2UgY2VydGlmaWNhdGVzIGludG8gV2luZG93cyDigJMgYXZvaWRpbmcgd29ycnlp
bmcgYWJvdXQgbmVlZGluZyB0byB0dXJuIHRlc3Qgc2lnbmluZyBvbi4gIE5vdCBzdXJlIGlmIHRo
YXQgaGVscHMpDQoNCg0KDQpCZW4gQ2hhbG1lcnMNCg0KDQoNCg0KDQpGcm9tOiBYZW4gTmV3Ymll
DQpTZW50OiAyOSBPY3RvYmVyIDIwMTUgMDU6NTUNClRvOiBYZW4gV2luZG93cyBQViBEcml2ZXJz
IERldmVsb3BtZW50IE1haWxpbmcgTGlzdA0KU3ViamVjdDogW3dpbi1wdi1kZXZlbF0gU2lnbmVk
IFdpbmRvd3MgUFYgRHJpdmVyDQoNCg0KSSd2ZSBhc2tlZCB0aGUgcXVlc3Rpb25zIGF0IHRoZSBY
ZW4gdXNlcnMgbWFpbGluZyBsaXN0IGJ1dCBub2JvZHkgaGFzIGludGVyZXN0IHRvIG9mZmVyIG1l
IGEgaGVscC4gIElmIHRoZSBxdWVzdGlvbnMgYXJlIHRvbyBiYXNpYyBhbmQgc2hvdWxkIG5vdCBi
ZSByYWlzZWQgaW4gdGhpcyBkZXZlbCBtYWlsaW5nIGxpc3QsIHBsZWFzZSBmb3JnaXZlIG1lLg0K
DQpJIHdhbnQgdG8gaW5zdGFsbCBhIHNpZ25lZCBQViBkcml2ZXJzIGluIG15IEhWTSB3aW5kb3dz
IGd1ZXN0IHNpbmNlIEkgbGVhcm50IGZyb20gdGhlIHdlYiB0aGF0IGEgdGVzdCBzaWduZWQgZHJp
dmVyIG1heSBsZWFkIHRvIGNvbmZsaWN0cyB3aXRoIHNvbWUgV2luZG93cyBhcHBsaWNhdGlvbnMu
DQoNCkkgc3R1ZGllZCBhIGxvdCBmcm9tIHRoZSBYZW4gcHJvamVjdCBwYWdlcyBhbmQgWGVuIG1h
aWxpbmcgbGlzdCBmb3IgdXNlcnMgYW5kIHB2IGRyaXZlciBkZXZlbG9wbWVudC4gSSBhbSBjb25m
dXNlZCBzaW5jZSBzb21lIG9mIHRoZSBpbmZvcm1hdGlvbiBzZWVtcyB0byBiZSBvdXQtZGF0ZWQu
DQoNCkkgY29uc29saWRhdGVkIHdoYXQgSSBsZWFybnQgc28gZmFyIGFuZCB3b3VsZCBsaWtlIHRv
IHNlZWsgZm9yIGhlbHAgdG8gY2xhcmlmeSB0aGUgZm9sbG93aW5nIGNvbmVjcHRzIGJlZm9yZSBJ
IG1ha2UgbXkgbmV4dCBtb3ZlOg0KDQoxKSBUaG9zZSBzaWduZWQgV2luZG93cyBkcml2ZXJzIHJl
c2lkZWQgb24gdW5pdmVudGlvbiBzZWVtZWQgdG8gYmUgYWxyZWFkeSBvdXQtZGF0ZWQuDQoyKSBU
aG9zZSBQViBkcml2ZXJzIHByb3ZpZGVkIG9uIGh0dHA6Ly93d3cueGVucHJvamVjdC5vcmcvZGV2
ZWxvcGVycy90ZWFtcy93aW5kb3dzLXB2LWRyaXZlcnMuaHRtbCByZXF1aXJlcyBteSBvd24gY29t
cGlsYXRpb24uIFRoZSBkcml2ZXJzIGNvbXBpbGVkIGFyZSB0ZXN0IHNpZ25lZCBhbmQgcmVxdWly
ZXMgc2V0dGluZyB0aGUgV2luZG93cyB0byB0ZXN0IG1vZGUuDQozKSBUaGUgUFYgZHJpdmVycyBw
cm92aWRlZCBieSBDaXRyaXggWGVuU2VydmVyIHNlZW1zIHRvIHdvcmsgYWxzbyB3aXRoIFhlbiBI
eXBlcnZpc29yIGJ1dCBJJ20gbm90IHN1cmUgd2hldGhlciB0aGVyZSBpcyBhbnkgbGljZW5zZSBj
b25mbGljdC4NCjQpIFRoZXJlIGFyZSBNaWNyb3NvZnQgc2lnbmVkIFBWIGRyaXZlcnMgcHJvdmlk
ZWQgYnkgT3JhY2xlIFZNIGJ1dCBJIG5lZWQgdG8gdXNlIE9yYWNsZSBWTSBhcyBteSBEb21haW4g
MCBpbiBvcmRlciB0byB1c2UgdGhlbS4NCg0KQ2FuIGFueW9uZSBjb25maXJtIG15IHVuZGVyc3Rh
bmRpbmcgYXMgZm9yZS1tZW50aW9uZWQ/DQoNCkkgd2FudCB0byBtYWtlIGEgUEMgYXMgYSBIVFBD
L05BUyBjb21ibyB3aXRoIEhUUEMgcGFydCBwbGF5ZWQgYnkgYSBXaW5kb3dzIDcgKFdpbmRvd3Mg
MTAgcHJlZmVycmVkIGlmIGZlYXNpYmxlKSBQViBIVk0gZ3Vlc3QuDQoNCkknbSBub3cgc3R1Y2sg
YXQgdGhlIHBsYW5uaW5nIHN0YWdlIG9mIFdpbmRvd3MgUFYgZHJpdmVycy4gSSBkb24ndCB3YW50
IHRvIGNvbXBpbGUgYW55dGhpbmcgYW5kIHNldCB0aGUgV2luZG93cyB0byB0ZXN0IG1vZGUuDQoN
ClNvIGNhbiBJIGp1c3QgZG93bmxvYWQgdGhlIFBWIGRyaXZlcnMgZnJvbSBDaXRyaXggYW5kIGlu
c3RhbGxlZCB0byB0aGUgZ3Vlc3Q/IFdpbGwgaXQgd29yayB3aXRoIG15IFhlbiA0LjUvNC42IEh5
cGVydmlzb3Igd2l0aCBVYnVudHUgMTUuMDQgRG9tYWluIDA/DQoNCkknbGwgYmUgdmVyeSBncmF0
ZWZ1bCBpZiBhbnlvbmUgY2FuIGhlbHAgbWUuDQoNClJlZ2FyZHMNCkxvaw0KDQoNCg==

--_000_1AD33E34BA5E3649B4F6C7FE476686F4211C6848AMSPEX01CL03cit_
Content-Type: text/html; charset="utf-8"
Content-ID: <2228D6FC3D48CD40900B0AB5F6816A7E@citrix.com>
Content-Transfer-Encoding: base64

PGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIiB4
bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIiB4bWxuczptPSJo
dHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA0LzEyL29tbWwiIHhtbG5zPSJo
dHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4NCjxoZWFkPg0KPG1ldGEgaHR0cC1lcXVp
dj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KPG1l
dGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJNaWNyb3NvZnQgV29yZCAxNSAoZmlsdGVyZWQg
bWVkaXVtKSI+DQo8c3R5bGU+PCEtLQ0KLyogRm9udCBEZWZpbml0aW9ucyAqLw0KQGZvbnQtZmFj
ZQ0KCXtmb250LWZhbWlseToiQ2FtYnJpYSBNYXRoIjsNCglwYW5vc2UtMToyIDQgNSAzIDUgNCA2
IDMgMiA0O30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6Q2FsaWJyaTsNCglwYW5vc2UtMToy
IDE1IDUgMiAyIDIgNCAzIDIgNDt9DQovKiBTdHlsZSBEZWZpbml0aW9ucyAqLw0KcC5Nc29Ob3Jt
YWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbA0KCXttYXJnaW46MGNtOw0KCW1hcmdpbi1i
b3R0b206LjAwMDFwdDsNCglmb250LXNpemU6MTEuMHB0Ow0KCWZvbnQtZmFtaWx5OiJDYWxpYnJp
IixzYW5zLXNlcmlmO30NCmE6bGluaywgc3Bhbi5Nc29IeXBlcmxpbmsNCgl7bXNvLXN0eWxlLXBy
aW9yaXR5Ojk5Ow0KCWNvbG9yOmJsdWU7DQoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9DQph
OnZpc2l0ZWQsIHNwYW4uTXNvSHlwZXJsaW5rRm9sbG93ZWQNCgl7bXNvLXN0eWxlLXByaW9yaXR5
Ojk5Ow0KCWNvbG9yOiM5NTRGNzI7DQoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9DQpwDQoJ
e21zby1zdHlsZS1wcmlvcml0eTo5OTsNCgltYXJnaW46MGNtOw0KCW1hcmdpbi1ib3R0b206LjAw
MDFwdDsNCglmb250LXNpemU6MTEuMHB0Ow0KCWZvbnQtZmFtaWx5OiJDYWxpYnJpIixzYW5zLXNl
cmlmO30NCi5Nc29DaHBEZWZhdWx0DQoJe21zby1zdHlsZS10eXBlOmV4cG9ydC1vbmx5O30NCkBw
YWdlIFdvcmRTZWN0aW9uMQ0KCXtzaXplOjYxMi4wcHQgNzkyLjBwdDsNCgltYXJnaW46NzIuMHB0
IDcyLjBwdCA3Mi4wcHQgNzIuMHB0O30NCmRpdi5Xb3JkU2VjdGlvbjENCgl7cGFnZTpXb3JkU2Vj
dGlvbjE7fQ0KLS0+PC9zdHlsZT4NCjwvaGVhZD4NCjxib2R5IGxhbmc9IkVOLUdCIiBsaW5rPSJi
bHVlIiB2bGluaz0iIzk1NEY3MiI+DQo8ZGl2IGNsYXNzPSJXb3JkU2VjdGlvbjEiPg0KPHA+VGhv
c2Ugc3RhdGVtZW50cyBhcmUgY29ycmVjdC48L3A+DQo8cD48bzpwPiZuYnNwOzwvbzpwPjwvcD4N
CjxwPlRoZSBkcml2ZXJzIHByb3ZpZGVkIGJ5IENpdHJpeCBYZW5TZXJ2ZXIgYXJlIGZyb20gdGhl
IHNhbWUgY29kZSBiYXNlIGFzIHRoZSBYZW4gcHJvamVjdCBQViBkcml2ZXJzIOKAkyBidXQgYXJl
IGN1cnJlbnRseSBvbGRlciAoYW5kIHRha2VuIGZyb20gYSBwb2ludCBiZWZvcmUgdGhlIGRyaXZl
cnMgd2VyZSBoYW5kZWQgb3ZlciBmcm9tIHRoZSBYZW5TZXJ2ZXIgcHJvamVjdCB0byB0aGUgWGVu
IHByb2plY3QpLiAmbmJzcDtUaG9zZSBkcml2ZXJzIGhhdmUgQlNEDQogbGljZW5zZWQgc291cmNl
IGNvZGUgKGFzIGRvIHRoZSBYZW4gcHJvamVjdCBkcml2ZXJzKSBzbyB0aGVyZSBzaG91bGRu4oCZ
dCBiZSBhIGNvbmZsaWN0IChidXQgZG9u4oCZdCB0cnVzdCBtZSDigJMgSeKAmW0gbm90IGEgbGF3
eWVyIGFuZCBub3Qgc3BlYWtpbmcgZm9yIENpdHJpeCBoZXJlKTwvcD4NCjxwPjxvOnA+Jm5ic3A7
PC9vOnA+PC9wPg0KPHA+SSB3b3VsZCBleHBlY3QgdGhlIENpdHJpeCBkcml2ZXJzIHRvIHdvcmsg
d2l0aCBYZW4gKGJ1dCBubyBwcm9taXNlcywgWU1NViEpLiZuYnNwOyBBbmQgZ29pbmcgZm9yd2Fy
ZHMgKGFzIENpdHJpeCBQViBkcml2ZXJzIGFyZSBpbmNyZWFzaW5nbHkgYnVpbHQgZnJvbSBYZW4g
cHJvamVjdCByYXRoZXIgdGhlbiB0aGUgWGVuU2VydmVyIHByb2plY3QgY29kZSkgdGhpcyB3aWxs
IGJlIG1vcmUgYW5kIG1vcmUgbGlrZWx5LjwvcD4NCjxwPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0K
PHA+KGluY2lkZW50YWxseSwgaWYgeW91IGhhdmUgYSBjb2RlIHNpZ25pbmcgY2VydCB3aXRoIGEg
Y2hhaW4gb2YgdHJ1c3QgYmFjayB0byBhIHJvb3QgcHJvdmlkZXIsIHlvdSBjYW4gc2lnbiBhbnkg
ZHJpdmVycyB5b3UgYnVpbGQg4oCTIGFuZCB0aGVuIGluc3RhbGwgdGhvc2UgY2VydGlmaWNhdGVz
IGludG8gV2luZG93cyDigJMgYXZvaWRpbmcgd29ycnlpbmcgYWJvdXQgbmVlZGluZyB0byB0dXJu
IHRlc3Qgc2lnbmluZyBvbi4mbmJzcDsgTm90IHN1cmUgaWYgdGhhdA0KIGhlbHBzKTwvcD4NCjxw
PjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHA+QmVuIENoYWxtZXJzPC9wPg0KPHA+PG86cD4mbmJz
cDs8L286cD48L3A+DQo8cD48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxkaXYgc3R5bGU9Im1zby1l
bGVtZW50OnBhcmEtYm9yZGVyLWRpdjtib3JkZXI6bm9uZTtib3JkZXItdG9wOnNvbGlkICNFMUUx
RTEgMS4wcHQ7cGFkZGluZzozLjBwdCAwY20gMGNtIDBjbSI+DQo8cCBzdHlsZT0iYm9yZGVyOm5v
bmU7cGFkZGluZzowY20iPjxicj4NCjxiPkZyb206IDwvYj5YZW4gTmV3YmllPGJyPg0KPGI+U2Vu
dDogPC9iPjI5IE9jdG9iZXIgMjAxNSAwNTo1NTxicj4NCjxiPlRvOiA8L2I+WGVuIFdpbmRvd3Mg
UFYgRHJpdmVycyBEZXZlbG9wbWVudCBNYWlsaW5nIExpc3Q8YnI+DQo8Yj5TdWJqZWN0OiA8L2I+
W3dpbi1wdi1kZXZlbF0gU2lnbmVkIFdpbmRvd3MgUFYgRHJpdmVyPC9wPg0KPC9kaXY+DQo8cCBj
bGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3Jt
YWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDss
c2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi
PjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5l
dyBSb21hbiZxdW90OyxzZXJpZiI+SSd2ZSBhc2tlZCB0aGUgcXVlc3Rpb25zIGF0IHRoZSBYZW4g
dXNlcnMgbWFpbGluZyBsaXN0IGJ1dCBub2JvZHkgaGFzIGludGVyZXN0IHRvIG9mZmVyIG1lIGEg
aGVscC4mbmJzcDsgSWYgdGhlIHF1ZXN0aW9ucyBhcmUgdG9vIGJhc2ljIGFuZCBzaG91bGQgbm90
IGJlIHJhaXNlZCBpbiB0aGlzIGRldmVsDQogbWFpbGluZyBsaXN0LCBwbGVhc2UgZm9yZ2l2ZSBt
ZS48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7
VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8ZGl2
Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7Zm9u
dC1mYW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj48bzpwPiZuYnNwOzwv
bzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3Bh
biBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9t
YW4mcXVvdDssc2VyaWYiPkkgd2FudCB0byBpbnN0YWxsIGEgc2lnbmVkIFBWIGRyaXZlcnMgaW4g
bXkgSFZNIHdpbmRvd3MgZ3Vlc3Qgc2luY2UgSSBsZWFybnQgZnJvbSB0aGUgd2ViIHRoYXQgYSB0
ZXN0IHNpZ25lZCBkcml2ZXIgbWF5IGxlYWQgdG8gY29uZmxpY3RzIHdpdGggc29tZSBXaW5kb3dz
IGFwcGxpY2F0aW9ucy48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBj
bGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWls
eTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9z
cGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxl
PSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90
OyxzZXJpZiI+SSBzdHVkaWVkIGEgbG90IGZyb20gdGhlIFhlbiBwcm9qZWN0IHBhZ2VzIGFuZCBY
ZW4gbWFpbGluZyBsaXN0IGZvciB1c2VycyBhbmQgcHYgZHJpdmVyIGRldmVsb3BtZW50LiBJIGFt
IGNvbmZ1c2VkIHNpbmNlIHNvbWUgb2YgdGhlIGluZm9ybWF0aW9uIHNlZW1zIHRvIGJlIG91dC1k
YXRlZC4mbmJzcDs8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFz
cz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTom
cXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFu
PjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJm
b250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90Oyxz
ZXJpZiI+SSBjb25zb2xpZGF0ZWQgd2hhdCBJIGxlYXJudCBzbyBmYXIgYW5kIHdvdWxkIGxpa2Ug
dG8gc2VlayBmb3IgaGVscCB0byBjbGFyaWZ5IHRoZSBmb2xsb3dpbmcgY29uZWNwdHMgYmVmb3Jl
IEkgbWFrZSBteSBuZXh0IG1vdmU6PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2
Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7Zm9u
dC1mYW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj48bzpwPiZuYnNwOzwv
bzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3Bh
biBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9t
YW4mcXVvdDssc2VyaWYiPjEpIFRob3NlIHNpZ25lZCBXaW5kb3dzIGRyaXZlcnMgcmVzaWRlZCBv
biB1bml2ZW50aW9uIHNlZW1lZCB0byBiZSBhbHJlYWR5IG91dC1kYXRlZC48bzpwPjwvbzpwPjwv
c3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHls
ZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVv
dDssc2VyaWYiPjIpIFRob3NlIFBWIGRyaXZlcnMgcHJvdmlkZWQgb24NCjxhIGhyZWY9Imh0dHA6
Ly93d3cueGVucHJvamVjdC5vcmcvZGV2ZWxvcGVycy90ZWFtcy93aW5kb3dzLXB2LWRyaXZlcnMu
aHRtbCIgdGFyZ2V0PSJfQkxBTksiPg0KaHR0cDovL3d3dy54ZW5wcm9qZWN0Lm9yZy9kZXZlbG9w
ZXJzL3RlYW1zL3dpbmRvd3MtcHYtZHJpdmVycy5odG1sPC9hPiByZXF1aXJlcyBteSBvd24gY29t
cGlsYXRpb24uIFRoZSBkcml2ZXJzIGNvbXBpbGVkIGFyZSB0ZXN0IHNpZ25lZCBhbmQgcmVxdWly
ZXMgc2V0dGluZyB0aGUgV2luZG93cyB0byB0ZXN0IG1vZGUuPG86cD48L286cD48L3NwYW4+PC9w
Pg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQt
c2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlm
Ij4zKSBUaGUgUFYgZHJpdmVycyBwcm92aWRlZCBieSBDaXRyaXggWGVuU2VydmVyIHNlZW1zIHRv
IHdvcmsgYWxzbyB3aXRoIFhlbiBIeXBlcnZpc29yIGJ1dCBJJ20gbm90IHN1cmUgd2hldGhlciB0
aGVyZSBpcyBhbnkgbGljZW5zZSBjb25mbGljdC48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rp
dj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEy
LjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPjQpIFRo
ZXJlIGFyZSBNaWNyb3NvZnQgc2lnbmVkIFBWIGRyaXZlcnMgcHJvdmlkZWQgYnkgT3JhY2xlIFZN
IGJ1dCBJIG5lZWQgdG8gdXNlIE9yYWNsZSBWTSBhcyBteSBEb21haW4gMCBpbiBvcmRlciB0byB1
c2UgdGhlbS48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0i
TXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVv
dDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwv
cD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250
LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJp
ZiI+Q2FuIGFueW9uZSBjb25maXJtIG15IHVuZGVyc3RhbmRpbmcgYXMgZm9yZS1tZW50aW9uZWQ/
PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1h
bCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7VGltZXMg
TmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rp
dj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEy
LjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPkkgd2Fu
dCB0byBtYWtlIGEgUEMgYXMgYSBIVFBDL05BUyBjb21ibyB3aXRoIEhUUEMgcGFydCBwbGF5ZWQg
YnkgYSBXaW5kb3dzIDcgKFdpbmRvd3MgMTAgcHJlZmVycmVkIGlmIGZlYXNpYmxlKSBQViBIVk0g
Z3Vlc3QuPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1z
b05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7
VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+
DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1z
aXplOjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYi
PkknbSBub3cgc3R1Y2sgYXQgdGhlIHBsYW5uaW5nIHN0YWdlIG9mIFdpbmRvd3MgUFYgZHJpdmVy
cy4gSSBkb24ndCB3YW50IHRvIGNvbXBpbGUgYW55dGhpbmcgYW5kIHNldCB0aGUgV2luZG93cyB0
byB0ZXN0IG1vZGUuPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xh
c3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6
JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bh
bj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0i
Zm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDss
c2VyaWYiPlNvIGNhbiBJIGp1c3QgZG93bmxvYWQgdGhlIFBWIGRyaXZlcnMgZnJvbSBDaXRyaXgg
YW5kIGluc3RhbGxlZCB0byB0aGUgZ3Vlc3Q/IFdpbGwgaXQgd29yayB3aXRoIG15IFhlbiA0LjUv
NC42IEh5cGVydmlzb3Igd2l0aCBVYnVudHUgMTUuMDQgRG9tYWluIDA/PG86cD48L286cD48L3Nw
YW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9
ImZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7
LHNlcmlmIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBj
bGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWls
eTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPkknbGwgYmUgdmVyeSBncmF0ZWZ1
bCBpZiBhbnlvbmUgY2FuIGhlbHAgbWUuPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8
ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7
Zm9udC1mYW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj48bzpwPiZuYnNw
OzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48
c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcg
Um9tYW4mcXVvdDssc2VyaWYiPlJlZ2FyZHM8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4N
CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQt
ZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZiI+TG9rPG86cD48L286cD48
L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8L286cD48L3A+DQo8
cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjwvZGl2Pg0KPC9ib2R5
Pg0KPC9odG1sPg0K

--_000_1AD33E34BA5E3649B4F6C7FE476686F4211C6848AMSPEX01CL03cit_--


--===============7305199458872669132==
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
--===============7305199458872669132==--


From win-pv-devel-bounces@lists.xenproject.org Thu Oct 29 10:02:45 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 10:02: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 1Zrk2e-0000uj-0L; Thu, 29 Oct 2015 10:02:44 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xennewbie@gmail.com>) id 1Zrk2c-0000ue-I3
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 10:02:42 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	77/A1-30270-1CEE1365; Thu, 29 Oct 2015 10:02:41 +0000
X-Env-Sender: xennewbie@gmail.com
X-Msg-Ref: server-2.tower-206.messagelabs.com!1446112957!22576582!1
X-Originating-IP: [209.85.218.65]
X-SpamReason: No, hits=0.9 required=7.0 tests=BODY_RANDOM_LONG,
	HTML_50_60,HTML_MESSAGE,RCVD_BY_IP
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22545 invoked from network); 29 Oct 2015 10:02:38 -0000
Received: from mail-oi0-f65.google.com (HELO mail-oi0-f65.google.com)
	(209.85.218.65)
	by server-2.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	29 Oct 2015 10:02:38 -0000
Received: by oifu187 with SMTP id u187so2153099oif.3
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 29 Oct 2015 03:02:37 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type;
	bh=/doe+swsCG4SL8R4RFBGG5h8HNSX/UbWQFy5eBGgu6w=;
	b=jnbgVWAu9JgCBulFoBBrCs+zt8/MFBUNiZxVUbz/4t409vVDz8HCrt2U/SUMqMsC+M
	Lm2v4uoooFjSmKi+mVML/o9RD5hWxDU69qXtD5r+hqRR+uWwuGHKW8GULouNOp8bvYlm
	TmROxQ8iGlRORBs4yDNdqDDMYHbtl9C36w7F8ZG0E/pxD82rnVdivQ5I7AuEcXKyLNhB
	/CiiMTm4/lO4C++6SRcCrreW3F9xf089kX+2qCd08VH51X7oZrAHGQCYaQOpQ6N/j9mM
	QuhXkmcJkdYxOdkbi/j0j0bGXym5kKRFqi9fcDesciOjpZdj4a2KvniCgXTzvcxC8B/F
	Dlaw==
MIME-Version: 1.0
X-Received: by 10.60.96.232 with SMTP id dv8mr416398oeb.4.1446112957229; Thu,
	29 Oct 2015 03:02:37 -0700 (PDT)
Received: by 10.76.37.200 with HTTP; Thu, 29 Oct 2015 03:02:37 -0700 (PDT)
In-Reply-To: <1AD33E34BA5E3649B4F6C7FE476686F4211C6848@AMSPEX01CL03.citrite.net>
References: <1AD33E34BA5E3649B4F6C7FE476686F4211C6848@AMSPEX01CL03.citrite.net>
Date: Thu, 29 Oct 2015 18:02:37 +0800
Message-ID: <CANXFt06TCJ2aqOy7Fjkd+64FZqjWjs5pDq_wAkOtXZ2Af_ecfg@mail.gmail.com>
From: Xen Newbie <xennewbie@gmail.com>
To: Ben Chalmers <ben.chalmers@citrix.com>
Cc: Xen Windows PV Drivers Development Mailing List
	<win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] Signed Windows PV 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>
Content-Type: multipart/mixed; boundary="===============0062123755163367238=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

--===============0062123755163367238==
Content-Type: multipart/alternative; boundary=089e01184bf21ef0b305233b692f

--089e01184bf21ef0b305233b692f
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

I'm very grateful to your help.

So if I have a self signed certificate and import it to Windows's Trusted
Root CA in the certificate store, I can properly install self compiled PV
drivers signed by that certificate to that Windows guest.  Is my
understanding correct?

I saw a lot mails in this mailing list discussing failure of PV drivers
working under Windows 10.  Does it mean the PV drivers are not yet stable
enough to work under Windows 10?

Regards
Terry

On Thu, Oct 29, 2015 at 4:52 PM, Ben Chalmers <ben.chalmers@citrix.com>
wrote:

> Those statements are correct.
>
>
>
> The drivers provided by Citrix XenServer are from the same code base as
> the Xen project PV drivers =E2=80=93 but are currently older (and taken f=
rom a
> point before the drivers were handed over from the XenServer project to t=
he
> Xen project).  Those drivers have BSD licensed source code (as do the Xen
> project drivers) so there shouldn=E2=80=99t be a conflict (but don=E2=80=
=99t trust me =E2=80=93 I=E2=80=99m
> not a lawyer and not speaking for Citrix here)
>
>
>
> I would expect the Citrix drivers to work with Xen (but no promises,
> YMMV!).  And going forwards (as Citrix PV drivers are increasingly built
> from Xen project rather then the XenServer project code) this will be mor=
e
> and more likely.
>
>
>
> (incidentally, if you have a code signing cert with a chain of trust back
> to a root provider, you can sign any drivers you build =E2=80=93 and then=
 install
> those certificates into Windows =E2=80=93 avoiding worrying about needing=
 to turn
> test signing on.  Not sure if that helps)
>
>
>
> Ben Chalmers
>
>
>
>
>
>
> *From: *Xen Newbie
> *Sent: *29 October 2015 05:55
> *To: *Xen Windows PV Drivers Development Mailing List
> *Subject: *[win-pv-devel] Signed Windows PV Driver
>
>
>
>
>
> I've asked the questions at the Xen users mailing list but nobody has
> interest to offer me a help.  If the questions are too basic and should n=
ot
> be raised in this devel mailing list, please forgive me.
>
>
>
> I want to install a signed PV drivers in my HVM windows guest since I
> learnt from the web that a test signed driver may lead to conflicts with
> some Windows applications.
>
>
>
> I studied a lot from the Xen project pages and Xen mailing list for users
> and pv driver development. I am confused since some of the information
> seems to be out-dated.
>
>
>
> I consolidated what I learnt so far and would like to seek for help to
> clarify the following conecpts before I make my next move:
>
>
>
> 1) Those signed Windows drivers resided on univention seemed to be alread=
y
> out-dated.
>
> 2) Those PV drivers provided on
> http://www.xenproject.org/developers/teams/windows-pv-drivers.html
> requires my own compilation. The drivers compiled are test signed and
> requires setting the Windows to test mode.
>
> 3) The PV drivers provided by Citrix XenServer seems to work also with Xe=
n
> Hypervisor but I'm not sure whether there is any license conflict.
>
> 4) There are Microsoft signed PV drivers provided by Oracle VM but I need
> to use Oracle VM as my Domain 0 in order to use them.
>
>
>
> Can anyone confirm my understanding as fore-mentioned?
>
>
>
> I want to make a PC as a HTPC/NAS combo with HTPC part played by a Window=
s
> 7 (Windows 10 preferred if feasible) PV HVM guest.
>
>
>
> I'm now stuck at the planning stage of Windows PV drivers. I don't want t=
o
> compile anything and set the Windows to test mode.
>
>
>
> So can I just download the PV drivers from Citrix and installed to the
> guest? Will it work with my Xen 4.5/4.6 Hypervisor with Ubuntu 15.04 Doma=
in
> 0?
>
>
>
> I'll be very grateful if anyone can help me.
>
>
>
> Regards
>
> Lok
>
>
>
>
>

--089e01184bf21ef0b305233b692f
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">I&#39;m very grateful to your help.<div><br></div><div>So =
if I have a self signed certificate and import it to Windows&#39;s Trusted =
Root CA in the certificate store, I can properly install self compiled PV d=
rivers signed by that certificate to that Windows guest.=C2=A0 Is my unders=
tanding correct?</div><div><br></div><div>I saw a lot mails in this mailing=
 list discussing failure of PV drivers working under Windows 10.=C2=A0 Does=
 it mean the PV drivers are not yet stable enough to work under Windows 10?=
</div><div><br></div><div>Regards</div><div>Terry</div></div><div class=3D"=
gmail_extra"><br><div class=3D"gmail_quote">On Thu, Oct 29, 2015 at 4:52 PM=
, Ben Chalmers <span dir=3D"ltr">&lt;<a href=3D"mailto:ben.chalmers@citrix.=
com" target=3D"_blank">ben.chalmers@citrix.com</a>&gt;</span> wrote:<br><bl=
ockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #=
ccc solid;padding-left:1ex">





<div lang=3D"EN-GB" link=3D"blue" vlink=3D"#954F72">
<div>
<p>Those statements are correct.</p>
<p><u></u>=C2=A0<u></u></p>
<p>The drivers provided by Citrix XenServer are from the same code base as =
the Xen project PV drivers =E2=80=93 but are currently older (and taken fro=
m a point before the drivers were handed over from the XenServer project to=
 the Xen project).=C2=A0 Those drivers have BSD
 licensed source code (as do the Xen project drivers) so there shouldn=E2=
=80=99t be a conflict (but don=E2=80=99t trust me =E2=80=93 I=E2=80=99m not=
 a lawyer and not speaking for Citrix here)</p>
<p><u></u>=C2=A0<u></u></p>
<p>I would expect the Citrix drivers to work with Xen (but no promises, YMM=
V!).=C2=A0 And going forwards (as Citrix PV drivers are increasingly built =
from Xen project rather then the XenServer project code) this will be more =
and more likely.</p>
<p><u></u>=C2=A0<u></u></p>
<p>(incidentally, if you have a code signing cert with a chain of trust bac=
k to a root provider, you can sign any drivers you build =E2=80=93 and then=
 install those certificates into Windows =E2=80=93 avoiding worrying about =
needing to turn test signing on.=C2=A0 Not sure if that
 helps)</p>
<p><u></u>=C2=A0<u></u></p>
<p>Ben Chalmers</p>
<p><u></u>=C2=A0<u></u></p>
<p><u></u>=C2=A0<u></u></p>
<div style=3D"border:none;border-top:solid #e1e1e1 1.0pt;padding:3.0pt 0cm =
0cm 0cm">
<p style=3D"border:none;padding:0cm"><br>
<b>From: </b>Xen Newbie<br>
<b>Sent: </b>29 October 2015 05:55<br>
<b>To: </b>Xen Windows PV Drivers Development Mailing List<br>
<b>Subject: </b>[win-pv-devel] Signed Windows PV Driver</p>
</div><div><div class=3D"h5">
<p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p>
<p class=3D"MsoNormal"><span style=3D"font-family:&quot;Times New Roman&quo=
t;,serif"><u></u>=C2=A0<u></u></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">I&#39;ve asked the questions at the Xen users ma=
iling list but nobody has interest to offer me a help.=C2=A0 If the questio=
ns are too basic and should not be raised in this devel
 mailing list, please forgive me.</span><span style=3D"font-size:12.0pt;fon=
t-family:&quot;Times New Roman&quot;,serif"><u></u><u></u></span></p>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif"><u></u>=C2=A0<u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">I want to install a signed PV drivers in my HVM =
windows guest since I learnt from the web that a test signed driver may lea=
d to conflicts with some Windows applications.<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif"><u></u>=C2=A0<u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">I studied a lot from the Xen project pages and X=
en mailing list for users and pv driver development. I am confused since so=
me of the information seems to be out-dated.=C2=A0<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif"><u></u>=C2=A0<u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">I consolidated what I learnt so far and would li=
ke to seek for help to clarify the following conecpts before I make my next=
 move:<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif"><u></u>=C2=A0<u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">1) Those signed Windows drivers resided on unive=
ntion seemed to be already out-dated.<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">2) Those PV drivers provided on
<a href=3D"http://www.xenproject.org/developers/teams/windows-pv-drivers.ht=
ml" target=3D"_blank">
http://www.xenproject.org/developers/teams/windows-pv-drivers.html</a> requ=
ires my own compilation. The drivers compiled are test signed and requires =
setting the Windows to test mode.<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">3) The PV drivers provided by Citrix XenServer s=
eems to work also with Xen Hypervisor but I&#39;m not sure whether there is=
 any license conflict.<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">4) There are Microsoft signed PV drivers provide=
d by Oracle VM but I need to use Oracle VM as my Domain 0 in order to use t=
hem.<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif"><u></u>=C2=A0<u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">Can anyone confirm my understanding as fore-ment=
ioned?<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif"><u></u>=C2=A0<u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">I want to make a PC as a HTPC/NAS combo with HTP=
C part played by a Windows 7 (Windows 10 preferred if feasible) PV HVM gues=
t.<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif"><u></u>=C2=A0<u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">I&#39;m now stuck at the planning stage of Windo=
ws PV drivers. I don&#39;t want to compile anything and set the Windows to =
test mode.<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif"><u></u>=C2=A0<u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">So can I just download the PV drivers from Citri=
x and installed to the guest? Will it work with my Xen 4.5/4.6 Hypervisor w=
ith Ubuntu 15.04 Domain 0?<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif"><u></u>=C2=A0<u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">I&#39;ll be very grateful if anyone can help me.=
<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif"><u></u>=C2=A0<u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">Regards<u></u><u></u></span></p>
</div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">Lok<u></u><u></u></span></p>
<p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p>
<p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p>
</div></div></div>
</div>

</blockquote></div><br></div>

--089e01184bf21ef0b305233b692f--


--===============0062123755163367238==
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
--===============0062123755163367238==--


From win-pv-devel-bounces@lists.xenproject.org Thu Oct 29 10:02:45 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 10:02: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 1Zrk2e-0000uj-0L; Thu, 29 Oct 2015 10:02:44 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xennewbie@gmail.com>) id 1Zrk2c-0000ue-I3
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 10:02:42 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	77/A1-30270-1CEE1365; Thu, 29 Oct 2015 10:02:41 +0000
X-Env-Sender: xennewbie@gmail.com
X-Msg-Ref: server-2.tower-206.messagelabs.com!1446112957!22576582!1
X-Originating-IP: [209.85.218.65]
X-SpamReason: No, hits=0.9 required=7.0 tests=BODY_RANDOM_LONG,
	HTML_50_60,HTML_MESSAGE,RCVD_BY_IP
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22545 invoked from network); 29 Oct 2015 10:02:38 -0000
Received: from mail-oi0-f65.google.com (HELO mail-oi0-f65.google.com)
	(209.85.218.65)
	by server-2.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	29 Oct 2015 10:02:38 -0000
Received: by oifu187 with SMTP id u187so2153099oif.3
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 29 Oct 2015 03:02:37 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type;
	bh=/doe+swsCG4SL8R4RFBGG5h8HNSX/UbWQFy5eBGgu6w=;
	b=jnbgVWAu9JgCBulFoBBrCs+zt8/MFBUNiZxVUbz/4t409vVDz8HCrt2U/SUMqMsC+M
	Lm2v4uoooFjSmKi+mVML/o9RD5hWxDU69qXtD5r+hqRR+uWwuGHKW8GULouNOp8bvYlm
	TmROxQ8iGlRORBs4yDNdqDDMYHbtl9C36w7F8ZG0E/pxD82rnVdivQ5I7AuEcXKyLNhB
	/CiiMTm4/lO4C++6SRcCrreW3F9xf089kX+2qCd08VH51X7oZrAHGQCYaQOpQ6N/j9mM
	QuhXkmcJkdYxOdkbi/j0j0bGXym5kKRFqi9fcDesciOjpZdj4a2KvniCgXTzvcxC8B/F
	Dlaw==
MIME-Version: 1.0
X-Received: by 10.60.96.232 with SMTP id dv8mr416398oeb.4.1446112957229; Thu,
	29 Oct 2015 03:02:37 -0700 (PDT)
Received: by 10.76.37.200 with HTTP; Thu, 29 Oct 2015 03:02:37 -0700 (PDT)
In-Reply-To: <1AD33E34BA5E3649B4F6C7FE476686F4211C6848@AMSPEX01CL03.citrite.net>
References: <1AD33E34BA5E3649B4F6C7FE476686F4211C6848@AMSPEX01CL03.citrite.net>
Date: Thu, 29 Oct 2015 18:02:37 +0800
Message-ID: <CANXFt06TCJ2aqOy7Fjkd+64FZqjWjs5pDq_wAkOtXZ2Af_ecfg@mail.gmail.com>
From: Xen Newbie <xennewbie@gmail.com>
To: Ben Chalmers <ben.chalmers@citrix.com>
Cc: Xen Windows PV Drivers Development Mailing List
	<win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] Signed Windows PV 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>
Content-Type: multipart/mixed; boundary="===============0062123755163367238=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

--===============0062123755163367238==
Content-Type: multipart/alternative; boundary=089e01184bf21ef0b305233b692f

--089e01184bf21ef0b305233b692f
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

I'm very grateful to your help.

So if I have a self signed certificate and import it to Windows's Trusted
Root CA in the certificate store, I can properly install self compiled PV
drivers signed by that certificate to that Windows guest.  Is my
understanding correct?

I saw a lot mails in this mailing list discussing failure of PV drivers
working under Windows 10.  Does it mean the PV drivers are not yet stable
enough to work under Windows 10?

Regards
Terry

On Thu, Oct 29, 2015 at 4:52 PM, Ben Chalmers <ben.chalmers@citrix.com>
wrote:

> Those statements are correct.
>
>
>
> The drivers provided by Citrix XenServer are from the same code base as
> the Xen project PV drivers =E2=80=93 but are currently older (and taken f=
rom a
> point before the drivers were handed over from the XenServer project to t=
he
> Xen project).  Those drivers have BSD licensed source code (as do the Xen
> project drivers) so there shouldn=E2=80=99t be a conflict (but don=E2=80=
=99t trust me =E2=80=93 I=E2=80=99m
> not a lawyer and not speaking for Citrix here)
>
>
>
> I would expect the Citrix drivers to work with Xen (but no promises,
> YMMV!).  And going forwards (as Citrix PV drivers are increasingly built
> from Xen project rather then the XenServer project code) this will be mor=
e
> and more likely.
>
>
>
> (incidentally, if you have a code signing cert with a chain of trust back
> to a root provider, you can sign any drivers you build =E2=80=93 and then=
 install
> those certificates into Windows =E2=80=93 avoiding worrying about needing=
 to turn
> test signing on.  Not sure if that helps)
>
>
>
> Ben Chalmers
>
>
>
>
>
>
> *From: *Xen Newbie
> *Sent: *29 October 2015 05:55
> *To: *Xen Windows PV Drivers Development Mailing List
> *Subject: *[win-pv-devel] Signed Windows PV Driver
>
>
>
>
>
> I've asked the questions at the Xen users mailing list but nobody has
> interest to offer me a help.  If the questions are too basic and should n=
ot
> be raised in this devel mailing list, please forgive me.
>
>
>
> I want to install a signed PV drivers in my HVM windows guest since I
> learnt from the web that a test signed driver may lead to conflicts with
> some Windows applications.
>
>
>
> I studied a lot from the Xen project pages and Xen mailing list for users
> and pv driver development. I am confused since some of the information
> seems to be out-dated.
>
>
>
> I consolidated what I learnt so far and would like to seek for help to
> clarify the following conecpts before I make my next move:
>
>
>
> 1) Those signed Windows drivers resided on univention seemed to be alread=
y
> out-dated.
>
> 2) Those PV drivers provided on
> http://www.xenproject.org/developers/teams/windows-pv-drivers.html
> requires my own compilation. The drivers compiled are test signed and
> requires setting the Windows to test mode.
>
> 3) The PV drivers provided by Citrix XenServer seems to work also with Xe=
n
> Hypervisor but I'm not sure whether there is any license conflict.
>
> 4) There are Microsoft signed PV drivers provided by Oracle VM but I need
> to use Oracle VM as my Domain 0 in order to use them.
>
>
>
> Can anyone confirm my understanding as fore-mentioned?
>
>
>
> I want to make a PC as a HTPC/NAS combo with HTPC part played by a Window=
s
> 7 (Windows 10 preferred if feasible) PV HVM guest.
>
>
>
> I'm now stuck at the planning stage of Windows PV drivers. I don't want t=
o
> compile anything and set the Windows to test mode.
>
>
>
> So can I just download the PV drivers from Citrix and installed to the
> guest? Will it work with my Xen 4.5/4.6 Hypervisor with Ubuntu 15.04 Doma=
in
> 0?
>
>
>
> I'll be very grateful if anyone can help me.
>
>
>
> Regards
>
> Lok
>
>
>
>
>

--089e01184bf21ef0b305233b692f
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">I&#39;m very grateful to your help.<div><br></div><div>So =
if I have a self signed certificate and import it to Windows&#39;s Trusted =
Root CA in the certificate store, I can properly install self compiled PV d=
rivers signed by that certificate to that Windows guest.=C2=A0 Is my unders=
tanding correct?</div><div><br></div><div>I saw a lot mails in this mailing=
 list discussing failure of PV drivers working under Windows 10.=C2=A0 Does=
 it mean the PV drivers are not yet stable enough to work under Windows 10?=
</div><div><br></div><div>Regards</div><div>Terry</div></div><div class=3D"=
gmail_extra"><br><div class=3D"gmail_quote">On Thu, Oct 29, 2015 at 4:52 PM=
, Ben Chalmers <span dir=3D"ltr">&lt;<a href=3D"mailto:ben.chalmers@citrix.=
com" target=3D"_blank">ben.chalmers@citrix.com</a>&gt;</span> wrote:<br><bl=
ockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #=
ccc solid;padding-left:1ex">





<div lang=3D"EN-GB" link=3D"blue" vlink=3D"#954F72">
<div>
<p>Those statements are correct.</p>
<p><u></u>=C2=A0<u></u></p>
<p>The drivers provided by Citrix XenServer are from the same code base as =
the Xen project PV drivers =E2=80=93 but are currently older (and taken fro=
m a point before the drivers were handed over from the XenServer project to=
 the Xen project).=C2=A0 Those drivers have BSD
 licensed source code (as do the Xen project drivers) so there shouldn=E2=
=80=99t be a conflict (but don=E2=80=99t trust me =E2=80=93 I=E2=80=99m not=
 a lawyer and not speaking for Citrix here)</p>
<p><u></u>=C2=A0<u></u></p>
<p>I would expect the Citrix drivers to work with Xen (but no promises, YMM=
V!).=C2=A0 And going forwards (as Citrix PV drivers are increasingly built =
from Xen project rather then the XenServer project code) this will be more =
and more likely.</p>
<p><u></u>=C2=A0<u></u></p>
<p>(incidentally, if you have a code signing cert with a chain of trust bac=
k to a root provider, you can sign any drivers you build =E2=80=93 and then=
 install those certificates into Windows =E2=80=93 avoiding worrying about =
needing to turn test signing on.=C2=A0 Not sure if that
 helps)</p>
<p><u></u>=C2=A0<u></u></p>
<p>Ben Chalmers</p>
<p><u></u>=C2=A0<u></u></p>
<p><u></u>=C2=A0<u></u></p>
<div style=3D"border:none;border-top:solid #e1e1e1 1.0pt;padding:3.0pt 0cm =
0cm 0cm">
<p style=3D"border:none;padding:0cm"><br>
<b>From: </b>Xen Newbie<br>
<b>Sent: </b>29 October 2015 05:55<br>
<b>To: </b>Xen Windows PV Drivers Development Mailing List<br>
<b>Subject: </b>[win-pv-devel] Signed Windows PV Driver</p>
</div><div><div class=3D"h5">
<p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p>
<p class=3D"MsoNormal"><span style=3D"font-family:&quot;Times New Roman&quo=
t;,serif"><u></u>=C2=A0<u></u></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">I&#39;ve asked the questions at the Xen users ma=
iling list but nobody has interest to offer me a help.=C2=A0 If the questio=
ns are too basic and should not be raised in this devel
 mailing list, please forgive me.</span><span style=3D"font-size:12.0pt;fon=
t-family:&quot;Times New Roman&quot;,serif"><u></u><u></u></span></p>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif"><u></u>=C2=A0<u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">I want to install a signed PV drivers in my HVM =
windows guest since I learnt from the web that a test signed driver may lea=
d to conflicts with some Windows applications.<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif"><u></u>=C2=A0<u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">I studied a lot from the Xen project pages and X=
en mailing list for users and pv driver development. I am confused since so=
me of the information seems to be out-dated.=C2=A0<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif"><u></u>=C2=A0<u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">I consolidated what I learnt so far and would li=
ke to seek for help to clarify the following conecpts before I make my next=
 move:<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif"><u></u>=C2=A0<u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">1) Those signed Windows drivers resided on unive=
ntion seemed to be already out-dated.<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">2) Those PV drivers provided on
<a href=3D"http://www.xenproject.org/developers/teams/windows-pv-drivers.ht=
ml" target=3D"_blank">
http://www.xenproject.org/developers/teams/windows-pv-drivers.html</a> requ=
ires my own compilation. The drivers compiled are test signed and requires =
setting the Windows to test mode.<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">3) The PV drivers provided by Citrix XenServer s=
eems to work also with Xen Hypervisor but I&#39;m not sure whether there is=
 any license conflict.<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">4) There are Microsoft signed PV drivers provide=
d by Oracle VM but I need to use Oracle VM as my Domain 0 in order to use t=
hem.<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif"><u></u>=C2=A0<u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">Can anyone confirm my understanding as fore-ment=
ioned?<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif"><u></u>=C2=A0<u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">I want to make a PC as a HTPC/NAS combo with HTP=
C part played by a Windows 7 (Windows 10 preferred if feasible) PV HVM gues=
t.<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif"><u></u>=C2=A0<u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">I&#39;m now stuck at the planning stage of Windo=
ws PV drivers. I don&#39;t want to compile anything and set the Windows to =
test mode.<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif"><u></u>=C2=A0<u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">So can I just download the PV drivers from Citri=
x and installed to the guest? Will it work with my Xen 4.5/4.6 Hypervisor w=
ith Ubuntu 15.04 Domain 0?<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif"><u></u>=C2=A0<u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">I&#39;ll be very grateful if anyone can help me.=
<u></u><u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif"><u></u>=C2=A0<u></u></span></p>
</div>
<div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">Regards<u></u><u></u></span></p>
</div>
<p class=3D"MsoNormal"><span style=3D"font-size:12.0pt;font-family:&quot;Ti=
mes New Roman&quot;,serif">Lok<u></u><u></u></span></p>
<p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p>
<p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p>
</div></div></div>
</div>

</blockquote></div><br></div>

--089e01184bf21ef0b305233b692f--


--===============0062123755163367238==
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
--===============0062123755163367238==--


From win-pv-devel-bounces@lists.xenproject.org Thu Oct 29 11:04:19 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 11:04:19 +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 1Zrl0E-0004uK-SB; Thu, 29 Oct 2015 11:04:18 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=73749d786=ben.chalmers@citrix.com>)
	id 1Zrl0C-0004u7-KE
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 11:04:17 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	30/C1-12889-F2DF1365; Thu, 29 Oct 2015 11:04:15 +0000
X-Env-Sender: prvs=73749d786=ben.chalmers@citrix.com
X-Msg-Ref: server-16.tower-27.messagelabs.com!1446116650!30241587!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.8 required=7.0 tests=BODY_RANDOM_LONG,
	HTML_60_70,HTML_MESSAGE,received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22295 invoked from network); 29 Oct 2015 11:04:13 -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;
	29 Oct 2015 11:04:13 -0000
X-IronPort-AV: E=Sophos;i="5.20,213,1444694400"; d="scan'208,217";a="6449106"
From: Ben Chalmers <ben.chalmers@citrix.com>
To: Xen Newbie <xennewbie@gmail.com>
Thread-Topic: [win-pv-devel] Signed Windows PV Driver
Thread-Index: AdESOYjpXZ+56YxPxUenI+PSTWAa4w==
Content-Class: urn:content-classes:message
Date: Thu, 29 Oct 2015 11:04:09 +0000
Message-ID: <1AD33E34BA5E3649B4F6C7FE476686F4211C691C@AMSPEX01CL03.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-GB
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: Xen Windows PV Drivers Development Mailing List
	<win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] Signed Windows PV 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>
Content-Type: multipart/mixed; boundary="===============2515826817608195151=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

--===============2515826817608195151==
Content-Class: urn:content-classes:message
Content-Language: en-GB
Content-Type: multipart/alternative;
	boundary="_000_1AD33E34BA5E3649B4F6C7FE476686F4211C691CAMSPEX01CL03cit_"

--_000_1AD33E34BA5E3649B4F6C7FE476686F4211C691CAMSPEX01CL03cit_
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

Tm8sIHNvcnJ5LCBwb3NzaWJseSBJIHdhcyB1bmNsZWFyDQoNCg0KDQpBIHNlbGYtc2lnbmVkIGNl
cnRpZmljYXRlIGlzIHRoZSBzYW1lIGFzIGEgdGVzdCBzaWduZWQgY2VydCDigJMgYW5kIHlvdeKA
mWxsIG5lZWQgdG8gaGF2ZSB0ZXN0IHNpZ25pbmcgdHVybmVkIG9uLg0KDQoNCg0KQnV0IGlmIHlv
dSBoYXZlIGEgY2VydGlmaWNhdGUgc2lnbmVkIGJ5IHZlcmlzaWduIChvciBzaW1pbGFyKSwgeW91
IGNhbiB1c2UgdGhhdCB0byBzaWduIHRoZSBjb2RlIGFuZCBhdm9pZCBuZWVkaW5nIHRvIHR1cm4g
dGVzdCBzaWduaW5nIG9uLg0KDQoNCg0KSSBkb27igJl0IGtub3cgb2YgYW55IHByb2JsZW1zIHdp
dGggdGhlIFBWIGRyaXZlcnMgYW5kIHdpbmRvd3MgMTAgKFRoZXJlIHdlcmUgd2l0aCBDaXRyaXgg
LyBYZW5TZXJ2ZXIgZHJpdmVycywgYnV0IHRoZSBkcml2ZXJzIGluIHJlY2VudCBob3RmaXhlcyBo
YXZlIGZpeGVkIHRob3NlIHByb2JsZW1zKQ0KDQoNCg0KQmVuIENoYWxtZXJzDQoNCg0KDQoNCg0K
RnJvbTogWGVuIE5ld2JpZQ0KU2VudDogMjkgT2N0b2JlciAyMDE1IDEwOjAyDQpUbzogQmVuIENo
YWxtZXJzDQpDYzogWGVuIFdpbmRvd3MgUFYgRHJpdmVycyBEZXZlbG9wbWVudCBNYWlsaW5nIExp
c3QNClN1YmplY3Q6IFJlOiBbd2luLXB2LWRldmVsXSBTaWduZWQgV2luZG93cyBQViBEcml2ZXIN
Cg0KDQpJJ20gdmVyeSBncmF0ZWZ1bCB0byB5b3VyIGhlbHAuDQoNClNvIGlmIEkgaGF2ZSBhIHNl
bGYgc2lnbmVkIGNlcnRpZmljYXRlIGFuZCBpbXBvcnQgaXQgdG8gV2luZG93cydzIFRydXN0ZWQg
Um9vdCBDQSBpbiB0aGUgY2VydGlmaWNhdGUgc3RvcmUsIEkgY2FuIHByb3Blcmx5IGluc3RhbGwg
c2VsZiBjb21waWxlZCBQViBkcml2ZXJzIHNpZ25lZCBieSB0aGF0IGNlcnRpZmljYXRlIHRvIHRo
YXQgV2luZG93cyBndWVzdC4gIElzIG15IHVuZGVyc3RhbmRpbmcgY29ycmVjdD8NCg0KSSBzYXcg
YSBsb3QgbWFpbHMgaW4gdGhpcyBtYWlsaW5nIGxpc3QgZGlzY3Vzc2luZyBmYWlsdXJlIG9mIFBW
IGRyaXZlcnMgd29ya2luZyB1bmRlciBXaW5kb3dzIDEwLiAgRG9lcyBpdCBtZWFuIHRoZSBQViBk
cml2ZXJzIGFyZSBub3QgeWV0IHN0YWJsZSBlbm91Z2ggdG8gd29yayB1bmRlciBXaW5kb3dzIDEw
Pw0KDQpSZWdhcmRzDQpUZXJyeQ0KDQpPbiBUaHUsIE9jdCAyOSwgMjAxNSBhdCA0OjUyIFBNLCBC
ZW4gQ2hhbG1lcnMgPGJlbi5jaGFsbWVyc0BjaXRyaXguY29tPG1haWx0bzpiZW4uY2hhbG1lcnNA
Y2l0cml4LmNvbT4+IHdyb3RlOg0KDQpUaG9zZSBzdGF0ZW1lbnRzIGFyZSBjb3JyZWN0Lg0KDQoN
Cg0KVGhlIGRyaXZlcnMgcHJvdmlkZWQgYnkgQ2l0cml4IFhlblNlcnZlciBhcmUgZnJvbSB0aGUg
c2FtZSBjb2RlIGJhc2UgYXMgdGhlIFhlbiBwcm9qZWN0IFBWIGRyaXZlcnMg4oCTIGJ1dCBhcmUg
Y3VycmVudGx5IG9sZGVyIChhbmQgdGFrZW4gZnJvbSBhIHBvaW50IGJlZm9yZSB0aGUgZHJpdmVy
cyB3ZXJlIGhhbmRlZCBvdmVyIGZyb20gdGhlIFhlblNlcnZlciBwcm9qZWN0IHRvIHRoZSBYZW4g
cHJvamVjdCkuICBUaG9zZSBkcml2ZXJzIGhhdmUgQlNEIGxpY2Vuc2VkIHNvdXJjZSBjb2RlIChh
cyBkbyB0aGUgWGVuIHByb2plY3QgZHJpdmVycykgc28gdGhlcmUgc2hvdWxkbuKAmXQgYmUgYSBj
b25mbGljdCAoYnV0IGRvbuKAmXQgdHJ1c3QgbWUg4oCTIEnigJltIG5vdCBhIGxhd3llciBhbmQg
bm90IHNwZWFraW5nIGZvciBDaXRyaXggaGVyZSkNCg0KDQoNCkkgd291bGQgZXhwZWN0IHRoZSBD
aXRyaXggZHJpdmVycyB0byB3b3JrIHdpdGggWGVuIChidXQgbm8gcHJvbWlzZXMsIFlNTVYhKS4g
IEFuZCBnb2luZyBmb3J3YXJkcyAoYXMgQ2l0cml4IFBWIGRyaXZlcnMgYXJlIGluY3JlYXNpbmds
eSBidWlsdCBmcm9tIFhlbiBwcm9qZWN0IHJhdGhlciB0aGVuIHRoZSBYZW5TZXJ2ZXIgcHJvamVj
dCBjb2RlKSB0aGlzIHdpbGwgYmUgbW9yZSBhbmQgbW9yZSBsaWtlbHkuDQoNCg0KDQooaW5jaWRl
bnRhbGx5LCBpZiB5b3UgaGF2ZSBhIGNvZGUgc2lnbmluZyBjZXJ0IHdpdGggYSBjaGFpbiBvZiB0
cnVzdCBiYWNrIHRvIGEgcm9vdCBwcm92aWRlciwgeW91IGNhbiBzaWduIGFueSBkcml2ZXJzIHlv
dSBidWlsZCDigJMgYW5kIHRoZW4gaW5zdGFsbCB0aG9zZSBjZXJ0aWZpY2F0ZXMgaW50byBXaW5k
b3dzIOKAkyBhdm9pZGluZyB3b3JyeWluZyBhYm91dCBuZWVkaW5nIHRvIHR1cm4gdGVzdCBzaWdu
aW5nIG9uLiAgTm90IHN1cmUgaWYgdGhhdCBoZWxwcykNCg0KDQoNCkJlbiBDaGFsbWVycw0KDQoN
Cg0KDQoNCkZyb206IFhlbiBOZXdiaWUNClNlbnQ6IDI5IE9jdG9iZXIgMjAxNSAwNTo1NQ0KVG86
IFhlbiBXaW5kb3dzIFBWIERyaXZlcnMgRGV2ZWxvcG1lbnQgTWFpbGluZyBMaXN0DQpTdWJqZWN0
OiBbd2luLXB2LWRldmVsXSBTaWduZWQgV2luZG93cyBQViBEcml2ZXINCg0KDQpJJ3ZlIGFza2Vk
IHRoZSBxdWVzdGlvbnMgYXQgdGhlIFhlbiB1c2VycyBtYWlsaW5nIGxpc3QgYnV0IG5vYm9keSBo
YXMgaW50ZXJlc3QgdG8gb2ZmZXIgbWUgYSBoZWxwLiAgSWYgdGhlIHF1ZXN0aW9ucyBhcmUgdG9v
IGJhc2ljIGFuZCBzaG91bGQgbm90IGJlIHJhaXNlZCBpbiB0aGlzIGRldmVsIG1haWxpbmcgbGlz
dCwgcGxlYXNlIGZvcmdpdmUgbWUuDQoNCkkgd2FudCB0byBpbnN0YWxsIGEgc2lnbmVkIFBWIGRy
aXZlcnMgaW4gbXkgSFZNIHdpbmRvd3MgZ3Vlc3Qgc2luY2UgSSBsZWFybnQgZnJvbSB0aGUgd2Vi
IHRoYXQgYSB0ZXN0IHNpZ25lZCBkcml2ZXIgbWF5IGxlYWQgdG8gY29uZmxpY3RzIHdpdGggc29t
ZSBXaW5kb3dzIGFwcGxpY2F0aW9ucy4NCg0KSSBzdHVkaWVkIGEgbG90IGZyb20gdGhlIFhlbiBw
cm9qZWN0IHBhZ2VzIGFuZCBYZW4gbWFpbGluZyBsaXN0IGZvciB1c2VycyBhbmQgcHYgZHJpdmVy
IGRldmVsb3BtZW50LiBJIGFtIGNvbmZ1c2VkIHNpbmNlIHNvbWUgb2YgdGhlIGluZm9ybWF0aW9u
IHNlZW1zIHRvIGJlIG91dC1kYXRlZC4NCg0KSSBjb25zb2xpZGF0ZWQgd2hhdCBJIGxlYXJudCBz
byBmYXIgYW5kIHdvdWxkIGxpa2UgdG8gc2VlayBmb3IgaGVscCB0byBjbGFyaWZ5IHRoZSBmb2xs
b3dpbmcgY29uZWNwdHMgYmVmb3JlIEkgbWFrZSBteSBuZXh0IG1vdmU6DQoNCjEpIFRob3NlIHNp
Z25lZCBXaW5kb3dzIGRyaXZlcnMgcmVzaWRlZCBvbiB1bml2ZW50aW9uIHNlZW1lZCB0byBiZSBh
bHJlYWR5IG91dC1kYXRlZC4NCjIpIFRob3NlIFBWIGRyaXZlcnMgcHJvdmlkZWQgb24gaHR0cDov
L3d3dy54ZW5wcm9qZWN0Lm9yZy9kZXZlbG9wZXJzL3RlYW1zL3dpbmRvd3MtcHYtZHJpdmVycy5o
dG1sIHJlcXVpcmVzIG15IG93biBjb21waWxhdGlvbi4gVGhlIGRyaXZlcnMgY29tcGlsZWQgYXJl
IHRlc3Qgc2lnbmVkIGFuZCByZXF1aXJlcyBzZXR0aW5nIHRoZSBXaW5kb3dzIHRvIHRlc3QgbW9k
ZS4NCjMpIFRoZSBQViBkcml2ZXJzIHByb3ZpZGVkIGJ5IENpdHJpeCBYZW5TZXJ2ZXIgc2VlbXMg
dG8gd29yayBhbHNvIHdpdGggWGVuIEh5cGVydmlzb3IgYnV0IEknbSBub3Qgc3VyZSB3aGV0aGVy
IHRoZXJlIGlzIGFueSBsaWNlbnNlIGNvbmZsaWN0Lg0KNCkgVGhlcmUgYXJlIE1pY3Jvc29mdCBz
aWduZWQgUFYgZHJpdmVycyBwcm92aWRlZCBieSBPcmFjbGUgVk0gYnV0IEkgbmVlZCB0byB1c2Ug
T3JhY2xlIFZNIGFzIG15IERvbWFpbiAwIGluIG9yZGVyIHRvIHVzZSB0aGVtLg0KDQpDYW4gYW55
b25lIGNvbmZpcm0gbXkgdW5kZXJzdGFuZGluZyBhcyBmb3JlLW1lbnRpb25lZD8NCg0KSSB3YW50
IHRvIG1ha2UgYSBQQyBhcyBhIEhUUEMvTkFTIGNvbWJvIHdpdGggSFRQQyBwYXJ0IHBsYXllZCBi
eSBhIFdpbmRvd3MgNyAoV2luZG93cyAxMCBwcmVmZXJyZWQgaWYgZmVhc2libGUpIFBWIEhWTSBn
dWVzdC4NCg0KSSdtIG5vdyBzdHVjayBhdCB0aGUgcGxhbm5pbmcgc3RhZ2Ugb2YgV2luZG93cyBQ
ViBkcml2ZXJzLiBJIGRvbid0IHdhbnQgdG8gY29tcGlsZSBhbnl0aGluZyBhbmQgc2V0IHRoZSBX
aW5kb3dzIHRvIHRlc3QgbW9kZS4NCg0KU28gY2FuIEkganVzdCBkb3dubG9hZCB0aGUgUFYgZHJp
dmVycyBmcm9tIENpdHJpeCBhbmQgaW5zdGFsbGVkIHRvIHRoZSBndWVzdD8gV2lsbCBpdCB3b3Jr
IHdpdGggbXkgWGVuIDQuNS80LjYgSHlwZXJ2aXNvciB3aXRoIFVidW50dSAxNS4wNCBEb21haW4g
MD8NCg0KSSdsbCBiZSB2ZXJ5IGdyYXRlZnVsIGlmIGFueW9uZSBjYW4gaGVscCBtZS4NCg0KUmVn
YXJkcw0KTG9rDQoNCg0KDQoNCg0K

--_000_1AD33E34BA5E3649B4F6C7FE476686F4211C691CAMSPEX01CL03cit_
Content-Type: text/html; charset="utf-8"
Content-ID: <9E2572EF5530B94D8AEA9ACB94E9130C@citrix.com>
Content-Transfer-Encoding: base64

PGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIiB4
bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIiB4bWxuczptPSJo
dHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA0LzEyL29tbWwiIHhtbG5zPSJo
dHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4NCjxoZWFkPg0KPG1ldGEgaHR0cC1lcXVp
dj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KPG1l
dGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJNaWNyb3NvZnQgV29yZCAxNSAoZmlsdGVyZWQg
bWVkaXVtKSI+DQo8c3R5bGU+PCEtLQ0KLyogRm9udCBEZWZpbml0aW9ucyAqLw0KQGZvbnQtZmFj
ZQ0KCXtmb250LWZhbWlseToiQ2FtYnJpYSBNYXRoIjsNCglwYW5vc2UtMToyIDQgNSAzIDUgNCA2
IDMgMiA0O30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6Q2FsaWJyaTsNCglwYW5vc2UtMToy
IDE1IDUgMiAyIDIgNCAzIDIgNDt9DQovKiBTdHlsZSBEZWZpbml0aW9ucyAqLw0KcC5Nc29Ob3Jt
YWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbA0KCXttYXJnaW46MGNtOw0KCW1hcmdpbi1i
b3R0b206LjAwMDFwdDsNCglmb250LXNpemU6MTEuMHB0Ow0KCWZvbnQtZmFtaWx5OiJDYWxpYnJp
IixzYW5zLXNlcmlmO30NCmE6bGluaywgc3Bhbi5Nc29IeXBlcmxpbmsNCgl7bXNvLXN0eWxlLXBy
aW9yaXR5Ojk5Ow0KCWNvbG9yOmJsdWU7DQoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9DQph
OnZpc2l0ZWQsIHNwYW4uTXNvSHlwZXJsaW5rRm9sbG93ZWQNCgl7bXNvLXN0eWxlLXByaW9yaXR5
Ojk5Ow0KCWNvbG9yOiM5NTRGNzI7DQoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9DQpwDQoJ
e21zby1zdHlsZS1wcmlvcml0eTo5OTsNCgltYXJnaW46MGNtOw0KCW1hcmdpbi1ib3R0b206LjAw
MDFwdDsNCglmb250LXNpemU6MTEuMHB0Ow0KCWZvbnQtZmFtaWx5OiJDYWxpYnJpIixzYW5zLXNl
cmlmO30NCi5Nc29DaHBEZWZhdWx0DQoJe21zby1zdHlsZS10eXBlOmV4cG9ydC1vbmx5O30NCkBw
YWdlIFdvcmRTZWN0aW9uMQ0KCXtzaXplOjYxMi4wcHQgNzkyLjBwdDsNCgltYXJnaW46NzIuMHB0
IDcyLjBwdCA3Mi4wcHQgNzIuMHB0O30NCmRpdi5Xb3JkU2VjdGlvbjENCgl7cGFnZTpXb3JkU2Vj
dGlvbjE7fQ0KLS0+PC9zdHlsZT4NCjwvaGVhZD4NCjxib2R5IGxhbmc9IkVOLUdCIiBsaW5rPSJi
bHVlIiB2bGluaz0iIzk1NEY3MiI+DQo8ZGl2IGNsYXNzPSJXb3JkU2VjdGlvbjEiPg0KPHA+Tm8s
IHNvcnJ5LCBwb3NzaWJseSBJIHdhcyB1bmNsZWFyPC9wPg0KPHA+PG86cD4mbmJzcDs8L286cD48
L3A+DQo8cD5BIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIGlzIHRoZSBzYW1lIGFzIGEgdGVzdCBz
aWduZWQgY2VydCDigJMgYW5kIHlvdeKAmWxsIG5lZWQgdG8gaGF2ZSB0ZXN0IHNpZ25pbmcgdHVy
bmVkIG9uLjwvcD4NCjxwPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHA+QnV0IGlmIHlvdSBoYXZl
IGEgY2VydGlmaWNhdGUgc2lnbmVkIGJ5IHZlcmlzaWduIChvciBzaW1pbGFyKSwgeW91IGNhbiB1
c2UgdGhhdCB0byBzaWduIHRoZSBjb2RlIGFuZCBhdm9pZCBuZWVkaW5nIHRvIHR1cm4gdGVzdCBz
aWduaW5nIG9uLjwvcD4NCjxwPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHA+SSBkb27igJl0IGtu
b3cgb2YgYW55IHByb2JsZW1zIHdpdGggdGhlIFBWIGRyaXZlcnMgYW5kIHdpbmRvd3MgMTAgKFRo
ZXJlIHdlcmUgd2l0aCBDaXRyaXggLyBYZW5TZXJ2ZXIgZHJpdmVycywgYnV0IHRoZSBkcml2ZXJz
IGluIHJlY2VudCBob3RmaXhlcyBoYXZlIGZpeGVkIHRob3NlIHByb2JsZW1zKTwvcD4NCjxwPjxv
OnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHA+QmVuIENoYWxtZXJzPC9wPg0KPHA+PG86cD4mbmJzcDs8
L286cD48L3A+DQo8cD48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxkaXYgc3R5bGU9Im1zby1lbGVt
ZW50OnBhcmEtYm9yZGVyLWRpdjtib3JkZXI6bm9uZTtib3JkZXItdG9wOnNvbGlkICNFMUUxRTEg
MS4wcHQ7cGFkZGluZzozLjBwdCAwY20gMGNtIDBjbSI+DQo8cCBzdHlsZT0iYm9yZGVyOm5vbmU7
cGFkZGluZzowY20iPjxicj4NCjxiPkZyb206IDwvYj5YZW4gTmV3YmllPGJyPg0KPGI+U2VudDog
PC9iPjI5IE9jdG9iZXIgMjAxNSAxMDowMjxicj4NCjxiPlRvOiA8L2I+QmVuIENoYWxtZXJzPGJy
Pg0KPGI+Q2M6IDwvYj5YZW4gV2luZG93cyBQViBEcml2ZXJzIERldmVsb3BtZW50IE1haWxpbmcg
TGlzdDxicj4NCjxiPlN1YmplY3Q6IDwvYj5SZTogW3dpbi1wdi1kZXZlbF0gU2lnbmVkIFdpbmRv
d3MgUFYgRHJpdmVyPC9wPg0KPC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNw
OzwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWls
eTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9z
cGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIu
MHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZiI+SSdtIHZl
cnkgZ3JhdGVmdWwgdG8geW91ciBoZWxwLg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6
MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZiI+PG86
cD48L286cD48L3NwYW4+PC9wPg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0
eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZx
dW90OyxzZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0K
PHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1m
YW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj5TbyBpZiBJIGhhdmUgYSBz
ZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSBhbmQgaW1wb3J0IGl0IHRvIFdpbmRvd3MncyBUcnVzdGVk
IFJvb3QgQ0EgaW4gdGhlIGNlcnRpZmljYXRlIHN0b3JlLCBJIGNhbiBwcm9wZXJseSBpbnN0YWxs
IHNlbGYgY29tcGlsZWQgUFYgZHJpdmVycyBzaWduZWQgYnkgdGhhdA0KIGNlcnRpZmljYXRlIHRv
IHRoYXQgV2luZG93cyBndWVzdC4mbmJzcDsgSXMgbXkgdW5kZXJzdGFuZGluZyBjb3JyZWN0Pzxv
OnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi
PjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5l
dyBSb21hbiZxdW90OyxzZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+
DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4w
cHQ7Zm9udC1mYW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj5JIHNhdyBh
IGxvdCBtYWlscyBpbiB0aGlzIG1haWxpbmcgbGlzdCBkaXNjdXNzaW5nIGZhaWx1cmUgb2YgUFYg
ZHJpdmVycyB3b3JraW5nIHVuZGVyIFdpbmRvd3MgMTAuJm5ic3A7IERvZXMgaXQgbWVhbiB0aGUg
UFYgZHJpdmVycyBhcmUgbm90IHlldCBzdGFibGUgZW5vdWdoIHRvIHdvcmsgdW5kZXIgV2luZG93
cw0KIDEwPzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJN
c29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90
O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9w
Pg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQt
c2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlm
Ij5SZWdhcmRzPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9
Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6JnF1
b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj5UZXJyeTxvOnA+PC9vOnA+PC9zcGFuPjwv
cD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250
LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJp
ZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3Jt
YWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVz
IE5ldyBSb21hbiZxdW90OyxzZXJpZiI+T24gVGh1LCBPY3QgMjksIDIwMTUgYXQgNDo1MiBQTSwg
QmVuIENoYWxtZXJzICZsdDs8YSBocmVmPSJtYWlsdG86YmVuLmNoYWxtZXJzQGNpdHJpeC5jb20i
PmJlbi5jaGFsbWVyc0BjaXRyaXguY29tPC9hPiZndDsgd3JvdGU6PG86cD48L286cD48L3NwYW4+
PC9wPg0KPGJsb2NrcXVvdGUgc3R5bGU9ImJvcmRlcjpub25lO2JvcmRlci1sZWZ0OnNvbGlkICND
Q0NDQ0MgMS4wcHQ7cGFkZGluZzowY20gMGNtIDBjbSA2LjBwdDttYXJnaW4tbGVmdDo0LjhwdDtt
YXJnaW4tcmlnaHQ6MGNtIj4NCjxkaXY+DQo8ZGl2Pg0KPHA+VGhvc2Ugc3RhdGVtZW50cyBhcmUg
Y29ycmVjdC48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtU
aW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwPiZu
YnNwOzwvcD4NCjxwPlRoZSBkcml2ZXJzIHByb3ZpZGVkIGJ5IENpdHJpeCBYZW5TZXJ2ZXIgYXJl
IGZyb20gdGhlIHNhbWUgY29kZSBiYXNlIGFzIHRoZSBYZW4gcHJvamVjdCBQViBkcml2ZXJzIOKA
kyBidXQgYXJlIGN1cnJlbnRseSBvbGRlciAoYW5kIHRha2VuIGZyb20gYSBwb2ludCBiZWZvcmUg
dGhlIGRyaXZlcnMgd2VyZSBoYW5kZWQgb3ZlciBmcm9tIHRoZSBYZW5TZXJ2ZXIgcHJvamVjdCB0
byB0aGUgWGVuIHByb2plY3QpLiZuYnNwOyBUaG9zZSBkcml2ZXJzIGhhdmUgQlNEDQogbGljZW5z
ZWQgc291cmNlIGNvZGUgKGFzIGRvIHRoZSBYZW4gcHJvamVjdCBkcml2ZXJzKSBzbyB0aGVyZSBz
aG91bGRu4oCZdCBiZSBhIGNvbmZsaWN0IChidXQgZG9u4oCZdCB0cnVzdCBtZSDigJMgSeKAmW0g
bm90IGEgbGF3eWVyIGFuZCBub3Qgc3BlYWtpbmcgZm9yIENpdHJpeCBoZXJlKTwvcD4NCjxwPiZu
YnNwOzwvcD4NCjxwPkkgd291bGQgZXhwZWN0IHRoZSBDaXRyaXggZHJpdmVycyB0byB3b3JrIHdp
dGggWGVuIChidXQgbm8gcHJvbWlzZXMsIFlNTVYhKS4mbmJzcDsgQW5kIGdvaW5nIGZvcndhcmRz
IChhcyBDaXRyaXggUFYgZHJpdmVycyBhcmUgaW5jcmVhc2luZ2x5IGJ1aWx0IGZyb20gWGVuIHBy
b2plY3QgcmF0aGVyIHRoZW4gdGhlIFhlblNlcnZlciBwcm9qZWN0IGNvZGUpIHRoaXMgd2lsbCBi
ZSBtb3JlIGFuZCBtb3JlIGxpa2VseS48L3A+DQo8cD4mbmJzcDs8L3A+DQo8cD4oaW5jaWRlbnRh
bGx5LCBpZiB5b3UgaGF2ZSBhIGNvZGUgc2lnbmluZyBjZXJ0IHdpdGggYSBjaGFpbiBvZiB0cnVz
dCBiYWNrIHRvIGEgcm9vdCBwcm92aWRlciwgeW91IGNhbiBzaWduIGFueSBkcml2ZXJzIHlvdSBi
dWlsZCDigJMgYW5kIHRoZW4gaW5zdGFsbCB0aG9zZSBjZXJ0aWZpY2F0ZXMgaW50byBXaW5kb3dz
IOKAkyBhdm9pZGluZyB3b3JyeWluZyBhYm91dCBuZWVkaW5nIHRvIHR1cm4gdGVzdCBzaWduaW5n
IG9uLiZuYnNwOyBOb3Qgc3VyZSBpZiB0aGF0DQogaGVscHMpPC9wPg0KPHA+Jm5ic3A7PC9wPg0K
PHA+QmVuIENoYWxtZXJzPC9wPg0KPHA+Jm5ic3A7PC9wPg0KPHA+Jm5ic3A7PC9wPg0KPGRpdiBz
dHlsZT0iYm9yZGVyOm5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAjRTFFMUUxIDEuMHB0O3BhZGRpbmc6
My4wcHQgMGNtIDBjbSAwY20iPg0KPHA+PGJyPg0KPGI+RnJvbTogPC9iPlhlbiBOZXdiaWU8YnI+
DQo8Yj5TZW50OiA8L2I+MjkgT2N0b2JlciAyMDE1IDA1OjU1PGJyPg0KPGI+VG86IDwvYj5YZW4g
V2luZG93cyBQViBEcml2ZXJzIERldmVsb3BtZW50IE1haWxpbmcgTGlzdDxicj4NCjxiPlN1Ympl
Y3Q6IDwvYj5bd2luLXB2LWRldmVsXSBTaWduZWQgV2luZG93cyBQViBEcml2ZXI8L3A+DQo8L2Rp
dj4NCjxkaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+Jm5ic3A7PC9wPg0KPHAgY2xh
c3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBS
b21hbiZxdW90OyxzZXJpZiI+Jm5ic3A7PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi
PjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5l
dyBSb21hbiZxdW90OyxzZXJpZiI+SSd2ZSBhc2tlZCB0aGUgcXVlc3Rpb25zIGF0IHRoZSBYZW4g
dXNlcnMgbWFpbGluZyBsaXN0IGJ1dCBub2JvZHkgaGFzIGludGVyZXN0IHRvIG9mZmVyIG1lIGEg
aGVscC4mbmJzcDsgSWYgdGhlIHF1ZXN0aW9ucyBhcmUgdG9vIGJhc2ljIGFuZCBzaG91bGQgbm90
IGJlIHJhaXNlZCBpbiB0aGlzIGRldmVsDQogbWFpbGluZyBsaXN0LCBwbGVhc2UgZm9yZ2l2ZSBt
ZS48L3NwYW4+PC9wPg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJm
b250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90Oyxz
ZXJpZiI+Jm5ic3A7PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3Jt
YWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVz
IE5ldyBSb21hbiZxdW90OyxzZXJpZiI+SSB3YW50IHRvIGluc3RhbGwgYSBzaWduZWQgUFYgZHJp
dmVycyBpbiBteSBIVk0gd2luZG93cyBndWVzdCBzaW5jZSBJIGxlYXJudCBmcm9tIHRoZSB3ZWIg
dGhhdCBhIHRlc3Qgc2lnbmVkIGRyaXZlciBtYXkgbGVhZCB0byBjb25mbGljdHMgd2l0aCBzb21l
IFdpbmRvd3MgYXBwbGljYXRpb25zLjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFz
cz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTom
cXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPiZuYnNwOzwvc3Bhbj48L3A+DQo8L2Rp
dj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEy
LjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPkkgc3R1
ZGllZCBhIGxvdCBmcm9tIHRoZSBYZW4gcHJvamVjdCBwYWdlcyBhbmQgWGVuIG1haWxpbmcgbGlz
dCBmb3IgdXNlcnMgYW5kIHB2IGRyaXZlciBkZXZlbG9wbWVudC4gSSBhbSBjb25mdXNlZCBzaW5j
ZSBzb21lIG9mIHRoZSBpbmZvcm1hdGlvbiBzZWVtcyB0byBiZSBvdXQtZGF0ZWQuJm5ic3A7PC9z
cGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxl
PSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90
OyxzZXJpZiI+Jm5ic3A7PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29O
b3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1Rp
bWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZiI+SSBjb25zb2xpZGF0ZWQgd2hhdCBJIGxlYXJudCBz
byBmYXIgYW5kIHdvdWxkIGxpa2UgdG8gc2VlayBmb3IgaGVscCB0byBjbGFyaWZ5IHRoZSBmb2xs
b3dpbmcgY29uZWNwdHMgYmVmb3JlIEkgbWFrZSBteSBuZXh0IG1vdmU6PC9zcGFuPjwvcD4NCjwv
ZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6
MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZiI+Jm5i
c3A7PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFu
IHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21h
biZxdW90OyxzZXJpZiI+MSkgVGhvc2Ugc2lnbmVkIFdpbmRvd3MgZHJpdmVycyByZXNpZGVkIG9u
IHVuaXZlbnRpb24gc2VlbWVkIHRvIGJlIGFscmVhZHkgb3V0LWRhdGVkLjwvc3Bhbj48L3A+DQo8
L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXpl
OjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPjIp
IFRob3NlIFBWIGRyaXZlcnMgcHJvdmlkZWQgb24NCjxhIGhyZWY9Imh0dHA6Ly93d3cueGVucHJv
amVjdC5vcmcvZGV2ZWxvcGVycy90ZWFtcy93aW5kb3dzLXB2LWRyaXZlcnMuaHRtbCIgdGFyZ2V0
PSJfQkxBTksiPg0KaHR0cDovL3d3dy54ZW5wcm9qZWN0Lm9yZy9kZXZlbG9wZXJzL3RlYW1zL3dp
bmRvd3MtcHYtZHJpdmVycy5odG1sPC9hPiByZXF1aXJlcyBteSBvd24gY29tcGlsYXRpb24uIFRo
ZSBkcml2ZXJzIGNvbXBpbGVkIGFyZSB0ZXN0IHNpZ25lZCBhbmQgcmVxdWlyZXMgc2V0dGluZyB0
aGUgV2luZG93cyB0byB0ZXN0IG1vZGUuPC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNs
YXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5
OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZiI+MykgVGhlIFBWIGRyaXZlcnMgcHJv
dmlkZWQgYnkgQ2l0cml4IFhlblNlcnZlciBzZWVtcyB0byB3b3JrIGFsc28gd2l0aCBYZW4gSHlw
ZXJ2aXNvciBidXQgSSdtIG5vdCBzdXJlIHdoZXRoZXIgdGhlcmUgaXMgYW55IGxpY2Vuc2UgY29u
ZmxpY3QuPC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxz
cGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBS
b21hbiZxdW90OyxzZXJpZiI+NCkgVGhlcmUgYXJlIE1pY3Jvc29mdCBzaWduZWQgUFYgZHJpdmVy
cyBwcm92aWRlZCBieSBPcmFjbGUgVk0gYnV0IEkgbmVlZCB0byB1c2UgT3JhY2xlIFZNIGFzIG15
IERvbWFpbiAwIGluIG9yZGVyIHRvIHVzZSB0aGVtLjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+
DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250
LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPiZuYnNwOzwvc3Bhbj48
L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9u
dC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2Vy
aWYiPkNhbiBhbnlvbmUgY29uZmlybSBteSB1bmRlcnN0YW5kaW5nIGFzIGZvcmUtbWVudGlvbmVk
Pzwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBz
dHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4m
cXVvdDssc2VyaWYiPiZuYnNwOzwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0i
TXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVv
dDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPkkgd2FudCB0byBtYWtlIGEgUEMgYXMgYSBI
VFBDL05BUyBjb21ibyB3aXRoIEhUUEMgcGFydCBwbGF5ZWQgYnkgYSBXaW5kb3dzIDcgKFdpbmRv
d3MgMTAgcHJlZmVycmVkIGlmIGZlYXNpYmxlKSBQViBIVk0gZ3Vlc3QuPC9zcGFuPjwvcD4NCjwv
ZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6
MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZiI+Jm5i
c3A7PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFu
IHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21h
biZxdW90OyxzZXJpZiI+SSdtIG5vdyBzdHVjayBhdCB0aGUgcGxhbm5pbmcgc3RhZ2Ugb2YgV2lu
ZG93cyBQViBkcml2ZXJzLiBJIGRvbid0IHdhbnQgdG8gY29tcGlsZSBhbnl0aGluZyBhbmQgc2V0
IHRoZSBXaW5kb3dzIHRvIHRlc3QgbW9kZS48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAg
Y2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1p
bHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj4mbmJzcDs8L3NwYW4+PC9wPg0K
PC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6
ZToxMi4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj5T
byBjYW4gSSBqdXN0IGRvd25sb2FkIHRoZSBQViBkcml2ZXJzIGZyb20gQ2l0cml4IGFuZCBpbnN0
YWxsZWQgdG8gdGhlIGd1ZXN0PyBXaWxsIGl0IHdvcmsgd2l0aCBteSBYZW4gNC41LzQuNiBIeXBl
cnZpc29yIHdpdGggVWJ1bnR1IDE1LjA0IERvbWFpbiAwPzwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxk
aXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtm
b250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPiZuYnNwOzwvc3Bh
bj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0i
Zm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDss
c2VyaWYiPkknbGwgYmUgdmVyeSBncmF0ZWZ1bCBpZiBhbnlvbmUgY2FuIGhlbHAgbWUuPC9zcGFu
PjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJm
b250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90Oyxz
ZXJpZiI+Jm5ic3A7PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3Jt
YWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVz
IE5ldyBSb21hbiZxdW90OyxzZXJpZiI+UmVnYXJkczwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxwIGNs
YXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5
OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZiI+TG9rPC9zcGFuPjwvcD4NCjxwIGNs
YXNzPSJNc29Ob3JtYWwiPiZuYnNwOzwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPiZuYnNwOzwv
cD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ibG9ja3F1b3RlPg0KPC9kaXY+
DQo8L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIu
MHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZiI+PG86cD4m
bmJzcDs8L286cD48L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8
L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjwv
ZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0K

--_000_1AD33E34BA5E3649B4F6C7FE476686F4211C691CAMSPEX01CL03cit_--


--===============2515826817608195151==
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
--===============2515826817608195151==--


From win-pv-devel-bounces@lists.xenproject.org Thu Oct 29 11:04:19 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 11:04:19 +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 1Zrl0E-0004uK-SB; Thu, 29 Oct 2015 11:04:18 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=73749d786=ben.chalmers@citrix.com>)
	id 1Zrl0C-0004u7-KE
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 11:04:17 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	30/C1-12889-F2DF1365; Thu, 29 Oct 2015 11:04:15 +0000
X-Env-Sender: prvs=73749d786=ben.chalmers@citrix.com
X-Msg-Ref: server-16.tower-27.messagelabs.com!1446116650!30241587!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.8 required=7.0 tests=BODY_RANDOM_LONG,
	HTML_60_70,HTML_MESSAGE,received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22295 invoked from network); 29 Oct 2015 11:04:13 -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;
	29 Oct 2015 11:04:13 -0000
X-IronPort-AV: E=Sophos;i="5.20,213,1444694400"; d="scan'208,217";a="6449106"
From: Ben Chalmers <ben.chalmers@citrix.com>
To: Xen Newbie <xennewbie@gmail.com>
Thread-Topic: [win-pv-devel] Signed Windows PV Driver
Thread-Index: AdESOYjpXZ+56YxPxUenI+PSTWAa4w==
Content-Class: urn:content-classes:message
Date: Thu, 29 Oct 2015 11:04:09 +0000
Message-ID: <1AD33E34BA5E3649B4F6C7FE476686F4211C691C@AMSPEX01CL03.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-GB
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: Xen Windows PV Drivers Development Mailing List
	<win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] Signed Windows PV 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>
Content-Type: multipart/mixed; boundary="===============2515826817608195151=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

--===============2515826817608195151==
Content-Class: urn:content-classes:message
Content-Language: en-GB
Content-Type: multipart/alternative;
	boundary="_000_1AD33E34BA5E3649B4F6C7FE476686F4211C691CAMSPEX01CL03cit_"

--_000_1AD33E34BA5E3649B4F6C7FE476686F4211C691CAMSPEX01CL03cit_
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

Tm8sIHNvcnJ5LCBwb3NzaWJseSBJIHdhcyB1bmNsZWFyDQoNCg0KDQpBIHNlbGYtc2lnbmVkIGNl
cnRpZmljYXRlIGlzIHRoZSBzYW1lIGFzIGEgdGVzdCBzaWduZWQgY2VydCDigJMgYW5kIHlvdeKA
mWxsIG5lZWQgdG8gaGF2ZSB0ZXN0IHNpZ25pbmcgdHVybmVkIG9uLg0KDQoNCg0KQnV0IGlmIHlv
dSBoYXZlIGEgY2VydGlmaWNhdGUgc2lnbmVkIGJ5IHZlcmlzaWduIChvciBzaW1pbGFyKSwgeW91
IGNhbiB1c2UgdGhhdCB0byBzaWduIHRoZSBjb2RlIGFuZCBhdm9pZCBuZWVkaW5nIHRvIHR1cm4g
dGVzdCBzaWduaW5nIG9uLg0KDQoNCg0KSSBkb27igJl0IGtub3cgb2YgYW55IHByb2JsZW1zIHdp
dGggdGhlIFBWIGRyaXZlcnMgYW5kIHdpbmRvd3MgMTAgKFRoZXJlIHdlcmUgd2l0aCBDaXRyaXgg
LyBYZW5TZXJ2ZXIgZHJpdmVycywgYnV0IHRoZSBkcml2ZXJzIGluIHJlY2VudCBob3RmaXhlcyBo
YXZlIGZpeGVkIHRob3NlIHByb2JsZW1zKQ0KDQoNCg0KQmVuIENoYWxtZXJzDQoNCg0KDQoNCg0K
RnJvbTogWGVuIE5ld2JpZQ0KU2VudDogMjkgT2N0b2JlciAyMDE1IDEwOjAyDQpUbzogQmVuIENo
YWxtZXJzDQpDYzogWGVuIFdpbmRvd3MgUFYgRHJpdmVycyBEZXZlbG9wbWVudCBNYWlsaW5nIExp
c3QNClN1YmplY3Q6IFJlOiBbd2luLXB2LWRldmVsXSBTaWduZWQgV2luZG93cyBQViBEcml2ZXIN
Cg0KDQpJJ20gdmVyeSBncmF0ZWZ1bCB0byB5b3VyIGhlbHAuDQoNClNvIGlmIEkgaGF2ZSBhIHNl
bGYgc2lnbmVkIGNlcnRpZmljYXRlIGFuZCBpbXBvcnQgaXQgdG8gV2luZG93cydzIFRydXN0ZWQg
Um9vdCBDQSBpbiB0aGUgY2VydGlmaWNhdGUgc3RvcmUsIEkgY2FuIHByb3Blcmx5IGluc3RhbGwg
c2VsZiBjb21waWxlZCBQViBkcml2ZXJzIHNpZ25lZCBieSB0aGF0IGNlcnRpZmljYXRlIHRvIHRo
YXQgV2luZG93cyBndWVzdC4gIElzIG15IHVuZGVyc3RhbmRpbmcgY29ycmVjdD8NCg0KSSBzYXcg
YSBsb3QgbWFpbHMgaW4gdGhpcyBtYWlsaW5nIGxpc3QgZGlzY3Vzc2luZyBmYWlsdXJlIG9mIFBW
IGRyaXZlcnMgd29ya2luZyB1bmRlciBXaW5kb3dzIDEwLiAgRG9lcyBpdCBtZWFuIHRoZSBQViBk
cml2ZXJzIGFyZSBub3QgeWV0IHN0YWJsZSBlbm91Z2ggdG8gd29yayB1bmRlciBXaW5kb3dzIDEw
Pw0KDQpSZWdhcmRzDQpUZXJyeQ0KDQpPbiBUaHUsIE9jdCAyOSwgMjAxNSBhdCA0OjUyIFBNLCBC
ZW4gQ2hhbG1lcnMgPGJlbi5jaGFsbWVyc0BjaXRyaXguY29tPG1haWx0bzpiZW4uY2hhbG1lcnNA
Y2l0cml4LmNvbT4+IHdyb3RlOg0KDQpUaG9zZSBzdGF0ZW1lbnRzIGFyZSBjb3JyZWN0Lg0KDQoN
Cg0KVGhlIGRyaXZlcnMgcHJvdmlkZWQgYnkgQ2l0cml4IFhlblNlcnZlciBhcmUgZnJvbSB0aGUg
c2FtZSBjb2RlIGJhc2UgYXMgdGhlIFhlbiBwcm9qZWN0IFBWIGRyaXZlcnMg4oCTIGJ1dCBhcmUg
Y3VycmVudGx5IG9sZGVyIChhbmQgdGFrZW4gZnJvbSBhIHBvaW50IGJlZm9yZSB0aGUgZHJpdmVy
cyB3ZXJlIGhhbmRlZCBvdmVyIGZyb20gdGhlIFhlblNlcnZlciBwcm9qZWN0IHRvIHRoZSBYZW4g
cHJvamVjdCkuICBUaG9zZSBkcml2ZXJzIGhhdmUgQlNEIGxpY2Vuc2VkIHNvdXJjZSBjb2RlIChh
cyBkbyB0aGUgWGVuIHByb2plY3QgZHJpdmVycykgc28gdGhlcmUgc2hvdWxkbuKAmXQgYmUgYSBj
b25mbGljdCAoYnV0IGRvbuKAmXQgdHJ1c3QgbWUg4oCTIEnigJltIG5vdCBhIGxhd3llciBhbmQg
bm90IHNwZWFraW5nIGZvciBDaXRyaXggaGVyZSkNCg0KDQoNCkkgd291bGQgZXhwZWN0IHRoZSBD
aXRyaXggZHJpdmVycyB0byB3b3JrIHdpdGggWGVuIChidXQgbm8gcHJvbWlzZXMsIFlNTVYhKS4g
IEFuZCBnb2luZyBmb3J3YXJkcyAoYXMgQ2l0cml4IFBWIGRyaXZlcnMgYXJlIGluY3JlYXNpbmds
eSBidWlsdCBmcm9tIFhlbiBwcm9qZWN0IHJhdGhlciB0aGVuIHRoZSBYZW5TZXJ2ZXIgcHJvamVj
dCBjb2RlKSB0aGlzIHdpbGwgYmUgbW9yZSBhbmQgbW9yZSBsaWtlbHkuDQoNCg0KDQooaW5jaWRl
bnRhbGx5LCBpZiB5b3UgaGF2ZSBhIGNvZGUgc2lnbmluZyBjZXJ0IHdpdGggYSBjaGFpbiBvZiB0
cnVzdCBiYWNrIHRvIGEgcm9vdCBwcm92aWRlciwgeW91IGNhbiBzaWduIGFueSBkcml2ZXJzIHlv
dSBidWlsZCDigJMgYW5kIHRoZW4gaW5zdGFsbCB0aG9zZSBjZXJ0aWZpY2F0ZXMgaW50byBXaW5k
b3dzIOKAkyBhdm9pZGluZyB3b3JyeWluZyBhYm91dCBuZWVkaW5nIHRvIHR1cm4gdGVzdCBzaWdu
aW5nIG9uLiAgTm90IHN1cmUgaWYgdGhhdCBoZWxwcykNCg0KDQoNCkJlbiBDaGFsbWVycw0KDQoN
Cg0KDQoNCkZyb206IFhlbiBOZXdiaWUNClNlbnQ6IDI5IE9jdG9iZXIgMjAxNSAwNTo1NQ0KVG86
IFhlbiBXaW5kb3dzIFBWIERyaXZlcnMgRGV2ZWxvcG1lbnQgTWFpbGluZyBMaXN0DQpTdWJqZWN0
OiBbd2luLXB2LWRldmVsXSBTaWduZWQgV2luZG93cyBQViBEcml2ZXINCg0KDQpJJ3ZlIGFza2Vk
IHRoZSBxdWVzdGlvbnMgYXQgdGhlIFhlbiB1c2VycyBtYWlsaW5nIGxpc3QgYnV0IG5vYm9keSBo
YXMgaW50ZXJlc3QgdG8gb2ZmZXIgbWUgYSBoZWxwLiAgSWYgdGhlIHF1ZXN0aW9ucyBhcmUgdG9v
IGJhc2ljIGFuZCBzaG91bGQgbm90IGJlIHJhaXNlZCBpbiB0aGlzIGRldmVsIG1haWxpbmcgbGlz
dCwgcGxlYXNlIGZvcmdpdmUgbWUuDQoNCkkgd2FudCB0byBpbnN0YWxsIGEgc2lnbmVkIFBWIGRy
aXZlcnMgaW4gbXkgSFZNIHdpbmRvd3MgZ3Vlc3Qgc2luY2UgSSBsZWFybnQgZnJvbSB0aGUgd2Vi
IHRoYXQgYSB0ZXN0IHNpZ25lZCBkcml2ZXIgbWF5IGxlYWQgdG8gY29uZmxpY3RzIHdpdGggc29t
ZSBXaW5kb3dzIGFwcGxpY2F0aW9ucy4NCg0KSSBzdHVkaWVkIGEgbG90IGZyb20gdGhlIFhlbiBw
cm9qZWN0IHBhZ2VzIGFuZCBYZW4gbWFpbGluZyBsaXN0IGZvciB1c2VycyBhbmQgcHYgZHJpdmVy
IGRldmVsb3BtZW50LiBJIGFtIGNvbmZ1c2VkIHNpbmNlIHNvbWUgb2YgdGhlIGluZm9ybWF0aW9u
IHNlZW1zIHRvIGJlIG91dC1kYXRlZC4NCg0KSSBjb25zb2xpZGF0ZWQgd2hhdCBJIGxlYXJudCBz
byBmYXIgYW5kIHdvdWxkIGxpa2UgdG8gc2VlayBmb3IgaGVscCB0byBjbGFyaWZ5IHRoZSBmb2xs
b3dpbmcgY29uZWNwdHMgYmVmb3JlIEkgbWFrZSBteSBuZXh0IG1vdmU6DQoNCjEpIFRob3NlIHNp
Z25lZCBXaW5kb3dzIGRyaXZlcnMgcmVzaWRlZCBvbiB1bml2ZW50aW9uIHNlZW1lZCB0byBiZSBh
bHJlYWR5IG91dC1kYXRlZC4NCjIpIFRob3NlIFBWIGRyaXZlcnMgcHJvdmlkZWQgb24gaHR0cDov
L3d3dy54ZW5wcm9qZWN0Lm9yZy9kZXZlbG9wZXJzL3RlYW1zL3dpbmRvd3MtcHYtZHJpdmVycy5o
dG1sIHJlcXVpcmVzIG15IG93biBjb21waWxhdGlvbi4gVGhlIGRyaXZlcnMgY29tcGlsZWQgYXJl
IHRlc3Qgc2lnbmVkIGFuZCByZXF1aXJlcyBzZXR0aW5nIHRoZSBXaW5kb3dzIHRvIHRlc3QgbW9k
ZS4NCjMpIFRoZSBQViBkcml2ZXJzIHByb3ZpZGVkIGJ5IENpdHJpeCBYZW5TZXJ2ZXIgc2VlbXMg
dG8gd29yayBhbHNvIHdpdGggWGVuIEh5cGVydmlzb3IgYnV0IEknbSBub3Qgc3VyZSB3aGV0aGVy
IHRoZXJlIGlzIGFueSBsaWNlbnNlIGNvbmZsaWN0Lg0KNCkgVGhlcmUgYXJlIE1pY3Jvc29mdCBz
aWduZWQgUFYgZHJpdmVycyBwcm92aWRlZCBieSBPcmFjbGUgVk0gYnV0IEkgbmVlZCB0byB1c2Ug
T3JhY2xlIFZNIGFzIG15IERvbWFpbiAwIGluIG9yZGVyIHRvIHVzZSB0aGVtLg0KDQpDYW4gYW55
b25lIGNvbmZpcm0gbXkgdW5kZXJzdGFuZGluZyBhcyBmb3JlLW1lbnRpb25lZD8NCg0KSSB3YW50
IHRvIG1ha2UgYSBQQyBhcyBhIEhUUEMvTkFTIGNvbWJvIHdpdGggSFRQQyBwYXJ0IHBsYXllZCBi
eSBhIFdpbmRvd3MgNyAoV2luZG93cyAxMCBwcmVmZXJyZWQgaWYgZmVhc2libGUpIFBWIEhWTSBn
dWVzdC4NCg0KSSdtIG5vdyBzdHVjayBhdCB0aGUgcGxhbm5pbmcgc3RhZ2Ugb2YgV2luZG93cyBQ
ViBkcml2ZXJzLiBJIGRvbid0IHdhbnQgdG8gY29tcGlsZSBhbnl0aGluZyBhbmQgc2V0IHRoZSBX
aW5kb3dzIHRvIHRlc3QgbW9kZS4NCg0KU28gY2FuIEkganVzdCBkb3dubG9hZCB0aGUgUFYgZHJp
dmVycyBmcm9tIENpdHJpeCBhbmQgaW5zdGFsbGVkIHRvIHRoZSBndWVzdD8gV2lsbCBpdCB3b3Jr
IHdpdGggbXkgWGVuIDQuNS80LjYgSHlwZXJ2aXNvciB3aXRoIFVidW50dSAxNS4wNCBEb21haW4g
MD8NCg0KSSdsbCBiZSB2ZXJ5IGdyYXRlZnVsIGlmIGFueW9uZSBjYW4gaGVscCBtZS4NCg0KUmVn
YXJkcw0KTG9rDQoNCg0KDQoNCg0K

--_000_1AD33E34BA5E3649B4F6C7FE476686F4211C691CAMSPEX01CL03cit_
Content-Type: text/html; charset="utf-8"
Content-ID: <9E2572EF5530B94D8AEA9ACB94E9130C@citrix.com>
Content-Transfer-Encoding: base64

PGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIiB4
bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIiB4bWxuczptPSJo
dHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA0LzEyL29tbWwiIHhtbG5zPSJo
dHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4NCjxoZWFkPg0KPG1ldGEgaHR0cC1lcXVp
dj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KPG1l
dGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJNaWNyb3NvZnQgV29yZCAxNSAoZmlsdGVyZWQg
bWVkaXVtKSI+DQo8c3R5bGU+PCEtLQ0KLyogRm9udCBEZWZpbml0aW9ucyAqLw0KQGZvbnQtZmFj
ZQ0KCXtmb250LWZhbWlseToiQ2FtYnJpYSBNYXRoIjsNCglwYW5vc2UtMToyIDQgNSAzIDUgNCA2
IDMgMiA0O30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6Q2FsaWJyaTsNCglwYW5vc2UtMToy
IDE1IDUgMiAyIDIgNCAzIDIgNDt9DQovKiBTdHlsZSBEZWZpbml0aW9ucyAqLw0KcC5Nc29Ob3Jt
YWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbA0KCXttYXJnaW46MGNtOw0KCW1hcmdpbi1i
b3R0b206LjAwMDFwdDsNCglmb250LXNpemU6MTEuMHB0Ow0KCWZvbnQtZmFtaWx5OiJDYWxpYnJp
IixzYW5zLXNlcmlmO30NCmE6bGluaywgc3Bhbi5Nc29IeXBlcmxpbmsNCgl7bXNvLXN0eWxlLXBy
aW9yaXR5Ojk5Ow0KCWNvbG9yOmJsdWU7DQoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9DQph
OnZpc2l0ZWQsIHNwYW4uTXNvSHlwZXJsaW5rRm9sbG93ZWQNCgl7bXNvLXN0eWxlLXByaW9yaXR5
Ojk5Ow0KCWNvbG9yOiM5NTRGNzI7DQoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9DQpwDQoJ
e21zby1zdHlsZS1wcmlvcml0eTo5OTsNCgltYXJnaW46MGNtOw0KCW1hcmdpbi1ib3R0b206LjAw
MDFwdDsNCglmb250LXNpemU6MTEuMHB0Ow0KCWZvbnQtZmFtaWx5OiJDYWxpYnJpIixzYW5zLXNl
cmlmO30NCi5Nc29DaHBEZWZhdWx0DQoJe21zby1zdHlsZS10eXBlOmV4cG9ydC1vbmx5O30NCkBw
YWdlIFdvcmRTZWN0aW9uMQ0KCXtzaXplOjYxMi4wcHQgNzkyLjBwdDsNCgltYXJnaW46NzIuMHB0
IDcyLjBwdCA3Mi4wcHQgNzIuMHB0O30NCmRpdi5Xb3JkU2VjdGlvbjENCgl7cGFnZTpXb3JkU2Vj
dGlvbjE7fQ0KLS0+PC9zdHlsZT4NCjwvaGVhZD4NCjxib2R5IGxhbmc9IkVOLUdCIiBsaW5rPSJi
bHVlIiB2bGluaz0iIzk1NEY3MiI+DQo8ZGl2IGNsYXNzPSJXb3JkU2VjdGlvbjEiPg0KPHA+Tm8s
IHNvcnJ5LCBwb3NzaWJseSBJIHdhcyB1bmNsZWFyPC9wPg0KPHA+PG86cD4mbmJzcDs8L286cD48
L3A+DQo8cD5BIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIGlzIHRoZSBzYW1lIGFzIGEgdGVzdCBz
aWduZWQgY2VydCDigJMgYW5kIHlvdeKAmWxsIG5lZWQgdG8gaGF2ZSB0ZXN0IHNpZ25pbmcgdHVy
bmVkIG9uLjwvcD4NCjxwPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHA+QnV0IGlmIHlvdSBoYXZl
IGEgY2VydGlmaWNhdGUgc2lnbmVkIGJ5IHZlcmlzaWduIChvciBzaW1pbGFyKSwgeW91IGNhbiB1
c2UgdGhhdCB0byBzaWduIHRoZSBjb2RlIGFuZCBhdm9pZCBuZWVkaW5nIHRvIHR1cm4gdGVzdCBz
aWduaW5nIG9uLjwvcD4NCjxwPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHA+SSBkb27igJl0IGtu
b3cgb2YgYW55IHByb2JsZW1zIHdpdGggdGhlIFBWIGRyaXZlcnMgYW5kIHdpbmRvd3MgMTAgKFRo
ZXJlIHdlcmUgd2l0aCBDaXRyaXggLyBYZW5TZXJ2ZXIgZHJpdmVycywgYnV0IHRoZSBkcml2ZXJz
IGluIHJlY2VudCBob3RmaXhlcyBoYXZlIGZpeGVkIHRob3NlIHByb2JsZW1zKTwvcD4NCjxwPjxv
OnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHA+QmVuIENoYWxtZXJzPC9wPg0KPHA+PG86cD4mbmJzcDs8
L286cD48L3A+DQo8cD48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxkaXYgc3R5bGU9Im1zby1lbGVt
ZW50OnBhcmEtYm9yZGVyLWRpdjtib3JkZXI6bm9uZTtib3JkZXItdG9wOnNvbGlkICNFMUUxRTEg
MS4wcHQ7cGFkZGluZzozLjBwdCAwY20gMGNtIDBjbSI+DQo8cCBzdHlsZT0iYm9yZGVyOm5vbmU7
cGFkZGluZzowY20iPjxicj4NCjxiPkZyb206IDwvYj5YZW4gTmV3YmllPGJyPg0KPGI+U2VudDog
PC9iPjI5IE9jdG9iZXIgMjAxNSAxMDowMjxicj4NCjxiPlRvOiA8L2I+QmVuIENoYWxtZXJzPGJy
Pg0KPGI+Q2M6IDwvYj5YZW4gV2luZG93cyBQViBEcml2ZXJzIERldmVsb3BtZW50IE1haWxpbmcg
TGlzdDxicj4NCjxiPlN1YmplY3Q6IDwvYj5SZTogW3dpbi1wdi1kZXZlbF0gU2lnbmVkIFdpbmRv
d3MgUFYgRHJpdmVyPC9wPg0KPC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNw
OzwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWls
eTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9z
cGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIu
MHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZiI+SSdtIHZl
cnkgZ3JhdGVmdWwgdG8geW91ciBoZWxwLg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6
MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZiI+PG86
cD48L286cD48L3NwYW4+PC9wPg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0
eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZx
dW90OyxzZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0K
PHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1m
YW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj5TbyBpZiBJIGhhdmUgYSBz
ZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSBhbmQgaW1wb3J0IGl0IHRvIFdpbmRvd3MncyBUcnVzdGVk
IFJvb3QgQ0EgaW4gdGhlIGNlcnRpZmljYXRlIHN0b3JlLCBJIGNhbiBwcm9wZXJseSBpbnN0YWxs
IHNlbGYgY29tcGlsZWQgUFYgZHJpdmVycyBzaWduZWQgYnkgdGhhdA0KIGNlcnRpZmljYXRlIHRv
IHRoYXQgV2luZG93cyBndWVzdC4mbmJzcDsgSXMgbXkgdW5kZXJzdGFuZGluZyBjb3JyZWN0Pzxv
OnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi
PjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5l
dyBSb21hbiZxdW90OyxzZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+
DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4w
cHQ7Zm9udC1mYW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj5JIHNhdyBh
IGxvdCBtYWlscyBpbiB0aGlzIG1haWxpbmcgbGlzdCBkaXNjdXNzaW5nIGZhaWx1cmUgb2YgUFYg
ZHJpdmVycyB3b3JraW5nIHVuZGVyIFdpbmRvd3MgMTAuJm5ic3A7IERvZXMgaXQgbWVhbiB0aGUg
UFYgZHJpdmVycyBhcmUgbm90IHlldCBzdGFibGUgZW5vdWdoIHRvIHdvcmsgdW5kZXIgV2luZG93
cw0KIDEwPzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJN
c29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90
O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9w
Pg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQt
c2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlm
Ij5SZWdhcmRzPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9
Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6JnF1
b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj5UZXJyeTxvOnA+PC9vOnA+PC9zcGFuPjwv
cD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250
LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJp
ZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3Jt
YWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVz
IE5ldyBSb21hbiZxdW90OyxzZXJpZiI+T24gVGh1LCBPY3QgMjksIDIwMTUgYXQgNDo1MiBQTSwg
QmVuIENoYWxtZXJzICZsdDs8YSBocmVmPSJtYWlsdG86YmVuLmNoYWxtZXJzQGNpdHJpeC5jb20i
PmJlbi5jaGFsbWVyc0BjaXRyaXguY29tPC9hPiZndDsgd3JvdGU6PG86cD48L286cD48L3NwYW4+
PC9wPg0KPGJsb2NrcXVvdGUgc3R5bGU9ImJvcmRlcjpub25lO2JvcmRlci1sZWZ0OnNvbGlkICND
Q0NDQ0MgMS4wcHQ7cGFkZGluZzowY20gMGNtIDBjbSA2LjBwdDttYXJnaW4tbGVmdDo0LjhwdDtt
YXJnaW4tcmlnaHQ6MGNtIj4NCjxkaXY+DQo8ZGl2Pg0KPHA+VGhvc2Ugc3RhdGVtZW50cyBhcmUg
Y29ycmVjdC48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtU
aW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwPiZu
YnNwOzwvcD4NCjxwPlRoZSBkcml2ZXJzIHByb3ZpZGVkIGJ5IENpdHJpeCBYZW5TZXJ2ZXIgYXJl
IGZyb20gdGhlIHNhbWUgY29kZSBiYXNlIGFzIHRoZSBYZW4gcHJvamVjdCBQViBkcml2ZXJzIOKA
kyBidXQgYXJlIGN1cnJlbnRseSBvbGRlciAoYW5kIHRha2VuIGZyb20gYSBwb2ludCBiZWZvcmUg
dGhlIGRyaXZlcnMgd2VyZSBoYW5kZWQgb3ZlciBmcm9tIHRoZSBYZW5TZXJ2ZXIgcHJvamVjdCB0
byB0aGUgWGVuIHByb2plY3QpLiZuYnNwOyBUaG9zZSBkcml2ZXJzIGhhdmUgQlNEDQogbGljZW5z
ZWQgc291cmNlIGNvZGUgKGFzIGRvIHRoZSBYZW4gcHJvamVjdCBkcml2ZXJzKSBzbyB0aGVyZSBz
aG91bGRu4oCZdCBiZSBhIGNvbmZsaWN0IChidXQgZG9u4oCZdCB0cnVzdCBtZSDigJMgSeKAmW0g
bm90IGEgbGF3eWVyIGFuZCBub3Qgc3BlYWtpbmcgZm9yIENpdHJpeCBoZXJlKTwvcD4NCjxwPiZu
YnNwOzwvcD4NCjxwPkkgd291bGQgZXhwZWN0IHRoZSBDaXRyaXggZHJpdmVycyB0byB3b3JrIHdp
dGggWGVuIChidXQgbm8gcHJvbWlzZXMsIFlNTVYhKS4mbmJzcDsgQW5kIGdvaW5nIGZvcndhcmRz
IChhcyBDaXRyaXggUFYgZHJpdmVycyBhcmUgaW5jcmVhc2luZ2x5IGJ1aWx0IGZyb20gWGVuIHBy
b2plY3QgcmF0aGVyIHRoZW4gdGhlIFhlblNlcnZlciBwcm9qZWN0IGNvZGUpIHRoaXMgd2lsbCBi
ZSBtb3JlIGFuZCBtb3JlIGxpa2VseS48L3A+DQo8cD4mbmJzcDs8L3A+DQo8cD4oaW5jaWRlbnRh
bGx5LCBpZiB5b3UgaGF2ZSBhIGNvZGUgc2lnbmluZyBjZXJ0IHdpdGggYSBjaGFpbiBvZiB0cnVz
dCBiYWNrIHRvIGEgcm9vdCBwcm92aWRlciwgeW91IGNhbiBzaWduIGFueSBkcml2ZXJzIHlvdSBi
dWlsZCDigJMgYW5kIHRoZW4gaW5zdGFsbCB0aG9zZSBjZXJ0aWZpY2F0ZXMgaW50byBXaW5kb3dz
IOKAkyBhdm9pZGluZyB3b3JyeWluZyBhYm91dCBuZWVkaW5nIHRvIHR1cm4gdGVzdCBzaWduaW5n
IG9uLiZuYnNwOyBOb3Qgc3VyZSBpZiB0aGF0DQogaGVscHMpPC9wPg0KPHA+Jm5ic3A7PC9wPg0K
PHA+QmVuIENoYWxtZXJzPC9wPg0KPHA+Jm5ic3A7PC9wPg0KPHA+Jm5ic3A7PC9wPg0KPGRpdiBz
dHlsZT0iYm9yZGVyOm5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAjRTFFMUUxIDEuMHB0O3BhZGRpbmc6
My4wcHQgMGNtIDBjbSAwY20iPg0KPHA+PGJyPg0KPGI+RnJvbTogPC9iPlhlbiBOZXdiaWU8YnI+
DQo8Yj5TZW50OiA8L2I+MjkgT2N0b2JlciAyMDE1IDA1OjU1PGJyPg0KPGI+VG86IDwvYj5YZW4g
V2luZG93cyBQViBEcml2ZXJzIERldmVsb3BtZW50IE1haWxpbmcgTGlzdDxicj4NCjxiPlN1Ympl
Y3Q6IDwvYj5bd2luLXB2LWRldmVsXSBTaWduZWQgV2luZG93cyBQViBEcml2ZXI8L3A+DQo8L2Rp
dj4NCjxkaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+Jm5ic3A7PC9wPg0KPHAgY2xh
c3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBS
b21hbiZxdW90OyxzZXJpZiI+Jm5ic3A7PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi
PjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5l
dyBSb21hbiZxdW90OyxzZXJpZiI+SSd2ZSBhc2tlZCB0aGUgcXVlc3Rpb25zIGF0IHRoZSBYZW4g
dXNlcnMgbWFpbGluZyBsaXN0IGJ1dCBub2JvZHkgaGFzIGludGVyZXN0IHRvIG9mZmVyIG1lIGEg
aGVscC4mbmJzcDsgSWYgdGhlIHF1ZXN0aW9ucyBhcmUgdG9vIGJhc2ljIGFuZCBzaG91bGQgbm90
IGJlIHJhaXNlZCBpbiB0aGlzIGRldmVsDQogbWFpbGluZyBsaXN0LCBwbGVhc2UgZm9yZ2l2ZSBt
ZS48L3NwYW4+PC9wPg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJm
b250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90Oyxz
ZXJpZiI+Jm5ic3A7PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3Jt
YWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVz
IE5ldyBSb21hbiZxdW90OyxzZXJpZiI+SSB3YW50IHRvIGluc3RhbGwgYSBzaWduZWQgUFYgZHJp
dmVycyBpbiBteSBIVk0gd2luZG93cyBndWVzdCBzaW5jZSBJIGxlYXJudCBmcm9tIHRoZSB3ZWIg
dGhhdCBhIHRlc3Qgc2lnbmVkIGRyaXZlciBtYXkgbGVhZCB0byBjb25mbGljdHMgd2l0aCBzb21l
IFdpbmRvd3MgYXBwbGljYXRpb25zLjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFz
cz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTom
cXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPiZuYnNwOzwvc3Bhbj48L3A+DQo8L2Rp
dj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEy
LjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPkkgc3R1
ZGllZCBhIGxvdCBmcm9tIHRoZSBYZW4gcHJvamVjdCBwYWdlcyBhbmQgWGVuIG1haWxpbmcgbGlz
dCBmb3IgdXNlcnMgYW5kIHB2IGRyaXZlciBkZXZlbG9wbWVudC4gSSBhbSBjb25mdXNlZCBzaW5j
ZSBzb21lIG9mIHRoZSBpbmZvcm1hdGlvbiBzZWVtcyB0byBiZSBvdXQtZGF0ZWQuJm5ic3A7PC9z
cGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxl
PSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90
OyxzZXJpZiI+Jm5ic3A7PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29O
b3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1Rp
bWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZiI+SSBjb25zb2xpZGF0ZWQgd2hhdCBJIGxlYXJudCBz
byBmYXIgYW5kIHdvdWxkIGxpa2UgdG8gc2VlayBmb3IgaGVscCB0byBjbGFyaWZ5IHRoZSBmb2xs
b3dpbmcgY29uZWNwdHMgYmVmb3JlIEkgbWFrZSBteSBuZXh0IG1vdmU6PC9zcGFuPjwvcD4NCjwv
ZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6
MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZiI+Jm5i
c3A7PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFu
IHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21h
biZxdW90OyxzZXJpZiI+MSkgVGhvc2Ugc2lnbmVkIFdpbmRvd3MgZHJpdmVycyByZXNpZGVkIG9u
IHVuaXZlbnRpb24gc2VlbWVkIHRvIGJlIGFscmVhZHkgb3V0LWRhdGVkLjwvc3Bhbj48L3A+DQo8
L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXpl
OjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPjIp
IFRob3NlIFBWIGRyaXZlcnMgcHJvdmlkZWQgb24NCjxhIGhyZWY9Imh0dHA6Ly93d3cueGVucHJv
amVjdC5vcmcvZGV2ZWxvcGVycy90ZWFtcy93aW5kb3dzLXB2LWRyaXZlcnMuaHRtbCIgdGFyZ2V0
PSJfQkxBTksiPg0KaHR0cDovL3d3dy54ZW5wcm9qZWN0Lm9yZy9kZXZlbG9wZXJzL3RlYW1zL3dp
bmRvd3MtcHYtZHJpdmVycy5odG1sPC9hPiByZXF1aXJlcyBteSBvd24gY29tcGlsYXRpb24uIFRo
ZSBkcml2ZXJzIGNvbXBpbGVkIGFyZSB0ZXN0IHNpZ25lZCBhbmQgcmVxdWlyZXMgc2V0dGluZyB0
aGUgV2luZG93cyB0byB0ZXN0IG1vZGUuPC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNs
YXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5
OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZiI+MykgVGhlIFBWIGRyaXZlcnMgcHJv
dmlkZWQgYnkgQ2l0cml4IFhlblNlcnZlciBzZWVtcyB0byB3b3JrIGFsc28gd2l0aCBYZW4gSHlw
ZXJ2aXNvciBidXQgSSdtIG5vdCBzdXJlIHdoZXRoZXIgdGhlcmUgaXMgYW55IGxpY2Vuc2UgY29u
ZmxpY3QuPC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxz
cGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBS
b21hbiZxdW90OyxzZXJpZiI+NCkgVGhlcmUgYXJlIE1pY3Jvc29mdCBzaWduZWQgUFYgZHJpdmVy
cyBwcm92aWRlZCBieSBPcmFjbGUgVk0gYnV0IEkgbmVlZCB0byB1c2UgT3JhY2xlIFZNIGFzIG15
IERvbWFpbiAwIGluIG9yZGVyIHRvIHVzZSB0aGVtLjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+
DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250
LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPiZuYnNwOzwvc3Bhbj48
L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9u
dC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2Vy
aWYiPkNhbiBhbnlvbmUgY29uZmlybSBteSB1bmRlcnN0YW5kaW5nIGFzIGZvcmUtbWVudGlvbmVk
Pzwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBz
dHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4m
cXVvdDssc2VyaWYiPiZuYnNwOzwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0i
TXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVv
dDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPkkgd2FudCB0byBtYWtlIGEgUEMgYXMgYSBI
VFBDL05BUyBjb21ibyB3aXRoIEhUUEMgcGFydCBwbGF5ZWQgYnkgYSBXaW5kb3dzIDcgKFdpbmRv
d3MgMTAgcHJlZmVycmVkIGlmIGZlYXNpYmxlKSBQViBIVk0gZ3Vlc3QuPC9zcGFuPjwvcD4NCjwv
ZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6
MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZiI+Jm5i
c3A7PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFu
IHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21h
biZxdW90OyxzZXJpZiI+SSdtIG5vdyBzdHVjayBhdCB0aGUgcGxhbm5pbmcgc3RhZ2Ugb2YgV2lu
ZG93cyBQViBkcml2ZXJzLiBJIGRvbid0IHdhbnQgdG8gY29tcGlsZSBhbnl0aGluZyBhbmQgc2V0
IHRoZSBXaW5kb3dzIHRvIHRlc3QgbW9kZS48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAg
Y2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1p
bHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj4mbmJzcDs8L3NwYW4+PC9wPg0K
PC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6
ZToxMi4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmIj5T
byBjYW4gSSBqdXN0IGRvd25sb2FkIHRoZSBQViBkcml2ZXJzIGZyb20gQ2l0cml4IGFuZCBpbnN0
YWxsZWQgdG8gdGhlIGd1ZXN0PyBXaWxsIGl0IHdvcmsgd2l0aCBteSBYZW4gNC41LzQuNiBIeXBl
cnZpc29yIHdpdGggVWJ1bnR1IDE1LjA0IERvbWFpbiAwPzwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxk
aXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtm
b250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWYiPiZuYnNwOzwvc3Bh
bj48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0i
Zm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDss
c2VyaWYiPkknbGwgYmUgdmVyeSBncmF0ZWZ1bCBpZiBhbnlvbmUgY2FuIGhlbHAgbWUuPC9zcGFu
PjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJm
b250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90Oyxz
ZXJpZiI+Jm5ic3A7PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3Jt
YWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVz
IE5ldyBSb21hbiZxdW90OyxzZXJpZiI+UmVnYXJkczwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxwIGNs
YXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5
OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZiI+TG9rPC9zcGFuPjwvcD4NCjxwIGNs
YXNzPSJNc29Ob3JtYWwiPiZuYnNwOzwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPiZuYnNwOzwv
cD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ibG9ja3F1b3RlPg0KPC9kaXY+
DQo8L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIu
MHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZiI+PG86cD4m
bmJzcDs8L286cD48L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8
L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjwv
ZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0K

--_000_1AD33E34BA5E3649B4F6C7FE476686F4211C691CAMSPEX01CL03cit_--


--===============2515826817608195151==
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
--===============2515826817608195151==--


From win-pv-devel-bounces@lists.xenproject.org Thu Oct 29 14:51:33 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 14:51:33 +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 1ZroY8-0006TR-GJ; Thu, 29 Oct 2015 14:51:32 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7374c8f9b=owen.smith@citrix.com>)
	id 1ZroY7-0006TI-UL
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 14:51:32 +0000
Received: from [193.109.254.147] by server-15.bemta-14.messagelabs.com id
	BC/5F-18886-37232365; Thu, 29 Oct 2015 14:51:31 +0000
X-Env-Sender: prvs=7374c8f9b=owen.smith@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1446130289!26647314!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 26705 invoked from network); 29 Oct 2015 14:51:30 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	29 Oct 2015 14:51:30 -0000
X-IronPort-AV: E=Sophos;i="5.20,214,1444694400"; d="scan'208";a="314344686"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Thu, 29 Oct 2015 14:49:43 +0000
Message-ID: <1446130187-30460-3-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
References: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA2
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 2/6] Refactor WmiFireSuspendEvent
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

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xeniface/fdo.c |  2 +-
 src/xeniface/wmi.c | 29 ++++++++++++++++++-----------
 src/xeniface/wmi.h |  9 +++++----
 3 files changed, 24 insertions(+), 16 deletions(-)

diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index f7aa542..b32e506 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -782,7 +782,7 @@ FdoD3ToD0(
     status = XENBUS_SUSPEND(Register,
                             &Fdo->SuspendInterface,
                             SUSPEND_CALLBACK_LATE,
-                            FireSuspendEvent,
+                            WmiFireSuspendEvent,
                             Fdo,
                             &Fdo->SuspendCallbackLate);
     if (!NT_SUCCESS(status))
diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
index 0b14e9b..0ae87d4 100644
--- a/src/xeniface/wmi.c
+++ b/src/xeniface/wmi.c
@@ -753,18 +753,25 @@ SessionFindWatchLocked(XenStoreSession *session,
 
 }
 
-void FireSuspendEvent(PXENIFACE_FDO fdoData) {
-    XenIfaceDebugPrint(ERROR,"Ready to unsuspend Event\n");
-    KeSetEvent(&fdoData->registryWriteEvent, IO_NO_INCREMENT, FALSE);
-    if (fdoData->WmiReady) {
-        XenIfaceDebugPrint(TRACE,"Fire Suspend Event\n");
-        WmiFireEvent(fdoData->Dx->DeviceObject,
-                     (LPGUID)&OBJECT_GUID(XenStoreUnsuspendedEvent),
-                     0,
-                     0,
-                     NULL);
-    }
+VOID
+WmiFireSuspendEvent(
+    IN  PXENIFACE_FDO   Fdo
+    )
+{
+    XenIfaceDebugPrint(ERROR, "Ready to unsuspend Event\n");
+    KeSetEvent(&Fdo->registryWriteEvent, IO_NO_INCREMENT, FALSE);
+
+    if (!Fdo->WmiReady)
+        return;
+
+    XenIfaceDebugPrint(TRACE, "Fire Suspend Event\n");
+    WmiFireEvent(Fdo->Dx->DeviceObject,
+                 (LPGUID)&OBJECT_GUID(XenStoreUnsuspendedEvent),
+                 0,
+                 0,
+                 NULL);
 }
+
 void FireWatch(XenStoreWatch* watch) {
     UCHAR * eventdata;
     ULONG RequiredSize;
diff --git a/src/xeniface/wmi.h b/src/xeniface/wmi.h
index f677ee3..b9dd256 100644
--- a/src/xeniface/wmi.h
+++ b/src/xeniface/wmi.h
@@ -43,6 +43,11 @@ WmiProcessMinorFunction(
     IN  PIRP            Irp
     );
 
+extern VOID
+WmiFireSuspendEvent(
+    IN  PXENIFACE_FDO   Fdo
+    );
+
 NTSTATUS
 WmiInit(
     PXENIFACE_FDO FdoData
@@ -54,10 +59,6 @@ WmiFinalise(
     PXENIFACE_FDO FdoData
 ); 
 
-void FireSuspendEvent(
-    IN OUT PXENIFACE_FDO fdoData
-    );
-
 void SessionsResumeAll(
     XENIFACE_FDO *fdoData
 );
-- 
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 Thu Oct 29 14:51:33 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 14:51:33 +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 1ZroY9-0006TV-HV; Thu, 29 Oct 2015 14:51:33 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7374c8f9b=owen.smith@citrix.com>)
	id 1ZroY8-0006TI-9f
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 14:51:32 +0000
Received: from [193.109.254.147] by server-15.bemta-14.messagelabs.com id
	E2/6F-18886-37232365; Thu, 29 Oct 2015 14:51:31 +0000
X-Env-Sender: prvs=7374c8f9b=owen.smith@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1446130289!26647314!2
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 26783 invoked from network); 29 Oct 2015 14:51:31 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	29 Oct 2015 14:51:31 -0000
X-IronPort-AV: E=Sophos;i="5.20,214,1444694400"; d="scan'208";a="314344691"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Thu, 29 Oct 2015 14:49:45 +0000
Message-ID: <1446130187-30460-5-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
References: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA2
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 4/6] Rework Wmi setup/cleanup to always
	Resume/Suspend sessions
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

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xeniface/fdo.c | 47 ++++++++++++++++-------------------------------
 src/xeniface/wmi.c |  3 +++
 2 files changed, 19 insertions(+), 31 deletions(-)

diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index 10ead15..2b3e44d 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -741,20 +741,6 @@ __FdoD0ToD3(
     Trace("<====\n");
 }
 
-static DECLSPEC_NOINLINE VOID
-FdoSuspendCallbackLate(
-    IN  PVOID   Argument
-    )
-{
-    PXENIFACE_FDO Fdo = (PXENIFACE_FDO) Argument;
-    NTSTATUS    status;
-
-    __FdoD0ToD3(Fdo);
-
-    status = __FdoD3ToD0(Fdo);
-    ASSERT(NT_SUCCESS(status));
-}
-
 static DECLSPEC_NOINLINE NTSTATUS
 FdoD3ToD0(
     IN  PXENIFACE_FDO Fdo
@@ -791,6 +777,8 @@ FdoD3ToD0(
     Fdo->InterfacesAcquired = TRUE;
     KeLowerIrql(Irql);
 
+    WmiSessionsResumeAll(Fdo);
+
     return STATUS_SUCCESS;
 
 fail4:
@@ -824,8 +812,11 @@ FdoD0ToD3(
     KIRQL           Irql;
 
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
-    Fdo->InterfacesAcquired = FALSE;
+
+    WmiSessionsSuspendAll(Fdo);
+
     KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+    Fdo->InterfacesAcquired = FALSE;
 
     XENBUS_SUSPEND(Deregister,
                    &Fdo->SuspendInterface,
@@ -886,24 +877,20 @@ FdoStartDevice(
      FdoS4ToS3(Fdo);
     __FdoSetSystemPowerState(Fdo, PowerSystemWorking);
 
-    status = FdoD3ToD0(Fdo);
+    status = WmiRegister(Fdo);
     if (!NT_SUCCESS(status))
         goto fail3;
 
-    status =  IoSetDeviceInterfaceState(&Fdo->InterfaceName, TRUE);
+    status = FdoD3ToD0(Fdo);
     if (!NT_SUCCESS(status))
         goto fail4;
 
-
-    if (__FdoGetDevicePnpState(Fdo) != Stopped) {
-        status = WmiRegister(Fdo);
-        if (!NT_SUCCESS(status))
-            goto fail5;
-    }
+    status =  IoSetDeviceInterfaceState(&Fdo->InterfaceName, TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail5;
 
     __FdoSetDevicePnpState(Fdo, Started);
 
-
     status = Irp->IoStatus.Status;
     IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
@@ -911,12 +898,12 @@ FdoStartDevice(
 
 fail5:
     Error("fail5\n");
-#pragma warning(suppress : 6031)
-    IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
+    FdoD0ToD3(Fdo);
 
 fail4:
     Error("fail4\n");
-    FdoD0ToD3(Fdo);
+
+    WmiDeregister(Fdo);
 
 fail3:
     Error("fail3\n");
@@ -981,6 +968,7 @@ FdoStopDevice(
     NTSTATUS        status;
 
     FdoD0ToD3(Fdo);
+    WmiDeregister(Fdo);
 
     __FdoSetSystemPowerState(Fdo, PowerSystemSleeping3);
     FdoS3ToS4(Fdo);
@@ -1335,7 +1323,6 @@ __FdoSetDevicePowerUp(
 
     ASSERT3U(DeviceState, ==, PowerDeviceD0);
     status = FdoD3ToD0(Fdo);
-    WmiSessionsResumeAll(Fdo);
     ASSERT(NT_SUCCESS(status));
 
 done:
@@ -1367,10 +1354,8 @@ __FdoSetDevicePowerDown(
 
     ASSERT3U(DeviceState, ==, PowerDeviceD3);
 
-    if (__FdoGetDevicePowerState(Fdo) == PowerDeviceD0){
-        WmiSessionsSuspendAll(Fdo);
+    if (__FdoGetDevicePowerState(Fdo) == PowerDeviceD0)
         FdoD0ToD3(Fdo);
-    }
 
     IoSkipCurrentIrpStackLocation(Irp);
     status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
index 1ae84e1..0f63ef5 100644
--- a/src/xeniface/wmi.c
+++ b/src/xeniface/wmi.c
@@ -1327,6 +1327,9 @@ WmiRegister(
 {
     NTSTATUS            status;
 
+    if (Fdo->WmiReady)
+        return STATUS_SUCCESS;
+
     XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__);
     XenIfaceDebugPrint(INFO,"DRV: XenIface WMI Initialisation\n");
 
-- 
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 Thu Oct 29 14:51:33 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 14:51:33 +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 1ZroY8-0006TR-GJ; Thu, 29 Oct 2015 14:51:32 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7374c8f9b=owen.smith@citrix.com>)
	id 1ZroY7-0006TI-UL
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 14:51:32 +0000
Received: from [193.109.254.147] by server-15.bemta-14.messagelabs.com id
	BC/5F-18886-37232365; Thu, 29 Oct 2015 14:51:31 +0000
X-Env-Sender: prvs=7374c8f9b=owen.smith@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1446130289!26647314!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 26705 invoked from network); 29 Oct 2015 14:51:30 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	29 Oct 2015 14:51:30 -0000
X-IronPort-AV: E=Sophos;i="5.20,214,1444694400"; d="scan'208";a="314344686"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Thu, 29 Oct 2015 14:49:43 +0000
Message-ID: <1446130187-30460-3-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
References: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA2
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 2/6] Refactor WmiFireSuspendEvent
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

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xeniface/fdo.c |  2 +-
 src/xeniface/wmi.c | 29 ++++++++++++++++++-----------
 src/xeniface/wmi.h |  9 +++++----
 3 files changed, 24 insertions(+), 16 deletions(-)

diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index f7aa542..b32e506 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -782,7 +782,7 @@ FdoD3ToD0(
     status = XENBUS_SUSPEND(Register,
                             &Fdo->SuspendInterface,
                             SUSPEND_CALLBACK_LATE,
-                            FireSuspendEvent,
+                            WmiFireSuspendEvent,
                             Fdo,
                             &Fdo->SuspendCallbackLate);
     if (!NT_SUCCESS(status))
diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
index 0b14e9b..0ae87d4 100644
--- a/src/xeniface/wmi.c
+++ b/src/xeniface/wmi.c
@@ -753,18 +753,25 @@ SessionFindWatchLocked(XenStoreSession *session,
 
 }
 
-void FireSuspendEvent(PXENIFACE_FDO fdoData) {
-    XenIfaceDebugPrint(ERROR,"Ready to unsuspend Event\n");
-    KeSetEvent(&fdoData->registryWriteEvent, IO_NO_INCREMENT, FALSE);
-    if (fdoData->WmiReady) {
-        XenIfaceDebugPrint(TRACE,"Fire Suspend Event\n");
-        WmiFireEvent(fdoData->Dx->DeviceObject,
-                     (LPGUID)&OBJECT_GUID(XenStoreUnsuspendedEvent),
-                     0,
-                     0,
-                     NULL);
-    }
+VOID
+WmiFireSuspendEvent(
+    IN  PXENIFACE_FDO   Fdo
+    )
+{
+    XenIfaceDebugPrint(ERROR, "Ready to unsuspend Event\n");
+    KeSetEvent(&Fdo->registryWriteEvent, IO_NO_INCREMENT, FALSE);
+
+    if (!Fdo->WmiReady)
+        return;
+
+    XenIfaceDebugPrint(TRACE, "Fire Suspend Event\n");
+    WmiFireEvent(Fdo->Dx->DeviceObject,
+                 (LPGUID)&OBJECT_GUID(XenStoreUnsuspendedEvent),
+                 0,
+                 0,
+                 NULL);
 }
+
 void FireWatch(XenStoreWatch* watch) {
     UCHAR * eventdata;
     ULONG RequiredSize;
diff --git a/src/xeniface/wmi.h b/src/xeniface/wmi.h
index f677ee3..b9dd256 100644
--- a/src/xeniface/wmi.h
+++ b/src/xeniface/wmi.h
@@ -43,6 +43,11 @@ WmiProcessMinorFunction(
     IN  PIRP            Irp
     );
 
+extern VOID
+WmiFireSuspendEvent(
+    IN  PXENIFACE_FDO   Fdo
+    );
+
 NTSTATUS
 WmiInit(
     PXENIFACE_FDO FdoData
@@ -54,10 +59,6 @@ WmiFinalise(
     PXENIFACE_FDO FdoData
 ); 
 
-void FireSuspendEvent(
-    IN OUT PXENIFACE_FDO fdoData
-    );
-
 void SessionsResumeAll(
     XENIFACE_FDO *fdoData
 );
-- 
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 Thu Oct 29 14:51:33 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 14:51:33 +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 1ZroY9-0006TV-HV; Thu, 29 Oct 2015 14:51:33 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7374c8f9b=owen.smith@citrix.com>)
	id 1ZroY8-0006TI-9f
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 14:51:32 +0000
Received: from [193.109.254.147] by server-15.bemta-14.messagelabs.com id
	E2/6F-18886-37232365; Thu, 29 Oct 2015 14:51:31 +0000
X-Env-Sender: prvs=7374c8f9b=owen.smith@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1446130289!26647314!2
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 26783 invoked from network); 29 Oct 2015 14:51:31 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	29 Oct 2015 14:51:31 -0000
X-IronPort-AV: E=Sophos;i="5.20,214,1444694400"; d="scan'208";a="314344691"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Thu, 29 Oct 2015 14:49:45 +0000
Message-ID: <1446130187-30460-5-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
References: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA2
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 4/6] Rework Wmi setup/cleanup to always
	Resume/Suspend sessions
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

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xeniface/fdo.c | 47 ++++++++++++++++-------------------------------
 src/xeniface/wmi.c |  3 +++
 2 files changed, 19 insertions(+), 31 deletions(-)

diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index 10ead15..2b3e44d 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -741,20 +741,6 @@ __FdoD0ToD3(
     Trace("<====\n");
 }
 
-static DECLSPEC_NOINLINE VOID
-FdoSuspendCallbackLate(
-    IN  PVOID   Argument
-    )
-{
-    PXENIFACE_FDO Fdo = (PXENIFACE_FDO) Argument;
-    NTSTATUS    status;
-
-    __FdoD0ToD3(Fdo);
-
-    status = __FdoD3ToD0(Fdo);
-    ASSERT(NT_SUCCESS(status));
-}
-
 static DECLSPEC_NOINLINE NTSTATUS
 FdoD3ToD0(
     IN  PXENIFACE_FDO Fdo
@@ -791,6 +777,8 @@ FdoD3ToD0(
     Fdo->InterfacesAcquired = TRUE;
     KeLowerIrql(Irql);
 
+    WmiSessionsResumeAll(Fdo);
+
     return STATUS_SUCCESS;
 
 fail4:
@@ -824,8 +812,11 @@ FdoD0ToD3(
     KIRQL           Irql;
 
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
-    Fdo->InterfacesAcquired = FALSE;
+
+    WmiSessionsSuspendAll(Fdo);
+
     KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+    Fdo->InterfacesAcquired = FALSE;
 
     XENBUS_SUSPEND(Deregister,
                    &Fdo->SuspendInterface,
@@ -886,24 +877,20 @@ FdoStartDevice(
      FdoS4ToS3(Fdo);
     __FdoSetSystemPowerState(Fdo, PowerSystemWorking);
 
-    status = FdoD3ToD0(Fdo);
+    status = WmiRegister(Fdo);
     if (!NT_SUCCESS(status))
         goto fail3;
 
-    status =  IoSetDeviceInterfaceState(&Fdo->InterfaceName, TRUE);
+    status = FdoD3ToD0(Fdo);
     if (!NT_SUCCESS(status))
         goto fail4;
 
-
-    if (__FdoGetDevicePnpState(Fdo) != Stopped) {
-        status = WmiRegister(Fdo);
-        if (!NT_SUCCESS(status))
-            goto fail5;
-    }
+    status =  IoSetDeviceInterfaceState(&Fdo->InterfaceName, TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail5;
 
     __FdoSetDevicePnpState(Fdo, Started);
 
-
     status = Irp->IoStatus.Status;
     IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
@@ -911,12 +898,12 @@ FdoStartDevice(
 
 fail5:
     Error("fail5\n");
-#pragma warning(suppress : 6031)
-    IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
+    FdoD0ToD3(Fdo);
 
 fail4:
     Error("fail4\n");
-    FdoD0ToD3(Fdo);
+
+    WmiDeregister(Fdo);
 
 fail3:
     Error("fail3\n");
@@ -981,6 +968,7 @@ FdoStopDevice(
     NTSTATUS        status;
 
     FdoD0ToD3(Fdo);
+    WmiDeregister(Fdo);
 
     __FdoSetSystemPowerState(Fdo, PowerSystemSleeping3);
     FdoS3ToS4(Fdo);
@@ -1335,7 +1323,6 @@ __FdoSetDevicePowerUp(
 
     ASSERT3U(DeviceState, ==, PowerDeviceD0);
     status = FdoD3ToD0(Fdo);
-    WmiSessionsResumeAll(Fdo);
     ASSERT(NT_SUCCESS(status));
 
 done:
@@ -1367,10 +1354,8 @@ __FdoSetDevicePowerDown(
 
     ASSERT3U(DeviceState, ==, PowerDeviceD3);
 
-    if (__FdoGetDevicePowerState(Fdo) == PowerDeviceD0){
-        WmiSessionsSuspendAll(Fdo);
+    if (__FdoGetDevicePowerState(Fdo) == PowerDeviceD0)
         FdoD0ToD3(Fdo);
-    }
 
     IoSkipCurrentIrpStackLocation(Irp);
     status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
index 1ae84e1..0f63ef5 100644
--- a/src/xeniface/wmi.c
+++ b/src/xeniface/wmi.c
@@ -1327,6 +1327,9 @@ WmiRegister(
 {
     NTSTATUS            status;
 
+    if (Fdo->WmiReady)
+        return STATUS_SUCCESS;
+
     XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__);
     XenIfaceDebugPrint(INFO,"DRV: XenIface WMI Initialisation\n");
 
-- 
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 Thu Oct 29 14:51:35 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 14:51: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 1ZroYB-0006UF-Io; Thu, 29 Oct 2015 14:51:35 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7374c8f9b=owen.smith@citrix.com>)
	id 1ZroYA-0006Tz-CM
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 14:51:34 +0000
Received: from [193.109.254.147] by server-10.bemta-14.messagelabs.com id
	14/4E-01143-57232365; Thu, 29 Oct 2015 14:51:33 +0000
X-Env-Sender: prvs=7374c8f9b=owen.smith@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1446130291!26647323!1
X-Originating-IP: [66.165.176.89]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27192 invoked from network); 29 Oct 2015 14:51:33 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	29 Oct 2015 14:51:33 -0000
X-IronPort-AV: E=Sophos;i="5.20,214,1444694400"; d="scan'208";a="309085065"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Thu, 29 Oct 2015 14:49:41 +0000
Message-ID: <1446130187-30460-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 0/6] Remove watches before releasing store
	interface
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

If the win32stubagent is running under certain test cases, its possible
for the WHQL tests to initiate a pnp/power transition to the drivers
either before or without the correcponding notification reaching the 
win32stubagent. This will leave 1 or more watches registered when the
store interface is released, triggering an assertion failure.

Owen Smith (6):
  Cleanup fdo dispatch entry points
  Refactor WmiFireSuspendEvent
  Refactor Wmi header, split initialize/teardown and register/deregister
  Rework Wmi setup/cleanup to always Resume/Suspend sessions
  Fold __FdoD0ToD3/__FdoD3ToD0 into caller. Remove redundant functions
  Ensure defunct watches have NULL handles

 src/xeniface/fdo.c | 406 +++++++++++++++++------------------------------------
 src/xeniface/wmi.c | 241 +++++++++++++++++--------------
 src/xeniface/wmi.h |  55 ++++----
 3 files changed, 293 insertions(+), 409 deletions(-)

-- 
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 Thu Oct 29 14:51:35 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 14:51: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 1ZroYB-0006UF-Io; Thu, 29 Oct 2015 14:51:35 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7374c8f9b=owen.smith@citrix.com>)
	id 1ZroYA-0006Tz-CM
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 14:51:34 +0000
Received: from [193.109.254.147] by server-10.bemta-14.messagelabs.com id
	14/4E-01143-57232365; Thu, 29 Oct 2015 14:51:33 +0000
X-Env-Sender: prvs=7374c8f9b=owen.smith@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1446130291!26647323!1
X-Originating-IP: [66.165.176.89]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27192 invoked from network); 29 Oct 2015 14:51:33 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	29 Oct 2015 14:51:33 -0000
X-IronPort-AV: E=Sophos;i="5.20,214,1444694400"; d="scan'208";a="309085065"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Thu, 29 Oct 2015 14:49:41 +0000
Message-ID: <1446130187-30460-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 0/6] Remove watches before releasing store
	interface
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

If the win32stubagent is running under certain test cases, its possible
for the WHQL tests to initiate a pnp/power transition to the drivers
either before or without the correcponding notification reaching the 
win32stubagent. This will leave 1 or more watches registered when the
store interface is released, triggering an assertion failure.

Owen Smith (6):
  Cleanup fdo dispatch entry points
  Refactor WmiFireSuspendEvent
  Refactor Wmi header, split initialize/teardown and register/deregister
  Rework Wmi setup/cleanup to always Resume/Suspend sessions
  Fold __FdoD0ToD3/__FdoD3ToD0 into caller. Remove redundant functions
  Ensure defunct watches have NULL handles

 src/xeniface/fdo.c | 406 +++++++++++++++++------------------------------------
 src/xeniface/wmi.c | 241 +++++++++++++++++--------------
 src/xeniface/wmi.h |  55 ++++----
 3 files changed, 293 insertions(+), 409 deletions(-)

-- 
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 Thu Oct 29 14:51:37 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 14:51: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 1ZroYD-0006Uw-Ju; Thu, 29 Oct 2015 14:51:37 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7374c8f9b=owen.smith@citrix.com>)
	id 1ZroYC-0006UZ-Gy
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 14:51:36 +0000
Received: from [193.109.254.147] by server-6.bemta-14.messagelabs.com id
	32/C3-16618-77232365; Thu, 29 Oct 2015 14:51:35 +0000
X-Env-Sender: prvs=7374c8f9b=owen.smith@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1446130291!26647323!2
X-Originating-IP: [66.165.176.89]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27552 invoked from network); 29 Oct 2015 14:51:34 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	29 Oct 2015 14:51:34 -0000
X-IronPort-AV: E=Sophos;i="5.20,214,1444694400"; d="scan'208";a="309085084"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Thu, 29 Oct 2015 14:49:47 +0000
Message-ID: <1446130187-30460-7-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
References: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 6/6] Ensure defunct watches have NULL handles
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

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xeniface/wmi.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
index 0f63ef5..c73e990 100644
--- a/src/xeniface/wmi.c
+++ b/src/xeniface/wmi.c
@@ -884,6 +884,7 @@ VOID WatchCallbackThread(__in PVOID StartContext) {
                         XenIfaceDebugPrint(WARNING,"SessionSuspendResumeUnwatch %p\n", watch->watchhandle);
 
                         XENBUS_STORE(WatchRemove, &watch->fdoData->StoreInterface, watch->watchhandle);
+                        watch->watchhandle = NULL;
                         StartWatch(watch->fdoData, watch);
                     }
                 }
@@ -1187,6 +1188,7 @@ RemoveSessionLocked(XENIFACE_FDO *fdoData,
     SessionRemoveWatchesLocked(session);
     if (session->transaction != NULL) {
         XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface, session->transaction, FALSE);
+        session->transaction = NULL;
     }
     session->closing = TRUE;
     KeSetEvent(&session->SessionChangedEvent, IO_NO_INCREMENT, FALSE);
@@ -1230,6 +1232,7 @@ void SessionUnwatchWatchesLocked(XenStoreSession *session)
         XenIfaceDebugPrint(TRACE,"Suspend unwatch %p\n", watch->watchhandle);
 
         XENBUS_STORE(WatchRemove, &watch->fdoData->StoreInterface, watch->watchhandle);
+        watch->watchhandle = NULL;
         watch = (XenStoreWatch *)watch->listentry.Flink;
     }
     XenIfaceDebugPrint(TRACE, "WATCHLIST for session %p-----------\n",session);
-- 
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 Thu Oct 29 14:51:37 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 14:51: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 1ZroYD-0006Uw-Ju; Thu, 29 Oct 2015 14:51:37 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7374c8f9b=owen.smith@citrix.com>)
	id 1ZroYC-0006UZ-Gy
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 14:51:36 +0000
Received: from [193.109.254.147] by server-6.bemta-14.messagelabs.com id
	32/C3-16618-77232365; Thu, 29 Oct 2015 14:51:35 +0000
X-Env-Sender: prvs=7374c8f9b=owen.smith@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1446130291!26647323!2
X-Originating-IP: [66.165.176.89]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27552 invoked from network); 29 Oct 2015 14:51:34 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	29 Oct 2015 14:51:34 -0000
X-IronPort-AV: E=Sophos;i="5.20,214,1444694400"; d="scan'208";a="309085084"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Thu, 29 Oct 2015 14:49:47 +0000
Message-ID: <1446130187-30460-7-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
References: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 6/6] Ensure defunct watches have NULL handles
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

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xeniface/wmi.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
index 0f63ef5..c73e990 100644
--- a/src/xeniface/wmi.c
+++ b/src/xeniface/wmi.c
@@ -884,6 +884,7 @@ VOID WatchCallbackThread(__in PVOID StartContext) {
                         XenIfaceDebugPrint(WARNING,"SessionSuspendResumeUnwatch %p\n", watch->watchhandle);
 
                         XENBUS_STORE(WatchRemove, &watch->fdoData->StoreInterface, watch->watchhandle);
+                        watch->watchhandle = NULL;
                         StartWatch(watch->fdoData, watch);
                     }
                 }
@@ -1187,6 +1188,7 @@ RemoveSessionLocked(XENIFACE_FDO *fdoData,
     SessionRemoveWatchesLocked(session);
     if (session->transaction != NULL) {
         XENBUS_STORE(TransactionEnd, &fdoData->StoreInterface, session->transaction, FALSE);
+        session->transaction = NULL;
     }
     session->closing = TRUE;
     KeSetEvent(&session->SessionChangedEvent, IO_NO_INCREMENT, FALSE);
@@ -1230,6 +1232,7 @@ void SessionUnwatchWatchesLocked(XenStoreSession *session)
         XenIfaceDebugPrint(TRACE,"Suspend unwatch %p\n", watch->watchhandle);
 
         XENBUS_STORE(WatchRemove, &watch->fdoData->StoreInterface, watch->watchhandle);
+        watch->watchhandle = NULL;
         watch = (XenStoreWatch *)watch->listentry.Flink;
     }
     XenIfaceDebugPrint(TRACE, "WATCHLIST for session %p-----------\n",session);
-- 
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 Thu Oct 29 14:51:38 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 14:51: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 1ZroYE-0006Va-M7; Thu, 29 Oct 2015 14:51:38 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7374c8f9b=owen.smith@citrix.com>)
	id 1ZroYD-0006Ul-6F
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 14:51:37 +0000
Received: from [193.109.254.147] by server-14.bemta-14.messagelabs.com id
	92/23-04752-87232365; Thu, 29 Oct 2015 14:51:36 +0000
X-Env-Sender: prvs=7374c8f9b=owen.smith@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1446130291!26647323!3
X-Originating-IP: [66.165.176.89]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27682 invoked from network); 29 Oct 2015 14:51:35 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	29 Oct 2015 14:51:35 -0000
X-IronPort-AV: E=Sophos;i="5.20,214,1444694400"; d="scan'208";a="309085086"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Thu, 29 Oct 2015 14:49:46 +0000
Message-ID: <1446130187-30460-6-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
References: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 5/6] Fold __FdoD0ToD3/__FdoD3ToD0 into caller
	Remove redundant functions
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

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xeniface/fdo.c | 221 +++++++++++++----------------------------------------
 1 file changed, 55 insertions(+), 166 deletions(-)

diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index 2b3e44d..c1a9a8f 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -522,86 +522,6 @@ FdoReleaseMutex(
         FdoDestroy(Fdo);
 }
 
-
-static FORCEINLINE PANSI_STRING
-__FdoMultiSzToUpcaseAnsi(
-    IN  PCHAR       Buffer
-    )
-{
-    PANSI_STRING    Ansi;
-    LONG            Index;
-    LONG            Count;
-    NTSTATUS        status;
-
-    Index = 0;
-    Count = 0;
-    for (;;) {
-        if (Buffer[Index] == '\0') {
-            Count++;
-            Index++;
-
-            // Check for double NUL
-            if (Buffer[Index] == '\0')
-                break;
-        } else {
-            Buffer[Index] = (CHAR)toupper(Buffer[Index]);
-            Index++;
-        }
-    }
-
-    Ansi = (PANSI_STRING)__FdoAllocate(sizeof (ANSI_STRING) * (Count + 1));
-
-    status = STATUS_NO_MEMORY;
-    if (Ansi == NULL)
-        goto fail1;
-
-    for (Index = 0; Index < Count; Index++) {
-        ULONG   Length;
-
-        Length = (ULONG)strlen(Buffer);
-        Ansi[Index].MaximumLength = (USHORT)(Length + 1);
-        Ansi[Index].Buffer = (PCHAR)__FdoAllocate(Ansi[Index].MaximumLength);
-
-        status = STATUS_NO_MEMORY;
-        if (Ansi[Index].Buffer == NULL)
-            goto fail2;
-
-        RtlCopyMemory(Ansi[Index].Buffer, Buffer, Length);
-        Ansi[Index].Length = (USHORT)Length;
-
-        Buffer += Length + 1;
-    }
-
-    return Ansi;
-
-fail2:
-    Error("fail2\n");
-
-    while (--Index >= 0)
-        __FdoFree(Ansi[Index].Buffer);
-
-    __FdoFree(Ansi);
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return NULL;
-}
-
-static FORCEINLINE VOID
-__FdoFreeAnsi(
-    IN  PANSI_STRING    Ansi
-    )
-{
-    ULONG               Index;
-
-    for (Index = 0; Ansi[Index].Buffer != NULL; Index++)
-        __FdoFree(Ansi[Index].Buffer);
-
-    __FdoFree(Ansi);
-}
-
-
 static DECLSPEC_NOINLINE VOID
 FdoParseResources(
     IN  PXENIFACE_FDO             Fdo,
@@ -649,17 +569,19 @@ FdoParseResources(
     }
 }
 
-static FORCEINLINE NTSTATUS
-__FdoD3ToD0(
+static DECLSPEC_NOINLINE NTSTATUS
+FdoD3ToD0(
     IN  PXENIFACE_FDO Fdo
     )
 {
-    POWER_STATE     PowerState;
+    KIRQL           Irql;
     NTSTATUS        status;
+    POWER_STATE     PowerState;
 
-    Trace("====>\n");
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    KeRaiseIrql(DISPATCH_LEVEL, &Irql);
 
-    ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
     ASSERT3U(__FdoGetDevicePowerState(Fdo), ==, PowerDeviceD3);
 
     status = XENBUS_STORE(Acquire, &Fdo->StoreInterface);
@@ -685,85 +607,13 @@ __FdoD3ToD0(
     if (!NT_SUCCESS(status))
         goto fail4;
 
-    __FdoSetDevicePowerState(Fdo, PowerDeviceD0);
-
-    PowerState.DeviceState = PowerDeviceD0;
-    PoSetPowerState(Fdo->Dx->DeviceObject,
-                    DevicePowerState,
-                    PowerState);
-
-    Trace("<====\n");
-
-    return STATUS_SUCCESS;
-
-fail4:
-    Error("fail4\n");
-    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
-
-fail3:
-    Error("fail3\n");
-    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
-
-fail2:
-    Error("fail2\n");
-    XENBUS_STORE(Release, &Fdo->StoreInterface);
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return status;
-}
-
-static FORCEINLINE VOID
-__FdoD0ToD3(
-    IN  PXENIFACE_FDO Fdo
-    )
-{
-    POWER_STATE     PowerState;
-
-    Trace("====>\n");
-
-    ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
-    ASSERT3U(__FdoGetDevicePowerState(Fdo), ==, PowerDeviceD0);
-
-    PowerState.DeviceState = PowerDeviceD3;
-    PoSetPowerState(Fdo->Dx->DeviceObject,
-                    DevicePowerState,
-                    PowerState);
-
-    __FdoSetDevicePowerState(Fdo, PowerDeviceD3);
-
-    XENBUS_GNTTAB(DestroyCache, &Fdo->GnttabInterface, Fdo->GnttabCache);
-    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
-    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
-    XENBUS_STORE(Release, &Fdo->StoreInterface);
-
-    Trace("<====\n");
-}
-
-static DECLSPEC_NOINLINE NTSTATUS
-FdoD3ToD0(
-    IN  PXENIFACE_FDO Fdo
-    )
-{
-    KIRQL           Irql;
-    NTSTATUS        status;
-
-    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
-
-    KeRaiseIrql(DISPATCH_LEVEL, &Irql);
-
-    status = __FdoD3ToD0(Fdo);
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
     status = XENBUS_SUSPEND(Acquire, &Fdo->SuspendInterface);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail5;
 
     status = XENBUS_SHARED_INFO(Acquire, &Fdo->SharedInfoInterface);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail6;
 
     status = XENBUS_SUSPEND(Register,
                             &Fdo->SuspendInterface,
@@ -772,7 +622,14 @@ FdoD3ToD0(
                             Fdo,
                             &Fdo->SuspendCallbackLate);
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail7;
+
+    __FdoSetDevicePowerState(Fdo, PowerDeviceD0);
+
+    PowerState.DeviceState = PowerDeviceD0;
+    PoSetPowerState(Fdo->Dx->DeviceObject,
+                    DevicePowerState,
+                    PowerState);
 
     Fdo->InterfacesAcquired = TRUE;
     KeLowerIrql(Irql);
@@ -781,20 +638,38 @@ FdoD3ToD0(
 
     return STATUS_SUCCESS;
 
+fail7:
+    Error("fail7\n");
+
+    XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
+
+fail6:
+    Error("fail6\n");
+
+    XENBUS_SUSPEND(Release, &Fdo->SuspendInterface);
+
+fail5:
+    Error("fail5\n");
+
+    XENBUS_GNTTAB(DestroyCache,
+                  &Fdo->GnttabInterface,
+                  Fdo->GnttabCache);
+    Fdo->GnttabCache = NULL;
+
 fail4:
     Error("fail4\n");
 
-    XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
+    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
 
 fail3:
     Error("fail3\n");
 
-    XENBUS_SUSPEND(Release, &Fdo->SuspendInterface);
+    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
 
 fail2:
     Error("fail2\n");
 
-    __FdoD0ToD3(Fdo);
+    XENBUS_STORE(Release, &Fdo->StoreInterface);
 
 fail1:
     Error("fail1 (%08x)\n", status);
@@ -810,12 +685,14 @@ FdoD0ToD3(
     )
 {
     KIRQL           Irql;
+    POWER_STATE     PowerState;
 
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
 
     WmiSessionsSuspendAll(Fdo);
 
     KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+
     Fdo->InterfacesAcquired = FALSE;
 
     XENBUS_SUSPEND(Deregister,
@@ -824,10 +701,23 @@ FdoD0ToD3(
     Fdo->SuspendCallbackLate = NULL;
 
     XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
-
     XENBUS_SUSPEND(Release, &Fdo->SuspendInterface);
 
-    __FdoD0ToD3(Fdo);
+    XENBUS_GNTTAB(DestroyCache,
+                  &Fdo->GnttabInterface,
+                  Fdo->GnttabCache);
+    Fdo->GnttabCache = NULL;
+
+    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
+    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
+    XENBUS_STORE(Release, &Fdo->StoreInterface);
+
+    PowerState.DeviceState = PowerDeviceD3;
+    PoSetPowerState(Fdo->Dx->DeviceObject,
+                    DevicePowerState,
+                    PowerState);
+
+    __FdoSetDevicePowerState(Fdo, PowerDeviceD3);
 
     KeLowerIrql(Irql);
 }
@@ -912,7 +802,6 @@ fail3:
     FdoS3ToS4(Fdo);
     __FdoSetSystemPowerState(Fdo, PowerSystemShutdown);
 
-
     RtlZeroMemory(&Fdo->Resource, sizeof (FDO_RESOURCE) * RESOURCE_COUNT);
 
 fail1:
-- 
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 Thu Oct 29 14:51:38 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 14:51: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 1ZroYE-0006VW-L3; Thu, 29 Oct 2015 14:51:38 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7374c8f9b=owen.smith@citrix.com>)
	id 1ZroYD-0006Ue-1g
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 14:51:37 +0000
Received: from [85.158.139.211] by server-3.bemta-5.messagelabs.com id
	D5/50-06179-87232365; Thu, 29 Oct 2015 14:51:36 +0000
X-Env-Sender: prvs=7374c8f9b=owen.smith@citrix.com
X-Msg-Ref: server-7.tower-206.messagelabs.com!1446130293!21802790!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 3846 invoked from network); 29 Oct 2015 14:51:35 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-7.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	29 Oct 2015 14:51:35 -0000
X-IronPort-AV: E=Sophos;i="5.20,214,1444694400"; d="scan'208";a="314344706"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Thu, 29 Oct 2015 14:49:42 +0000
Message-ID: <1446130187-30460-2-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
References: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 1/6] Cleanup fdo dispatch entry points
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

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xeniface/fdo.c | 98 ++++++++++++++++--------------------------------------
 src/xeniface/wmi.c | 82 +++++++++++++++------------------------------
 src/xeniface/wmi.h | 13 +++-----
 3 files changed, 59 insertions(+), 134 deletions(-)

diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index d6b006e..f7aa542 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -1234,7 +1234,7 @@ done:
 
 static DECLSPEC_NOINLINE NTSTATUS
 FdoDispatchPnp(
-    IN  PXENIFACE_FDO     Fdo,
+    IN  PXENIFACE_FDO   Fdo,
     IN  PIRP            Irp
     )
 {
@@ -1945,7 +1945,7 @@ FdoSystemPower(
 
 static DECLSPEC_NOINLINE NTSTATUS
 FdoDispatchPower(
-    IN  PXENIFACE_FDO     Fdo,
+    IN  PXENIFACE_FDO   Fdo,
     IN  PIRP            Irp
     )
 {
@@ -2013,7 +2013,7 @@ done:
 
 static DECLSPEC_NOINLINE NTSTATUS
 FdoDispatchDefault(
-    IN  PXENIFACE_FDO     Fdo,
+    IN  PXENIFACE_FDO   Fdo,
     IN  PIRP            Irp
     )
 {
@@ -2025,80 +2025,44 @@ FdoDispatchDefault(
     return status;
 }
 
-NTSTATUS
-FdoCreateFile (
-    __in PXENIFACE_FDO  Fdo,
-    __inout PIRP        Irp
+static DECLSPEC_NOINLINE NTSTATUS
+FdoDispatchComplete(
+    IN  PXENIFACE_FDO   Fdo,
+    IN  PIRP            Irp
     )
 {
-    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
-    NTSTATUS            status;
-
-    XenIfaceDebugPrint(TRACE, "FO %p, Process %p\n", Stack->FileObject, PsGetCurrentProcess());
+    UNREFERENCED_PARAMETER(Fdo);
 
-    if (Deleted == Fdo->Dx->DevicePnpState) {
-        Irp->IoStatus.Status = STATUS_NO_SUCH_DEVICE;
-        IoCompleteRequest(Irp, IO_NO_INCREMENT);
-        return STATUS_NO_SUCH_DEVICE;
-    }
-
-    status = STATUS_SUCCESS;
     Irp->IoStatus.Information = 0;
-    Irp->IoStatus.Status = status;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    Irp->IoStatus.Status = STATUS_SUCCESS;
+    IoCompleteRequest (Irp, IO_NO_INCREMENT);
 
-    return status;
+    return STATUS_SUCCESS;
 }
 
-
-NTSTATUS
-FdoClose (
-    __in PXENIFACE_FDO  Fdo,
-    __inout PIRP        Irp
+static DECLSPEC_NOINLINE NTSTATUS
+FdoDispatchSystemControl(
+    IN  PXENIFACE_FDO   Fdo,
+    IN  PIRP            Irp
     )
-
 {
-    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
     NTSTATUS            status;
 
-    XenIfaceDebugPrint(TRACE, "FO %p, Process %p\n", Stack->FileObject, PsGetCurrentProcess());
-
-    XenIfaceCleanup(Fdo, Stack->FileObject);
-
-    status = STATUS_SUCCESS;
-    Irp->IoStatus.Information = 0;
-    Irp->IoStatus.Status = status;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-    return status;
-}
-
-
-NTSTATUS
-FdoReadWrite (
-    __in PXENIFACE_FDO fdoData,
-    __inout PIRP Irp
-    )
-
-{
-
-    NTSTATUS     status;
-
-    XenIfaceDebugPrint(TRACE, "ReadWrite called\n");
-
-    status = STATUS_SUCCESS;
-    Irp->IoStatus.Information = 0;
-    Irp->IoStatus.Status = status;
-    IoCompleteRequest (Irp, IO_NO_INCREMENT);
+    status = WmiProcessMinorFunction(Fdo, Irp);
+    if (status == STATUS_NOT_SUPPORTED) {
+        IoSkipCurrentIrpStackLocation(Irp);
+        status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
+    } else {
+        Irp->IoStatus.Status = status;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    }
 
     return status;
 }
 
-
-
 NTSTATUS
 FdoDispatch(
-    IN  PXENIFACE_FDO     Fdo,
+    IN  PXENIFACE_FDO   Fdo,
     IN  PIRP            Irp
     )
 {
@@ -2121,20 +2085,14 @@ FdoDispatch(
         break;
 
     case IRP_MJ_SYSTEM_CONTROL:
-        status = XenIfaceSystemControl(Fdo, Irp);
-        break;
-
-    case IRP_MJ_READ:
-    case IRP_MJ_WRITE:
-        status = FdoReadWrite(Fdo, Irp);
+        status = FdoDispatchSystemControl(Fdo, Irp);
         break;
 
     case IRP_MJ_CREATE:
-        status = FdoCreateFile(Fdo, Irp);
-        break;
-
     case IRP_MJ_CLOSE:
-        status = FdoClose(Fdo, Irp);
+    case IRP_MJ_READ:
+    case IRP_MJ_WRITE:
+        status = FdoDispatchComplete(Fdo, Irp);
         break;
 
     default:
diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
index 82592e3..0b14e9b 100644
--- a/src/xeniface/wmi.c
+++ b/src/xeniface/wmi.c
@@ -2995,85 +2995,57 @@ WmiRegInfoEx(
     return WmiRegInfo(fdoData, stack, byteswritten);
 }
 
-
-
 NTSTATUS
 WmiProcessMinorFunction(
-    IN PXENIFACE_FDO fdoData,
-    IN PIRP Irp
-)
+    IN  PXENIFACE_FDO   Fdo,
+    IN  PIRP            Irp
+    )
 {
-    PIO_STACK_LOCATION stack;
-    UCHAR MinorFunction;
-
-
+    PIO_STACK_LOCATION  Stack;
 
-    stack = IoGetCurrentIrpStackLocation(Irp);
+    Stack = IoGetCurrentIrpStackLocation(Irp);
 
-    if (stack->Parameters.WMI.ProviderId != (ULONG_PTR)fdoData->Dx->DeviceObject) {
-        XenIfaceDebugPrint(TRACE,"ProviderID %p %p", stack->Parameters.WMI.ProviderId, fdoData->PhysicalDeviceObject);
+    if (Stack->Parameters.WMI.ProviderId != (ULONG_PTR)Fdo->Dx->DeviceObject) {
+        XenIfaceDebugPrint(TRACE,
+                           "ProviderID %p %p",
+                           Stack->Parameters.WMI.ProviderId,
+                           Fdo->PhysicalDeviceObject);
         return STATUS_NOT_SUPPORTED;
+    } else {
+        XenIfaceDebugPrint(TRACE,
+                           "ProviderID Match %p %p",
+                           Stack->Parameters.WMI.ProviderId,
+                           Fdo->PhysicalDeviceObject);
     }
-    else {
-        XenIfaceDebugPrint(TRACE,"ProviderID Match %p %p", stack->Parameters.WMI.ProviderId, fdoData->PhysicalDeviceObject);
-    }
-    MinorFunction = stack->MinorFunction;
 
-    switch (MinorFunction)
-    {
+    switch (Stack->MinorFunction) {
     case IRP_MN_CHANGE_SINGLE_INSTANCE:
-        return WmiChangeSingleInstance(fdoData, stack);
+        return WmiChangeSingleInstance(Fdo, Stack);
     case IRP_MN_CHANGE_SINGLE_ITEM:
-        return WmiChangeSingleItem(fdoData, stack);
+        return WmiChangeSingleItem(Fdo, Stack);
     case IRP_MN_DISABLE_COLLECTION:
-        return WmiDisableCollection(fdoData, stack);
+        return WmiDisableCollection(Fdo, Stack);
     case IRP_MN_DISABLE_EVENTS:
-        return WmiDisableEvents(fdoData, stack);
+        return WmiDisableEvents(Fdo, Stack);
     case IRP_MN_ENABLE_COLLECTION:
-        return WmiEnableCollection(fdoData, stack);
+        return WmiEnableCollection(Fdo, Stack);
     case IRP_MN_ENABLE_EVENTS:
-        return WmiEnableEvents(fdoData, stack);
+        return WmiEnableEvents(Fdo, Stack);
     case IRP_MN_EXECUTE_METHOD:
-        return WmiExecuteMethod(fdoData, stack,  &Irp->IoStatus.Information);
+        return WmiExecuteMethod(Fdo, Stack,  &Irp->IoStatus.Information);
     case IRP_MN_QUERY_ALL_DATA:
-        return WmiQueryAllData(fdoData, stack, &Irp->IoStatus.Information);
+        return WmiQueryAllData(Fdo, Stack, &Irp->IoStatus.Information);
     case IRP_MN_QUERY_SINGLE_INSTANCE:
-        return WmiQuerySingleInstance(fdoData, stack, &Irp->IoStatus.Information);
+        return WmiQuerySingleInstance(Fdo, Stack, &Irp->IoStatus.Information);
     case IRP_MN_REGINFO:
-        return WmiRegInfo(fdoData, stack, &Irp->IoStatus.Information);
+        return WmiRegInfo(Fdo, Stack, &Irp->IoStatus.Information);
     case IRP_MN_REGINFO_EX:
-        return WmiRegInfoEx(fdoData, stack, &Irp->IoStatus.Information);
+        return WmiRegInfoEx(Fdo, Stack, &Irp->IoStatus.Information);
     default:
         return STATUS_NOT_SUPPORTED;
     }
 }
 
-NTSTATUS XenIfaceSystemControl(
-    __in PXENIFACE_FDO		fdoData,
-    __inout PIRP Irp
-    )
-{
-    NTSTATUS            status;
-
-
-
-    status = WmiProcessMinorFunction(fdoData, Irp);
-
-    if (status != STATUS_NOT_SUPPORTED) {
-        Irp->IoStatus.Status = status;
-        IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-    }
-    else {
-        IoSkipCurrentIrpStackLocation(Irp);
-        status = IoCallDriver(fdoData->LowerDeviceObject, Irp);
-    }
-
-    return(status);
-
-}
-
-
 PCHAR
 WMIMinorFunctionString (
     __in UCHAR MinorFunction
diff --git a/src/xeniface/wmi.h b/src/xeniface/wmi.h
index a49f1b3..f677ee3 100644
--- a/src/xeniface/wmi.h
+++ b/src/xeniface/wmi.h
@@ -37,11 +37,11 @@
 #include "driver.h"
 #include "wmi_generated.h"
 
-NTSTATUS
+extern NTSTATUS
 WmiProcessMinorFunction(
-    IN PXENIFACE_FDO Fdo,
-    IN PIRP Irp
-);
+    IN  PXENIFACE_FDO   Fdo,
+    IN  PIRP            Irp
+    );
 
 NTSTATUS
 WmiInit(
@@ -54,11 +54,6 @@ WmiFinalise(
     PXENIFACE_FDO FdoData
 ); 
 
-NTSTATUS XenIfaceSystemControl(
-    __in PXENIFACE_FDO		fdoData,
-    __inout PIRP Irp
-    );
-
 void FireSuspendEvent(
     IN OUT PXENIFACE_FDO fdoData
     );
-- 
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 Thu Oct 29 14:51:38 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 14:51: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 1ZroYE-0006VW-L3; Thu, 29 Oct 2015 14:51:38 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7374c8f9b=owen.smith@citrix.com>)
	id 1ZroYD-0006Ue-1g
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 14:51:37 +0000
Received: from [85.158.139.211] by server-3.bemta-5.messagelabs.com id
	D5/50-06179-87232365; Thu, 29 Oct 2015 14:51:36 +0000
X-Env-Sender: prvs=7374c8f9b=owen.smith@citrix.com
X-Msg-Ref: server-7.tower-206.messagelabs.com!1446130293!21802790!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 3846 invoked from network); 29 Oct 2015 14:51:35 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-7.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	29 Oct 2015 14:51:35 -0000
X-IronPort-AV: E=Sophos;i="5.20,214,1444694400"; d="scan'208";a="314344706"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Thu, 29 Oct 2015 14:49:42 +0000
Message-ID: <1446130187-30460-2-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
References: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 1/6] Cleanup fdo dispatch entry points
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

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xeniface/fdo.c | 98 ++++++++++++++++--------------------------------------
 src/xeniface/wmi.c | 82 +++++++++++++++------------------------------
 src/xeniface/wmi.h | 13 +++-----
 3 files changed, 59 insertions(+), 134 deletions(-)

diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index d6b006e..f7aa542 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -1234,7 +1234,7 @@ done:
 
 static DECLSPEC_NOINLINE NTSTATUS
 FdoDispatchPnp(
-    IN  PXENIFACE_FDO     Fdo,
+    IN  PXENIFACE_FDO   Fdo,
     IN  PIRP            Irp
     )
 {
@@ -1945,7 +1945,7 @@ FdoSystemPower(
 
 static DECLSPEC_NOINLINE NTSTATUS
 FdoDispatchPower(
-    IN  PXENIFACE_FDO     Fdo,
+    IN  PXENIFACE_FDO   Fdo,
     IN  PIRP            Irp
     )
 {
@@ -2013,7 +2013,7 @@ done:
 
 static DECLSPEC_NOINLINE NTSTATUS
 FdoDispatchDefault(
-    IN  PXENIFACE_FDO     Fdo,
+    IN  PXENIFACE_FDO   Fdo,
     IN  PIRP            Irp
     )
 {
@@ -2025,80 +2025,44 @@ FdoDispatchDefault(
     return status;
 }
 
-NTSTATUS
-FdoCreateFile (
-    __in PXENIFACE_FDO  Fdo,
-    __inout PIRP        Irp
+static DECLSPEC_NOINLINE NTSTATUS
+FdoDispatchComplete(
+    IN  PXENIFACE_FDO   Fdo,
+    IN  PIRP            Irp
     )
 {
-    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
-    NTSTATUS            status;
-
-    XenIfaceDebugPrint(TRACE, "FO %p, Process %p\n", Stack->FileObject, PsGetCurrentProcess());
+    UNREFERENCED_PARAMETER(Fdo);
 
-    if (Deleted == Fdo->Dx->DevicePnpState) {
-        Irp->IoStatus.Status = STATUS_NO_SUCH_DEVICE;
-        IoCompleteRequest(Irp, IO_NO_INCREMENT);
-        return STATUS_NO_SUCH_DEVICE;
-    }
-
-    status = STATUS_SUCCESS;
     Irp->IoStatus.Information = 0;
-    Irp->IoStatus.Status = status;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    Irp->IoStatus.Status = STATUS_SUCCESS;
+    IoCompleteRequest (Irp, IO_NO_INCREMENT);
 
-    return status;
+    return STATUS_SUCCESS;
 }
 
-
-NTSTATUS
-FdoClose (
-    __in PXENIFACE_FDO  Fdo,
-    __inout PIRP        Irp
+static DECLSPEC_NOINLINE NTSTATUS
+FdoDispatchSystemControl(
+    IN  PXENIFACE_FDO   Fdo,
+    IN  PIRP            Irp
     )
-
 {
-    PIO_STACK_LOCATION  Stack = IoGetCurrentIrpStackLocation(Irp);
     NTSTATUS            status;
 
-    XenIfaceDebugPrint(TRACE, "FO %p, Process %p\n", Stack->FileObject, PsGetCurrentProcess());
-
-    XenIfaceCleanup(Fdo, Stack->FileObject);
-
-    status = STATUS_SUCCESS;
-    Irp->IoStatus.Information = 0;
-    Irp->IoStatus.Status = status;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-    return status;
-}
-
-
-NTSTATUS
-FdoReadWrite (
-    __in PXENIFACE_FDO fdoData,
-    __inout PIRP Irp
-    )
-
-{
-
-    NTSTATUS     status;
-
-    XenIfaceDebugPrint(TRACE, "ReadWrite called\n");
-
-    status = STATUS_SUCCESS;
-    Irp->IoStatus.Information = 0;
-    Irp->IoStatus.Status = status;
-    IoCompleteRequest (Irp, IO_NO_INCREMENT);
+    status = WmiProcessMinorFunction(Fdo, Irp);
+    if (status == STATUS_NOT_SUPPORTED) {
+        IoSkipCurrentIrpStackLocation(Irp);
+        status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
+    } else {
+        Irp->IoStatus.Status = status;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    }
 
     return status;
 }
 
-
-
 NTSTATUS
 FdoDispatch(
-    IN  PXENIFACE_FDO     Fdo,
+    IN  PXENIFACE_FDO   Fdo,
     IN  PIRP            Irp
     )
 {
@@ -2121,20 +2085,14 @@ FdoDispatch(
         break;
 
     case IRP_MJ_SYSTEM_CONTROL:
-        status = XenIfaceSystemControl(Fdo, Irp);
-        break;
-
-    case IRP_MJ_READ:
-    case IRP_MJ_WRITE:
-        status = FdoReadWrite(Fdo, Irp);
+        status = FdoDispatchSystemControl(Fdo, Irp);
         break;
 
     case IRP_MJ_CREATE:
-        status = FdoCreateFile(Fdo, Irp);
-        break;
-
     case IRP_MJ_CLOSE:
-        status = FdoClose(Fdo, Irp);
+    case IRP_MJ_READ:
+    case IRP_MJ_WRITE:
+        status = FdoDispatchComplete(Fdo, Irp);
         break;
 
     default:
diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
index 82592e3..0b14e9b 100644
--- a/src/xeniface/wmi.c
+++ b/src/xeniface/wmi.c
@@ -2995,85 +2995,57 @@ WmiRegInfoEx(
     return WmiRegInfo(fdoData, stack, byteswritten);
 }
 
-
-
 NTSTATUS
 WmiProcessMinorFunction(
-    IN PXENIFACE_FDO fdoData,
-    IN PIRP Irp
-)
+    IN  PXENIFACE_FDO   Fdo,
+    IN  PIRP            Irp
+    )
 {
-    PIO_STACK_LOCATION stack;
-    UCHAR MinorFunction;
-
-
+    PIO_STACK_LOCATION  Stack;
 
-    stack = IoGetCurrentIrpStackLocation(Irp);
+    Stack = IoGetCurrentIrpStackLocation(Irp);
 
-    if (stack->Parameters.WMI.ProviderId != (ULONG_PTR)fdoData->Dx->DeviceObject) {
-        XenIfaceDebugPrint(TRACE,"ProviderID %p %p", stack->Parameters.WMI.ProviderId, fdoData->PhysicalDeviceObject);
+    if (Stack->Parameters.WMI.ProviderId != (ULONG_PTR)Fdo->Dx->DeviceObject) {
+        XenIfaceDebugPrint(TRACE,
+                           "ProviderID %p %p",
+                           Stack->Parameters.WMI.ProviderId,
+                           Fdo->PhysicalDeviceObject);
         return STATUS_NOT_SUPPORTED;
+    } else {
+        XenIfaceDebugPrint(TRACE,
+                           "ProviderID Match %p %p",
+                           Stack->Parameters.WMI.ProviderId,
+                           Fdo->PhysicalDeviceObject);
     }
-    else {
-        XenIfaceDebugPrint(TRACE,"ProviderID Match %p %p", stack->Parameters.WMI.ProviderId, fdoData->PhysicalDeviceObject);
-    }
-    MinorFunction = stack->MinorFunction;
 
-    switch (MinorFunction)
-    {
+    switch (Stack->MinorFunction) {
     case IRP_MN_CHANGE_SINGLE_INSTANCE:
-        return WmiChangeSingleInstance(fdoData, stack);
+        return WmiChangeSingleInstance(Fdo, Stack);
     case IRP_MN_CHANGE_SINGLE_ITEM:
-        return WmiChangeSingleItem(fdoData, stack);
+        return WmiChangeSingleItem(Fdo, Stack);
     case IRP_MN_DISABLE_COLLECTION:
-        return WmiDisableCollection(fdoData, stack);
+        return WmiDisableCollection(Fdo, Stack);
     case IRP_MN_DISABLE_EVENTS:
-        return WmiDisableEvents(fdoData, stack);
+        return WmiDisableEvents(Fdo, Stack);
     case IRP_MN_ENABLE_COLLECTION:
-        return WmiEnableCollection(fdoData, stack);
+        return WmiEnableCollection(Fdo, Stack);
     case IRP_MN_ENABLE_EVENTS:
-        return WmiEnableEvents(fdoData, stack);
+        return WmiEnableEvents(Fdo, Stack);
     case IRP_MN_EXECUTE_METHOD:
-        return WmiExecuteMethod(fdoData, stack,  &Irp->IoStatus.Information);
+        return WmiExecuteMethod(Fdo, Stack,  &Irp->IoStatus.Information);
     case IRP_MN_QUERY_ALL_DATA:
-        return WmiQueryAllData(fdoData, stack, &Irp->IoStatus.Information);
+        return WmiQueryAllData(Fdo, Stack, &Irp->IoStatus.Information);
     case IRP_MN_QUERY_SINGLE_INSTANCE:
-        return WmiQuerySingleInstance(fdoData, stack, &Irp->IoStatus.Information);
+        return WmiQuerySingleInstance(Fdo, Stack, &Irp->IoStatus.Information);
     case IRP_MN_REGINFO:
-        return WmiRegInfo(fdoData, stack, &Irp->IoStatus.Information);
+        return WmiRegInfo(Fdo, Stack, &Irp->IoStatus.Information);
     case IRP_MN_REGINFO_EX:
-        return WmiRegInfoEx(fdoData, stack, &Irp->IoStatus.Information);
+        return WmiRegInfoEx(Fdo, Stack, &Irp->IoStatus.Information);
     default:
         return STATUS_NOT_SUPPORTED;
     }
 }
 
-NTSTATUS XenIfaceSystemControl(
-    __in PXENIFACE_FDO		fdoData,
-    __inout PIRP Irp
-    )
-{
-    NTSTATUS            status;
-
-
-
-    status = WmiProcessMinorFunction(fdoData, Irp);
-
-    if (status != STATUS_NOT_SUPPORTED) {
-        Irp->IoStatus.Status = status;
-        IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-    }
-    else {
-        IoSkipCurrentIrpStackLocation(Irp);
-        status = IoCallDriver(fdoData->LowerDeviceObject, Irp);
-    }
-
-    return(status);
-
-}
-
-
 PCHAR
 WMIMinorFunctionString (
     __in UCHAR MinorFunction
diff --git a/src/xeniface/wmi.h b/src/xeniface/wmi.h
index a49f1b3..f677ee3 100644
--- a/src/xeniface/wmi.h
+++ b/src/xeniface/wmi.h
@@ -37,11 +37,11 @@
 #include "driver.h"
 #include "wmi_generated.h"
 
-NTSTATUS
+extern NTSTATUS
 WmiProcessMinorFunction(
-    IN PXENIFACE_FDO Fdo,
-    IN PIRP Irp
-);
+    IN  PXENIFACE_FDO   Fdo,
+    IN  PIRP            Irp
+    );
 
 NTSTATUS
 WmiInit(
@@ -54,11 +54,6 @@ WmiFinalise(
     PXENIFACE_FDO FdoData
 ); 
 
-NTSTATUS XenIfaceSystemControl(
-    __in PXENIFACE_FDO		fdoData,
-    __inout PIRP Irp
-    );
-
 void FireSuspendEvent(
     IN OUT PXENIFACE_FDO fdoData
     );
-- 
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 Thu Oct 29 14:51:38 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 14:51: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 1ZroYE-0006Vi-NO; Thu, 29 Oct 2015 14:51:38 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7374c8f9b=owen.smith@citrix.com>)
	id 1ZroYE-0006Uv-0W
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 14:51:38 +0000
Received: from [85.158.137.68] by server-4.bemta-3.messagelabs.com id
	A1/77-09570-97232365; Thu, 29 Oct 2015 14:51:37 +0000
X-Env-Sender: prvs=7374c8f9b=owen.smith@citrix.com
X-Msg-Ref: server-5.tower-31.messagelabs.com!1446130295!58096587!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 20893 invoked from network); 29 Oct 2015 14:51:36 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-5.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	29 Oct 2015 14:51:36 -0000
X-IronPort-AV: E=Sophos;i="5.20,214,1444694400"; d="scan'208";a="314344712"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Thu, 29 Oct 2015 14:49:44 +0000
Message-ID: <1446130187-30460-4-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
References: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA2
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 3/6] Refactor Wmi header,
	split initialize/teardown and register/deregister
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

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xeniface/fdo.c |  44 +++++++++++++------
 src/xeniface/wmi.c | 124 +++++++++++++++++++++++++++++++++++------------------
 src/xeniface/wmi.h |  47 ++++++++++++--------
 3 files changed, 143 insertions(+), 72 deletions(-)

diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index b32e506..10ead15 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -896,7 +896,7 @@ FdoStartDevice(
 
 
     if (__FdoGetDevicePnpState(Fdo) != Stopped) {
-        status = WmiInit(Fdo);
+        status = WmiRegister(Fdo);
         if (!NT_SUCCESS(status))
             goto fail5;
     }
@@ -1046,7 +1046,7 @@ FdoSurpriseRemoval(
     Irp->IoStatus.Status = STATUS_SUCCESS;
 #pragma warning(suppress : 6031)
     IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
-    WmiFinalise(Fdo);
+    WmiDeregister(Fdo);
 
     IoSkipCurrentIrpStackLocation(Irp);
     status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
@@ -1081,7 +1081,7 @@ done:
     Irp->IoStatus.Status = STATUS_SUCCESS;
 #pragma warning(suppress : 6031)
     IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
-    WmiFinalise(Fdo);
+    WmiDeregister(Fdo);
 
     IoSkipCurrentIrpStackLocation(Irp);
     status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
@@ -1335,7 +1335,7 @@ __FdoSetDevicePowerUp(
 
     ASSERT3U(DeviceState, ==, PowerDeviceD0);
     status = FdoD3ToD0(Fdo);
-    SessionsResumeAll(Fdo);
+    WmiSessionsResumeAll(Fdo);
     ASSERT(NT_SUCCESS(status));
 
 done:
@@ -1368,7 +1368,7 @@ __FdoSetDevicePowerDown(
     ASSERT3U(DeviceState, ==, PowerDeviceD3);
 
     if (__FdoGetDevicePowerState(Fdo) == PowerDeviceD0){
-        SessionsSuspendAll(Fdo);
+        WmiSessionsSuspendAll(Fdo);
         FdoD0ToD3(Fdo);
     }
 
@@ -2322,6 +2322,10 @@ FdoCreate(
     if (!NT_SUCCESS(status))
         goto fail13;
 
+    status = WmiInitialize(Fdo);
+    if (!NT_SUCCESS(status))
+        goto fail14;
+
     KeInitializeSpinLock(&Fdo->StoreWatchLock);
     InitializeListHead(&Fdo->StoreWatchList);
 
@@ -2341,7 +2345,7 @@ FdoCreate(
                                CsqReleaseLock,
                                CsqCompleteCanceledIrp);
     if (!NT_SUCCESS(status))
-        goto fail14;
+        goto fail15;
 
 #if (NTDDI_VERSION >= NTDDI_WIN7)
     ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
@@ -2352,7 +2356,7 @@ FdoCreate(
     status = STATUS_NO_MEMORY;
     Fdo->EvtchnDpc = __FdoAllocate(sizeof (KDPC) * ProcessorCount);
     if (Fdo->EvtchnDpc == NULL)
-        goto fail15;
+        goto fail16;
 
     for (Index = 0; Index < ProcessorCount; Index++) {
 #if (NTDDI_VERSION >= NTDDI_WIN7)
@@ -2379,9 +2383,29 @@ FdoCreate(
 
     return STATUS_SUCCESS;
 
+fail16:
+    Error("fail6\n");
+
+    RtlZeroMemory(&Fdo->IrpQueue, sizeof (IO_CSQ));
+
 fail15:
     Error("fail15\n");
 
+    RtlZeroMemory(&Fdo->GnttabCacheLock, sizeof (KSPIN_LOCK));
+    ASSERT(IsListEmpty(&Fdo->IrpList));
+    RtlZeroMemory(&Fdo->IrpList, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&Fdo->IrpQueueLock, sizeof (KSPIN_LOCK));
+
+    ASSERT(IsListEmpty(&Fdo->EvtchnList));
+    RtlZeroMemory(&Fdo->EvtchnList, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&Fdo->EvtchnLock, sizeof (KSPIN_LOCK));
+
+    ASSERT(IsListEmpty(&Fdo->StoreWatchList));
+    RtlZeroMemory(&Fdo->StoreWatchList, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&Fdo->StoreWatchLock, sizeof (KSPIN_LOCK));
+
+    WmiTeardown(Fdo);
+
 fail14:
     Error("fail14\n");
 
@@ -2468,9 +2492,6 @@ fail1:
     return status;
 }
 
-
-
-
 VOID
 FdoDestroy(
     IN  PXENIFACE_FDO     Fdo
@@ -2552,8 +2573,7 @@ FdoDestroy(
     Fdo->PhysicalDeviceObject = NULL;
     Fdo->Dx = NULL;
 
-    RtlZeroMemory(&Fdo->SessionLock, sizeof(FAST_MUTEX));
-    RtlZeroMemory(&Fdo->SessionHead, sizeof(LIST_ENTRY));
+    WmiTeardown(Fdo);
     RtlZeroMemory(&Fdo->registryWriteEvent, sizeof(KEVENT));
 
     RtlFreeUnicodeString(&Fdo->InterfaceName);
diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
index 0ae87d4..1ae84e1 100644
--- a/src/xeniface/wmi.c
+++ b/src/xeniface/wmi.c
@@ -1255,20 +1255,23 @@ void SuspendSessionLocked(XENIFACE_FDO *fdoData,
     }
 }
 
-
-void SessionsSuspendAll(XENIFACE_FDO *fdoData) {
+VOID
+WmiSessionsSuspendAll(
+    IN  PXENIFACE_FDO   Fdo
+    )
+{
     XenStoreSession *session;
-    LockSessions(fdoData);
+
+    LockSessions(Fdo);
     XenIfaceDebugPrint(TRACE,"Suspend all sessions\n");
-    session = (XenStoreSession *)fdoData->SessionHead.Flink;
-    while (session != (XenStoreSession *)&fdoData->SessionHead) {
-        SuspendSessionLocked(fdoData, session);
+    session = (XenStoreSession *)Fdo->SessionHead.Flink;
+    while (session != (XenStoreSession *)&Fdo->SessionHead) {
+        SuspendSessionLocked(Fdo, session);
         session = (XenStoreSession *)session->listentry.Flink;
     }
-    UnlockSessions(fdoData);
+    UnlockSessions(Fdo);
 }
 
-
 void SessionRenewWatchesLocked(XenStoreSession *session) {
     int i;
     XenStoreWatch *watch;
@@ -1300,61 +1303,61 @@ void ResumeSessionLocked(XENIFACE_FDO *fdoData,
     SessionRenewWatchesLocked(session);
 }
 
-void SessionsResumeAll(XENIFACE_FDO *fdoData) {
+VOID
+WmiSessionsResumeAll(
+    IN  PXENIFACE_FDO   Fdo
+    )
+{
     XenStoreSession *session;
 
-    LockSessions(fdoData);
+    LockSessions(Fdo);
     XenIfaceDebugPrint(TRACE,"Resume all sessions\n");
-    session = (XenStoreSession *)fdoData->SessionHead.Flink;
-    while (session != (XenStoreSession *)&fdoData->SessionHead) {
-        ResumeSessionLocked(fdoData, session );
-        session=(XenStoreSession *)session->listentry.Flink;
+    session = (XenStoreSession *)Fdo->SessionHead.Flink;
+    while (session != (XenStoreSession *)&Fdo->SessionHead) {
+        ResumeSessionLocked(Fdo, session);
+        session = (XenStoreSession *)session->listentry.Flink;
     }
-    UnlockSessions(fdoData);
+    UnlockSessions(Fdo);
 }
 
-
 NTSTATUS
-WmiInit(
-        PXENIFACE_FDO FdoData
+WmiRegister(
+    IN  PXENIFACE_FDO   Fdo
     )
 {
-    NTSTATUS status = STATUS_SUCCESS;
+    NTSTATUS            status;
+
     XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__);
     XenIfaceDebugPrint(INFO,"DRV: XenIface WMI Initialisation\n");
 
+    status = IoWMIRegistrationControl(Fdo->Dx->DeviceObject,
+                                      WMIREG_ACTION_REGISTER);
+    if (!NT_SUCCESS(status))
+        goto fail1;
 
+    Fdo->WmiReady = 1;
+    return STATUS_SUCCESS;
 
-
-    IoWMISuggestInstanceName(FdoData->PhysicalDeviceObject, NULL, FALSE,
-                             &FdoData->SuggestedInstanceName);
-    InitializeListHead(&FdoData->SessionHead);
-    FdoData->Sessions = 0;
-    ExInitializeFastMutex(&FdoData->SessionLock);
-
-    status = IoWMIRegistrationControl(FdoData->Dx->DeviceObject, WMIREG_ACTION_REGISTER);
-    FdoData->WmiReady = 1;
+fail1:
+    Error("fail1 (%08x)\n", status);
     return status;
 }
 
-NTSTATUS
-WmiFinalise(
-    PXENIFACE_FDO FdoData
+VOID
+WmiDeregister(
+    IN  PXENIFACE_FDO   Fdo
     )
 {
-    NTSTATUS status = STATUS_SUCCESS;
-    if (FdoData->WmiReady) {
-        XenIfaceDebugPrint(INFO,"DRV: XenIface WMI Finalisation\n");
-        XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__);
-        SessionsRemoveAll(FdoData);
+    if (!Fdo->WmiReady)
+        return;
 
-        status =IoWMIRegistrationControl(FdoData->Dx->DeviceObject, WMIREG_ACTION_DEREGISTER);
-        RtlFreeUnicodeString(&FdoData->SuggestedInstanceName);
-        RtlZeroBytes(&FdoData->SuggestedInstanceName, sizeof(UNICODE_STRING));
+    XenIfaceDebugPrint(INFO,"DRV: XenIface WMI Finalisation\n");
+    XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__);
 
-        FdoData->WmiReady = 0;
-    }
-    return status;
+    SessionsRemoveAll(Fdo);
+    (VOID) IoWMIRegistrationControl(Fdo->Dx->DeviceObject,
+                                    WMIREG_ACTION_DEREGISTER);
+    Fdo->WmiReady = 0;
 }
 
 NTSTATUS
@@ -3090,4 +3093,41 @@ Updated Routine Description:
     }
 }
 
+NTSTATUS
+WmiInitialize(
+    IN  PXENIFACE_FDO   Fdo
+    )
+{
+    NTSTATUS            status;
+
+    status = IoWMISuggestInstanceName(Fdo->PhysicalDeviceObject,
+                                      NULL,
+                                      FALSE,
+                                      &Fdo->SuggestedInstanceName);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    Fdo->Sessions = 0;
+    InitializeListHead(&Fdo->SessionHead);
+    ExInitializeFastMutex(&Fdo->SessionLock);
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+    return status;
+}
+
+VOID
+WmiTeardown(
+    IN  PXENIFACE_FDO   Fdo
+    )
+{
+    ASSERT(Fdo->Sessions == 0);
+
+    RtlZeroMemory(&Fdo->SessionLock, sizeof(FAST_MUTEX));
+    RtlZeroMemory(&Fdo->SessionHead, sizeof(LIST_ENTRY));
 
+    RtlFreeUnicodeString(&Fdo->SuggestedInstanceName);
+    RtlZeroMemory(&Fdo->SuggestedInstanceName, sizeof(UNICODE_STRING));
+}
diff --git a/src/xeniface/wmi.h b/src/xeniface/wmi.h
index b9dd256..2656b46 100644
--- a/src/xeniface/wmi.h
+++ b/src/xeniface/wmi.h
@@ -38,33 +38,44 @@
 #include "wmi_generated.h"
 
 extern NTSTATUS
-WmiProcessMinorFunction(
-    IN  PXENIFACE_FDO   Fdo,
-    IN  PIRP            Irp
+WmiInitialize(
+    IN  PXENIFACE_FDO   Fdo
     );
 
 extern VOID
-WmiFireSuspendEvent(
+WmiTeardown(
     IN  PXENIFACE_FDO   Fdo
     );
 
-NTSTATUS
-WmiInit(
-    PXENIFACE_FDO FdoData
-); 
+extern NTSTATUS
+WmiRegister(
+    IN  PXENIFACE_FDO   Fdo
+    );
 
+extern VOID
+WmiDeregister(
+    IN  PXENIFACE_FDO   Fdo
+    );
 
-NTSTATUS
-WmiFinalise(       
-    PXENIFACE_FDO FdoData
-); 
+extern VOID
+WmiSessionsResumeAll(
+    IN  PXENIFACE_FDO   Fdo
+    );
 
-void SessionsResumeAll(
-    XENIFACE_FDO *fdoData
-);
+extern VOID
+WmiSessionsSuspendAll(
+    IN  PXENIFACE_FDO   Fdo
+    );
 
-void SessionsSuspendAll(
-    XENIFACE_FDO *fdoData
-);
+extern NTSTATUS
+WmiProcessMinorFunction(
+    IN  PXENIFACE_FDO   Fdo,
+    IN  PIRP            Irp
+    );
+
+extern VOID
+WmiFireSuspendEvent(
+    IN  PXENIFACE_FDO   Fdo
+    );
 
 #endif
-- 
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 Thu Oct 29 14:51:38 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 14:51: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 1ZroYE-0006Vi-NO; Thu, 29 Oct 2015 14:51:38 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7374c8f9b=owen.smith@citrix.com>)
	id 1ZroYE-0006Uv-0W
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 14:51:38 +0000
Received: from [85.158.137.68] by server-4.bemta-3.messagelabs.com id
	A1/77-09570-97232365; Thu, 29 Oct 2015 14:51:37 +0000
X-Env-Sender: prvs=7374c8f9b=owen.smith@citrix.com
X-Msg-Ref: server-5.tower-31.messagelabs.com!1446130295!58096587!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 20893 invoked from network); 29 Oct 2015 14:51:36 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-5.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	29 Oct 2015 14:51:36 -0000
X-IronPort-AV: E=Sophos;i="5.20,214,1444694400"; d="scan'208";a="314344712"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Thu, 29 Oct 2015 14:49:44 +0000
Message-ID: <1446130187-30460-4-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
References: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA2
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 3/6] Refactor Wmi header,
	split initialize/teardown and register/deregister
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

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xeniface/fdo.c |  44 +++++++++++++------
 src/xeniface/wmi.c | 124 +++++++++++++++++++++++++++++++++++------------------
 src/xeniface/wmi.h |  47 ++++++++++++--------
 3 files changed, 143 insertions(+), 72 deletions(-)

diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index b32e506..10ead15 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -896,7 +896,7 @@ FdoStartDevice(
 
 
     if (__FdoGetDevicePnpState(Fdo) != Stopped) {
-        status = WmiInit(Fdo);
+        status = WmiRegister(Fdo);
         if (!NT_SUCCESS(status))
             goto fail5;
     }
@@ -1046,7 +1046,7 @@ FdoSurpriseRemoval(
     Irp->IoStatus.Status = STATUS_SUCCESS;
 #pragma warning(suppress : 6031)
     IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
-    WmiFinalise(Fdo);
+    WmiDeregister(Fdo);
 
     IoSkipCurrentIrpStackLocation(Irp);
     status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
@@ -1081,7 +1081,7 @@ done:
     Irp->IoStatus.Status = STATUS_SUCCESS;
 #pragma warning(suppress : 6031)
     IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
-    WmiFinalise(Fdo);
+    WmiDeregister(Fdo);
 
     IoSkipCurrentIrpStackLocation(Irp);
     status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
@@ -1335,7 +1335,7 @@ __FdoSetDevicePowerUp(
 
     ASSERT3U(DeviceState, ==, PowerDeviceD0);
     status = FdoD3ToD0(Fdo);
-    SessionsResumeAll(Fdo);
+    WmiSessionsResumeAll(Fdo);
     ASSERT(NT_SUCCESS(status));
 
 done:
@@ -1368,7 +1368,7 @@ __FdoSetDevicePowerDown(
     ASSERT3U(DeviceState, ==, PowerDeviceD3);
 
     if (__FdoGetDevicePowerState(Fdo) == PowerDeviceD0){
-        SessionsSuspendAll(Fdo);
+        WmiSessionsSuspendAll(Fdo);
         FdoD0ToD3(Fdo);
     }
 
@@ -2322,6 +2322,10 @@ FdoCreate(
     if (!NT_SUCCESS(status))
         goto fail13;
 
+    status = WmiInitialize(Fdo);
+    if (!NT_SUCCESS(status))
+        goto fail14;
+
     KeInitializeSpinLock(&Fdo->StoreWatchLock);
     InitializeListHead(&Fdo->StoreWatchList);
 
@@ -2341,7 +2345,7 @@ FdoCreate(
                                CsqReleaseLock,
                                CsqCompleteCanceledIrp);
     if (!NT_SUCCESS(status))
-        goto fail14;
+        goto fail15;
 
 #if (NTDDI_VERSION >= NTDDI_WIN7)
     ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
@@ -2352,7 +2356,7 @@ FdoCreate(
     status = STATUS_NO_MEMORY;
     Fdo->EvtchnDpc = __FdoAllocate(sizeof (KDPC) * ProcessorCount);
     if (Fdo->EvtchnDpc == NULL)
-        goto fail15;
+        goto fail16;
 
     for (Index = 0; Index < ProcessorCount; Index++) {
 #if (NTDDI_VERSION >= NTDDI_WIN7)
@@ -2379,9 +2383,29 @@ FdoCreate(
 
     return STATUS_SUCCESS;
 
+fail16:
+    Error("fail6\n");
+
+    RtlZeroMemory(&Fdo->IrpQueue, sizeof (IO_CSQ));
+
 fail15:
     Error("fail15\n");
 
+    RtlZeroMemory(&Fdo->GnttabCacheLock, sizeof (KSPIN_LOCK));
+    ASSERT(IsListEmpty(&Fdo->IrpList));
+    RtlZeroMemory(&Fdo->IrpList, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&Fdo->IrpQueueLock, sizeof (KSPIN_LOCK));
+
+    ASSERT(IsListEmpty(&Fdo->EvtchnList));
+    RtlZeroMemory(&Fdo->EvtchnList, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&Fdo->EvtchnLock, sizeof (KSPIN_LOCK));
+
+    ASSERT(IsListEmpty(&Fdo->StoreWatchList));
+    RtlZeroMemory(&Fdo->StoreWatchList, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&Fdo->StoreWatchLock, sizeof (KSPIN_LOCK));
+
+    WmiTeardown(Fdo);
+
 fail14:
     Error("fail14\n");
 
@@ -2468,9 +2492,6 @@ fail1:
     return status;
 }
 
-
-
-
 VOID
 FdoDestroy(
     IN  PXENIFACE_FDO     Fdo
@@ -2552,8 +2573,7 @@ FdoDestroy(
     Fdo->PhysicalDeviceObject = NULL;
     Fdo->Dx = NULL;
 
-    RtlZeroMemory(&Fdo->SessionLock, sizeof(FAST_MUTEX));
-    RtlZeroMemory(&Fdo->SessionHead, sizeof(LIST_ENTRY));
+    WmiTeardown(Fdo);
     RtlZeroMemory(&Fdo->registryWriteEvent, sizeof(KEVENT));
 
     RtlFreeUnicodeString(&Fdo->InterfaceName);
diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
index 0ae87d4..1ae84e1 100644
--- a/src/xeniface/wmi.c
+++ b/src/xeniface/wmi.c
@@ -1255,20 +1255,23 @@ void SuspendSessionLocked(XENIFACE_FDO *fdoData,
     }
 }
 
-
-void SessionsSuspendAll(XENIFACE_FDO *fdoData) {
+VOID
+WmiSessionsSuspendAll(
+    IN  PXENIFACE_FDO   Fdo
+    )
+{
     XenStoreSession *session;
-    LockSessions(fdoData);
+
+    LockSessions(Fdo);
     XenIfaceDebugPrint(TRACE,"Suspend all sessions\n");
-    session = (XenStoreSession *)fdoData->SessionHead.Flink;
-    while (session != (XenStoreSession *)&fdoData->SessionHead) {
-        SuspendSessionLocked(fdoData, session);
+    session = (XenStoreSession *)Fdo->SessionHead.Flink;
+    while (session != (XenStoreSession *)&Fdo->SessionHead) {
+        SuspendSessionLocked(Fdo, session);
         session = (XenStoreSession *)session->listentry.Flink;
     }
-    UnlockSessions(fdoData);
+    UnlockSessions(Fdo);
 }
 
-
 void SessionRenewWatchesLocked(XenStoreSession *session) {
     int i;
     XenStoreWatch *watch;
@@ -1300,61 +1303,61 @@ void ResumeSessionLocked(XENIFACE_FDO *fdoData,
     SessionRenewWatchesLocked(session);
 }
 
-void SessionsResumeAll(XENIFACE_FDO *fdoData) {
+VOID
+WmiSessionsResumeAll(
+    IN  PXENIFACE_FDO   Fdo
+    )
+{
     XenStoreSession *session;
 
-    LockSessions(fdoData);
+    LockSessions(Fdo);
     XenIfaceDebugPrint(TRACE,"Resume all sessions\n");
-    session = (XenStoreSession *)fdoData->SessionHead.Flink;
-    while (session != (XenStoreSession *)&fdoData->SessionHead) {
-        ResumeSessionLocked(fdoData, session );
-        session=(XenStoreSession *)session->listentry.Flink;
+    session = (XenStoreSession *)Fdo->SessionHead.Flink;
+    while (session != (XenStoreSession *)&Fdo->SessionHead) {
+        ResumeSessionLocked(Fdo, session);
+        session = (XenStoreSession *)session->listentry.Flink;
     }
-    UnlockSessions(fdoData);
+    UnlockSessions(Fdo);
 }
 
-
 NTSTATUS
-WmiInit(
-        PXENIFACE_FDO FdoData
+WmiRegister(
+    IN  PXENIFACE_FDO   Fdo
     )
 {
-    NTSTATUS status = STATUS_SUCCESS;
+    NTSTATUS            status;
+
     XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__);
     XenIfaceDebugPrint(INFO,"DRV: XenIface WMI Initialisation\n");
 
+    status = IoWMIRegistrationControl(Fdo->Dx->DeviceObject,
+                                      WMIREG_ACTION_REGISTER);
+    if (!NT_SUCCESS(status))
+        goto fail1;
 
+    Fdo->WmiReady = 1;
+    return STATUS_SUCCESS;
 
-
-    IoWMISuggestInstanceName(FdoData->PhysicalDeviceObject, NULL, FALSE,
-                             &FdoData->SuggestedInstanceName);
-    InitializeListHead(&FdoData->SessionHead);
-    FdoData->Sessions = 0;
-    ExInitializeFastMutex(&FdoData->SessionLock);
-
-    status = IoWMIRegistrationControl(FdoData->Dx->DeviceObject, WMIREG_ACTION_REGISTER);
-    FdoData->WmiReady = 1;
+fail1:
+    Error("fail1 (%08x)\n", status);
     return status;
 }
 
-NTSTATUS
-WmiFinalise(
-    PXENIFACE_FDO FdoData
+VOID
+WmiDeregister(
+    IN  PXENIFACE_FDO   Fdo
     )
 {
-    NTSTATUS status = STATUS_SUCCESS;
-    if (FdoData->WmiReady) {
-        XenIfaceDebugPrint(INFO,"DRV: XenIface WMI Finalisation\n");
-        XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__);
-        SessionsRemoveAll(FdoData);
+    if (!Fdo->WmiReady)
+        return;
 
-        status =IoWMIRegistrationControl(FdoData->Dx->DeviceObject, WMIREG_ACTION_DEREGISTER);
-        RtlFreeUnicodeString(&FdoData->SuggestedInstanceName);
-        RtlZeroBytes(&FdoData->SuggestedInstanceName, sizeof(UNICODE_STRING));
+    XenIfaceDebugPrint(INFO,"DRV: XenIface WMI Finalisation\n");
+    XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__);
 
-        FdoData->WmiReady = 0;
-    }
-    return status;
+    SessionsRemoveAll(Fdo);
+    (VOID) IoWMIRegistrationControl(Fdo->Dx->DeviceObject,
+                                    WMIREG_ACTION_DEREGISTER);
+    Fdo->WmiReady = 0;
 }
 
 NTSTATUS
@@ -3090,4 +3093,41 @@ Updated Routine Description:
     }
 }
 
+NTSTATUS
+WmiInitialize(
+    IN  PXENIFACE_FDO   Fdo
+    )
+{
+    NTSTATUS            status;
+
+    status = IoWMISuggestInstanceName(Fdo->PhysicalDeviceObject,
+                                      NULL,
+                                      FALSE,
+                                      &Fdo->SuggestedInstanceName);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    Fdo->Sessions = 0;
+    InitializeListHead(&Fdo->SessionHead);
+    ExInitializeFastMutex(&Fdo->SessionLock);
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+    return status;
+}
+
+VOID
+WmiTeardown(
+    IN  PXENIFACE_FDO   Fdo
+    )
+{
+    ASSERT(Fdo->Sessions == 0);
+
+    RtlZeroMemory(&Fdo->SessionLock, sizeof(FAST_MUTEX));
+    RtlZeroMemory(&Fdo->SessionHead, sizeof(LIST_ENTRY));
 
+    RtlFreeUnicodeString(&Fdo->SuggestedInstanceName);
+    RtlZeroMemory(&Fdo->SuggestedInstanceName, sizeof(UNICODE_STRING));
+}
diff --git a/src/xeniface/wmi.h b/src/xeniface/wmi.h
index b9dd256..2656b46 100644
--- a/src/xeniface/wmi.h
+++ b/src/xeniface/wmi.h
@@ -38,33 +38,44 @@
 #include "wmi_generated.h"
 
 extern NTSTATUS
-WmiProcessMinorFunction(
-    IN  PXENIFACE_FDO   Fdo,
-    IN  PIRP            Irp
+WmiInitialize(
+    IN  PXENIFACE_FDO   Fdo
     );
 
 extern VOID
-WmiFireSuspendEvent(
+WmiTeardown(
     IN  PXENIFACE_FDO   Fdo
     );
 
-NTSTATUS
-WmiInit(
-    PXENIFACE_FDO FdoData
-); 
+extern NTSTATUS
+WmiRegister(
+    IN  PXENIFACE_FDO   Fdo
+    );
 
+extern VOID
+WmiDeregister(
+    IN  PXENIFACE_FDO   Fdo
+    );
 
-NTSTATUS
-WmiFinalise(       
-    PXENIFACE_FDO FdoData
-); 
+extern VOID
+WmiSessionsResumeAll(
+    IN  PXENIFACE_FDO   Fdo
+    );
 
-void SessionsResumeAll(
-    XENIFACE_FDO *fdoData
-);
+extern VOID
+WmiSessionsSuspendAll(
+    IN  PXENIFACE_FDO   Fdo
+    );
 
-void SessionsSuspendAll(
-    XENIFACE_FDO *fdoData
-);
+extern NTSTATUS
+WmiProcessMinorFunction(
+    IN  PXENIFACE_FDO   Fdo,
+    IN  PIRP            Irp
+    );
+
+extern VOID
+WmiFireSuspendEvent(
+    IN  PXENIFACE_FDO   Fdo
+    );
 
 #endif
-- 
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 Thu Oct 29 14:51:38 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 14:51: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 1ZroYE-0006Va-M7; Thu, 29 Oct 2015 14:51:38 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7374c8f9b=owen.smith@citrix.com>)
	id 1ZroYD-0006Ul-6F
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 14:51:37 +0000
Received: from [193.109.254.147] by server-14.bemta-14.messagelabs.com id
	92/23-04752-87232365; Thu, 29 Oct 2015 14:51:36 +0000
X-Env-Sender: prvs=7374c8f9b=owen.smith@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1446130291!26647323!3
X-Originating-IP: [66.165.176.89]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27682 invoked from network); 29 Oct 2015 14:51:35 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	29 Oct 2015 14:51:35 -0000
X-IronPort-AV: E=Sophos;i="5.20,214,1444694400"; d="scan'208";a="309085086"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Thu, 29 Oct 2015 14:49:46 +0000
Message-ID: <1446130187-30460-6-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
References: <1446130187-30460-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 5/6] Fold __FdoD0ToD3/__FdoD3ToD0 into caller
	Remove redundant functions
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

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xeniface/fdo.c | 221 +++++++++++++----------------------------------------
 1 file changed, 55 insertions(+), 166 deletions(-)

diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index 2b3e44d..c1a9a8f 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -522,86 +522,6 @@ FdoReleaseMutex(
         FdoDestroy(Fdo);
 }
 
-
-static FORCEINLINE PANSI_STRING
-__FdoMultiSzToUpcaseAnsi(
-    IN  PCHAR       Buffer
-    )
-{
-    PANSI_STRING    Ansi;
-    LONG            Index;
-    LONG            Count;
-    NTSTATUS        status;
-
-    Index = 0;
-    Count = 0;
-    for (;;) {
-        if (Buffer[Index] == '\0') {
-            Count++;
-            Index++;
-
-            // Check for double NUL
-            if (Buffer[Index] == '\0')
-                break;
-        } else {
-            Buffer[Index] = (CHAR)toupper(Buffer[Index]);
-            Index++;
-        }
-    }
-
-    Ansi = (PANSI_STRING)__FdoAllocate(sizeof (ANSI_STRING) * (Count + 1));
-
-    status = STATUS_NO_MEMORY;
-    if (Ansi == NULL)
-        goto fail1;
-
-    for (Index = 0; Index < Count; Index++) {
-        ULONG   Length;
-
-        Length = (ULONG)strlen(Buffer);
-        Ansi[Index].MaximumLength = (USHORT)(Length + 1);
-        Ansi[Index].Buffer = (PCHAR)__FdoAllocate(Ansi[Index].MaximumLength);
-
-        status = STATUS_NO_MEMORY;
-        if (Ansi[Index].Buffer == NULL)
-            goto fail2;
-
-        RtlCopyMemory(Ansi[Index].Buffer, Buffer, Length);
-        Ansi[Index].Length = (USHORT)Length;
-
-        Buffer += Length + 1;
-    }
-
-    return Ansi;
-
-fail2:
-    Error("fail2\n");
-
-    while (--Index >= 0)
-        __FdoFree(Ansi[Index].Buffer);
-
-    __FdoFree(Ansi);
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return NULL;
-}
-
-static FORCEINLINE VOID
-__FdoFreeAnsi(
-    IN  PANSI_STRING    Ansi
-    )
-{
-    ULONG               Index;
-
-    for (Index = 0; Ansi[Index].Buffer != NULL; Index++)
-        __FdoFree(Ansi[Index].Buffer);
-
-    __FdoFree(Ansi);
-}
-
-
 static DECLSPEC_NOINLINE VOID
 FdoParseResources(
     IN  PXENIFACE_FDO             Fdo,
@@ -649,17 +569,19 @@ FdoParseResources(
     }
 }
 
-static FORCEINLINE NTSTATUS
-__FdoD3ToD0(
+static DECLSPEC_NOINLINE NTSTATUS
+FdoD3ToD0(
     IN  PXENIFACE_FDO Fdo
     )
 {
-    POWER_STATE     PowerState;
+    KIRQL           Irql;
     NTSTATUS        status;
+    POWER_STATE     PowerState;
 
-    Trace("====>\n");
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    KeRaiseIrql(DISPATCH_LEVEL, &Irql);
 
-    ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
     ASSERT3U(__FdoGetDevicePowerState(Fdo), ==, PowerDeviceD3);
 
     status = XENBUS_STORE(Acquire, &Fdo->StoreInterface);
@@ -685,85 +607,13 @@ __FdoD3ToD0(
     if (!NT_SUCCESS(status))
         goto fail4;
 
-    __FdoSetDevicePowerState(Fdo, PowerDeviceD0);
-
-    PowerState.DeviceState = PowerDeviceD0;
-    PoSetPowerState(Fdo->Dx->DeviceObject,
-                    DevicePowerState,
-                    PowerState);
-
-    Trace("<====\n");
-
-    return STATUS_SUCCESS;
-
-fail4:
-    Error("fail4\n");
-    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
-
-fail3:
-    Error("fail3\n");
-    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
-
-fail2:
-    Error("fail2\n");
-    XENBUS_STORE(Release, &Fdo->StoreInterface);
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return status;
-}
-
-static FORCEINLINE VOID
-__FdoD0ToD3(
-    IN  PXENIFACE_FDO Fdo
-    )
-{
-    POWER_STATE     PowerState;
-
-    Trace("====>\n");
-
-    ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
-    ASSERT3U(__FdoGetDevicePowerState(Fdo), ==, PowerDeviceD0);
-
-    PowerState.DeviceState = PowerDeviceD3;
-    PoSetPowerState(Fdo->Dx->DeviceObject,
-                    DevicePowerState,
-                    PowerState);
-
-    __FdoSetDevicePowerState(Fdo, PowerDeviceD3);
-
-    XENBUS_GNTTAB(DestroyCache, &Fdo->GnttabInterface, Fdo->GnttabCache);
-    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
-    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
-    XENBUS_STORE(Release, &Fdo->StoreInterface);
-
-    Trace("<====\n");
-}
-
-static DECLSPEC_NOINLINE NTSTATUS
-FdoD3ToD0(
-    IN  PXENIFACE_FDO Fdo
-    )
-{
-    KIRQL           Irql;
-    NTSTATUS        status;
-
-    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
-
-    KeRaiseIrql(DISPATCH_LEVEL, &Irql);
-
-    status = __FdoD3ToD0(Fdo);
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
     status = XENBUS_SUSPEND(Acquire, &Fdo->SuspendInterface);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail5;
 
     status = XENBUS_SHARED_INFO(Acquire, &Fdo->SharedInfoInterface);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail6;
 
     status = XENBUS_SUSPEND(Register,
                             &Fdo->SuspendInterface,
@@ -772,7 +622,14 @@ FdoD3ToD0(
                             Fdo,
                             &Fdo->SuspendCallbackLate);
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail7;
+
+    __FdoSetDevicePowerState(Fdo, PowerDeviceD0);
+
+    PowerState.DeviceState = PowerDeviceD0;
+    PoSetPowerState(Fdo->Dx->DeviceObject,
+                    DevicePowerState,
+                    PowerState);
 
     Fdo->InterfacesAcquired = TRUE;
     KeLowerIrql(Irql);
@@ -781,20 +638,38 @@ FdoD3ToD0(
 
     return STATUS_SUCCESS;
 
+fail7:
+    Error("fail7\n");
+
+    XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
+
+fail6:
+    Error("fail6\n");
+
+    XENBUS_SUSPEND(Release, &Fdo->SuspendInterface);
+
+fail5:
+    Error("fail5\n");
+
+    XENBUS_GNTTAB(DestroyCache,
+                  &Fdo->GnttabInterface,
+                  Fdo->GnttabCache);
+    Fdo->GnttabCache = NULL;
+
 fail4:
     Error("fail4\n");
 
-    XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
+    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
 
 fail3:
     Error("fail3\n");
 
-    XENBUS_SUSPEND(Release, &Fdo->SuspendInterface);
+    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
 
 fail2:
     Error("fail2\n");
 
-    __FdoD0ToD3(Fdo);
+    XENBUS_STORE(Release, &Fdo->StoreInterface);
 
 fail1:
     Error("fail1 (%08x)\n", status);
@@ -810,12 +685,14 @@ FdoD0ToD3(
     )
 {
     KIRQL           Irql;
+    POWER_STATE     PowerState;
 
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
 
     WmiSessionsSuspendAll(Fdo);
 
     KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+
     Fdo->InterfacesAcquired = FALSE;
 
     XENBUS_SUSPEND(Deregister,
@@ -824,10 +701,23 @@ FdoD0ToD3(
     Fdo->SuspendCallbackLate = NULL;
 
     XENBUS_SHARED_INFO(Release, &Fdo->SharedInfoInterface);
-
     XENBUS_SUSPEND(Release, &Fdo->SuspendInterface);
 
-    __FdoD0ToD3(Fdo);
+    XENBUS_GNTTAB(DestroyCache,
+                  &Fdo->GnttabInterface,
+                  Fdo->GnttabCache);
+    Fdo->GnttabCache = NULL;
+
+    XENBUS_GNTTAB(Release, &Fdo->GnttabInterface);
+    XENBUS_EVTCHN(Release, &Fdo->EvtchnInterface);
+    XENBUS_STORE(Release, &Fdo->StoreInterface);
+
+    PowerState.DeviceState = PowerDeviceD3;
+    PoSetPowerState(Fdo->Dx->DeviceObject,
+                    DevicePowerState,
+                    PowerState);
+
+    __FdoSetDevicePowerState(Fdo, PowerDeviceD3);
 
     KeLowerIrql(Irql);
 }
@@ -912,7 +802,6 @@ fail3:
     FdoS3ToS4(Fdo);
     __FdoSetSystemPowerState(Fdo, PowerSystemShutdown);
 
-
     RtlZeroMemory(&Fdo->Resource, sizeof (FDO_RESOURCE) * RESOURCE_COUNT);
 
 fail1:
-- 
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 Thu Oct 29 21:38:12 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 21:38: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 1Zrutf-0002TM-Ou; Thu, 29 Oct 2015 21:38:11 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72) (envelope-from <et@etit.hu>)
	id 1Zrutd-0002T6-IS
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 21:38:10 +0000
Received: from [85.158.139.211] by server-17.bemta-5.messagelabs.com id
	61/4F-18107-0C192365; Thu, 29 Oct 2015 21:38:08 +0000
X-Env-Sender: et@etit.hu
X-Msg-Ref: server-16.tower-206.messagelabs.com!1446154687!9748315!1
X-Originating-IP: [95.140.34.219]
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 4308 invoked from network); 29 Oct 2015 21:38:07 -0000
Received: from mail.etit.hu (HELO mail.etit.hu) (95.140.34.219)
	by server-16.tower-206.messagelabs.com with SMTP;
	29 Oct 2015 21:38:07 -0000
Received: from localhost (localhost [127.0.0.1])
	by mail.etit.hu (Postfix) with ESMTP id 29C4D407;
	Thu, 29 Oct 2015 22:38:07 +0100 (CET)
Received: from [10.10.10.20] (cirmoscica.hu [193.225.122.133])
	by mail.etit.hu (Postfix) with ESMTPSA id 7680C18B;
	Thu, 29 Oct 2015 22:37:59 +0100 (CET)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=etit.hu; s=mail;
	t=1446154679; bh=0ANoDNkArDsTG7Lb7ApAMSvod+6gKFr1l75i2KVMd6g=;
	h=Subject:From:Message-ID:Date:MIME-Version:Content-Type:From;
	b=XrEteTz1YuNr8IwsKb5iVvfAmQkIjQHGUWMTioWzSb6IPFIoH2BxWcU7HZ6JnNXTb
	6j1pOsCz/dgieION4SXgPJ+dXyVHE2Mh3xqMC83Ank05nWK15kLW286P1a+IPcCEd1
	DIcOqiWpAlaCOiIvSc0G2e3D9K4xvi6eeM9cAlxk=
References: <562F93F5.9070505@etit.hu>
	<CABoYbGryR=rupt2DUROLeaCoYJqxVBC0VMpSiM1bjH4H2p-KZg@mail.gmail.com>
	<56308C66.1030806@etit.hu>
	<CAFLBxZZSO_re+Wt4_b1pnmgS33hXJS_SRhnvse9QW-NRpSTQ1A@mail.gmail.com>
From: =?UTF-8?B?w4lsacOhcyBUYW3DoXM=?= <et@etit.hu>
X-Enigmail-Draft-Status: N1110
Organization: ETIT[nwpro] KFT
Message-ID: <563291B1.9080800@etit.hu>
Date: Thu, 29 Oct 2015 22:37:53 +0100
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <CAFLBxZZSO_re+Wt4_b1pnmgS33hXJS_SRhnvse9QW-NRpSTQ1A@mail.gmail.com>
Cc: "xen-users@lists.xen.org" <xen-users@lists.xen.org>,
	win-pv-devel@lists.xenproject.org
Subject: Re: [win-pv-devel] [Xen-users] Removing old glpv windows drivers to
 install new -> inaccessible boot device
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: multipart/mixed; boundary="===============6122869881459648715=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--===============6122869881459648715==
Content-Type: multipart/signed; micalg=pgp-sha1;
 protocol="application/pgp-signature";
 boundary="iJwfANONQOuf7r5lRDCH2o8ReSRe4v3As"

This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--iJwfANONQOuf7r5lRDCH2o8ReSRe4v3As
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Hi all. Thank you for the tips.

Here is what needed to be done.

- Boot in safe mode.
- use uninstall.bat to remove old drivers.
- use ccleaner or similar application to remove old driver install entrie=
s.
- scan through the file system end delete xen*
- bcdedit -set TESTSIGNING ON
- install pfx files to local computer cert store.
- reboot into safe mode
- install new drivers (xenbus, xenvif, etc) using dpinst.exe (admin mode)=

- reboot to normal mode (there will be no network, no xen devices can be
seen, etc for some reason)
- go to hardware, check unknown PCI device and manually install xenbus
for that.
- after this, all other drivers appear suddenly.
- reboot, done.

It would be nice to remove the testsigning though, but at lest it is
working now.

2015-10-29 10:38 keltez=C3=A9ssel, George Dunlap =C3=ADrta:
> On Wed, Oct 28, 2015 at 8:50 AM, =C3=89li=C3=A1s Tam=C3=A1s <et@etit.hu=
> wrote:
>> Hi. Yes, I confirm, that booting into safe mode is possible. I turned =
on
>> testsigning with bcdedit, and tried installing the drivers again.
>>
>> The isntall went fine, I could reboot. Unfortunately since then (it is=

>> more then 8 hours now) I'm facing the attached screen. The animation i=
s
>> just rolling, rolling rolling and nothing happens. CPU ticks are used,=

>> so I assume something is happening, but it seemes pretty much stuck.
>>
>> Any ideas?
>=20
> I *think* the XenServer PV drivers are using miniport; in which case
> this KB article might be of use:
>=20
> https://support.microsoft.com/en-us/kb/2795397
>=20
> Paul Durrant can correct me if I'm wrong about miniport (and may be
> able to point you to a more useful fix if so).
>=20
>  -George
>=20

--=20


=C3=89li=C3=A1s Tam=C3=A1s
Thomas Elias

ETIT[nwpro] KFT, =C3=9Cgyvezet=C5=91-H=C3=A1l=C3=B3zatbiztons=C3=A1gi spe=
cialista
ETIT[nwpro] Ltd, General Manager-Network security specialist

Tel. HU: +36/30-497-1626
Tel. DE: +49/160-651-8723
OpenPGP pubkey: http://etit.hu/doc/et-pub.asc

Okleveles m=C3=A9rn=C3=B6k-informatikus (MSC)
Master of Science in Information Technology (MSC)

Kapcsolat: http://etit.hu/index.php/hu/kapcsolat
Jogi nyilatkozat: http://etit.hu/disclaimer-email-hu.txt
Contact: http://etit.hu/index.php/en/contact
Disclaimer: http://etit.hu/disclaimer-email-en.txt


--iJwfANONQOuf7r5lRDCH2o8ReSRe4v3As
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)

iQIcBAEBAgAGBQJWMpG3AAoJENWYes1C3s/CSZ4QAJ2u212UFcc7QbMfavlDjPhM
jPR6qmhkNYmIWIVD4gWfPcFLji/WMIR6nqLCzDs71mMbkOREBVL5QIpGb35ni5op
yGbS3YKFfHNKHcnaxHCNxn9gcByhe/mdIYkb+dXnhHtdd05lJ9ZN3FoobX17UFRf
OpQdtGKUKytr4TILwu2xl4DP7syGyuUBI9MiFxEvd53kSzQt3/X97+U9Tjoz8XQH
btIw6uv+HbBYhOAvGRjgm84m7sfhYgi+YSmHQaihYv2fZgVtGn2vYrcPHtB5AqLv
nfhgorhXPWZyMQaoiK+ci8Mxmwa2ansy11soN6qcBL1vR4TaFZs686+P7BpIovL+
2wCb3iSJTYpSYL9kDSfJ4B5RbVX/5IcAa9s75jC/PG5s64Q7klkZ5DeKgbzswVKV
ct40YxpaWtTAkWLVN1BVqJpW3Yr1tnvZd2vPQP0Val/Cr6af+oN84/HMynodFlm6
0XcJ+OldHe6KydWABrStqy4iZEPrzCEOsbCedExkJ9OHLB+FkZ7E5l6Uh8ydPcfz
56JSqCZj3vTPgEsbkuF86NA/wHCwSnRhlb/OLt188t5Qig1cdCm9ZnDhy3XYMQ+k
u/Mtvi6gO8XRKZWxbgc3fWv3B5q/lTPkHrrPAHG2vDgh+m0G7YkOANXdRk0uTLxr
Tqt3iyTi2jN3HAc+MF2o
=PItU
-----END PGP SIGNATURE-----

--iJwfANONQOuf7r5lRDCH2o8ReSRe4v3As--


--===============6122869881459648715==
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
--===============6122869881459648715==--


From win-pv-devel-bounces@lists.xenproject.org Thu Oct 29 21:38:12 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 21:38: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 1Zrutf-0002TM-Ou; Thu, 29 Oct 2015 21:38:11 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72) (envelope-from <et@etit.hu>)
	id 1Zrutd-0002T6-IS
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 21:38:10 +0000
Received: from [85.158.139.211] by server-17.bemta-5.messagelabs.com id
	61/4F-18107-0C192365; Thu, 29 Oct 2015 21:38:08 +0000
X-Env-Sender: et@etit.hu
X-Msg-Ref: server-16.tower-206.messagelabs.com!1446154687!9748315!1
X-Originating-IP: [95.140.34.219]
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 4308 invoked from network); 29 Oct 2015 21:38:07 -0000
Received: from mail.etit.hu (HELO mail.etit.hu) (95.140.34.219)
	by server-16.tower-206.messagelabs.com with SMTP;
	29 Oct 2015 21:38:07 -0000
Received: from localhost (localhost [127.0.0.1])
	by mail.etit.hu (Postfix) with ESMTP id 29C4D407;
	Thu, 29 Oct 2015 22:38:07 +0100 (CET)
Received: from [10.10.10.20] (cirmoscica.hu [193.225.122.133])
	by mail.etit.hu (Postfix) with ESMTPSA id 7680C18B;
	Thu, 29 Oct 2015 22:37:59 +0100 (CET)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=etit.hu; s=mail;
	t=1446154679; bh=0ANoDNkArDsTG7Lb7ApAMSvod+6gKFr1l75i2KVMd6g=;
	h=Subject:From:Message-ID:Date:MIME-Version:Content-Type:From;
	b=XrEteTz1YuNr8IwsKb5iVvfAmQkIjQHGUWMTioWzSb6IPFIoH2BxWcU7HZ6JnNXTb
	6j1pOsCz/dgieION4SXgPJ+dXyVHE2Mh3xqMC83Ank05nWK15kLW286P1a+IPcCEd1
	DIcOqiWpAlaCOiIvSc0G2e3D9K4xvi6eeM9cAlxk=
References: <562F93F5.9070505@etit.hu>
	<CABoYbGryR=rupt2DUROLeaCoYJqxVBC0VMpSiM1bjH4H2p-KZg@mail.gmail.com>
	<56308C66.1030806@etit.hu>
	<CAFLBxZZSO_re+Wt4_b1pnmgS33hXJS_SRhnvse9QW-NRpSTQ1A@mail.gmail.com>
From: =?UTF-8?B?w4lsacOhcyBUYW3DoXM=?= <et@etit.hu>
X-Enigmail-Draft-Status: N1110
Organization: ETIT[nwpro] KFT
Message-ID: <563291B1.9080800@etit.hu>
Date: Thu, 29 Oct 2015 22:37:53 +0100
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <CAFLBxZZSO_re+Wt4_b1pnmgS33hXJS_SRhnvse9QW-NRpSTQ1A@mail.gmail.com>
Cc: "xen-users@lists.xen.org" <xen-users@lists.xen.org>,
	win-pv-devel@lists.xenproject.org
Subject: Re: [win-pv-devel] [Xen-users] Removing old glpv windows drivers to
 install new -> inaccessible boot device
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: multipart/mixed; boundary="===============6122869881459648715=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--===============6122869881459648715==
Content-Type: multipart/signed; micalg=pgp-sha1;
 protocol="application/pgp-signature";
 boundary="iJwfANONQOuf7r5lRDCH2o8ReSRe4v3As"

This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--iJwfANONQOuf7r5lRDCH2o8ReSRe4v3As
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Hi all. Thank you for the tips.

Here is what needed to be done.

- Boot in safe mode.
- use uninstall.bat to remove old drivers.
- use ccleaner or similar application to remove old driver install entrie=
s.
- scan through the file system end delete xen*
- bcdedit -set TESTSIGNING ON
- install pfx files to local computer cert store.
- reboot into safe mode
- install new drivers (xenbus, xenvif, etc) using dpinst.exe (admin mode)=

- reboot to normal mode (there will be no network, no xen devices can be
seen, etc for some reason)
- go to hardware, check unknown PCI device and manually install xenbus
for that.
- after this, all other drivers appear suddenly.
- reboot, done.

It would be nice to remove the testsigning though, but at lest it is
working now.

2015-10-29 10:38 keltez=C3=A9ssel, George Dunlap =C3=ADrta:
> On Wed, Oct 28, 2015 at 8:50 AM, =C3=89li=C3=A1s Tam=C3=A1s <et@etit.hu=
> wrote:
>> Hi. Yes, I confirm, that booting into safe mode is possible. I turned =
on
>> testsigning with bcdedit, and tried installing the drivers again.
>>
>> The isntall went fine, I could reboot. Unfortunately since then (it is=

>> more then 8 hours now) I'm facing the attached screen. The animation i=
s
>> just rolling, rolling rolling and nothing happens. CPU ticks are used,=

>> so I assume something is happening, but it seemes pretty much stuck.
>>
>> Any ideas?
>=20
> I *think* the XenServer PV drivers are using miniport; in which case
> this KB article might be of use:
>=20
> https://support.microsoft.com/en-us/kb/2795397
>=20
> Paul Durrant can correct me if I'm wrong about miniport (and may be
> able to point you to a more useful fix if so).
>=20
>  -George
>=20

--=20


=C3=89li=C3=A1s Tam=C3=A1s
Thomas Elias

ETIT[nwpro] KFT, =C3=9Cgyvezet=C5=91-H=C3=A1l=C3=B3zatbiztons=C3=A1gi spe=
cialista
ETIT[nwpro] Ltd, General Manager-Network security specialist

Tel. HU: +36/30-497-1626
Tel. DE: +49/160-651-8723
OpenPGP pubkey: http://etit.hu/doc/et-pub.asc

Okleveles m=C3=A9rn=C3=B6k-informatikus (MSC)
Master of Science in Information Technology (MSC)

Kapcsolat: http://etit.hu/index.php/hu/kapcsolat
Jogi nyilatkozat: http://etit.hu/disclaimer-email-hu.txt
Contact: http://etit.hu/index.php/en/contact
Disclaimer: http://etit.hu/disclaimer-email-en.txt


--iJwfANONQOuf7r5lRDCH2o8ReSRe4v3As
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)

iQIcBAEBAgAGBQJWMpG3AAoJENWYes1C3s/CSZ4QAJ2u212UFcc7QbMfavlDjPhM
jPR6qmhkNYmIWIVD4gWfPcFLji/WMIR6nqLCzDs71mMbkOREBVL5QIpGb35ni5op
yGbS3YKFfHNKHcnaxHCNxn9gcByhe/mdIYkb+dXnhHtdd05lJ9ZN3FoobX17UFRf
OpQdtGKUKytr4TILwu2xl4DP7syGyuUBI9MiFxEvd53kSzQt3/X97+U9Tjoz8XQH
btIw6uv+HbBYhOAvGRjgm84m7sfhYgi+YSmHQaihYv2fZgVtGn2vYrcPHtB5AqLv
nfhgorhXPWZyMQaoiK+ci8Mxmwa2ansy11soN6qcBL1vR4TaFZs686+P7BpIovL+
2wCb3iSJTYpSYL9kDSfJ4B5RbVX/5IcAa9s75jC/PG5s64Q7klkZ5DeKgbzswVKV
ct40YxpaWtTAkWLVN1BVqJpW3Yr1tnvZd2vPQP0Val/Cr6af+oN84/HMynodFlm6
0XcJ+OldHe6KydWABrStqy4iZEPrzCEOsbCedExkJ9OHLB+FkZ7E5l6Uh8ydPcfz
56JSqCZj3vTPgEsbkuF86NA/wHCwSnRhlb/OLt188t5Qig1cdCm9ZnDhy3XYMQ+k
u/Mtvi6gO8XRKZWxbgc3fWv3B5q/lTPkHrrPAHG2vDgh+m0G7YkOANXdRk0uTLxr
Tqt3iyTi2jN3HAc+MF2o
=PItU
-----END PGP SIGNATURE-----

--iJwfANONQOuf7r5lRDCH2o8ReSRe4v3As--


--===============6122869881459648715==
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
--===============6122869881459648715==--


From win-pv-devel-bounces@lists.xenproject.org Thu Oct 29 21:41:02 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 21:41:02 +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 1ZruwQ-0002ZA-06; Thu, 29 Oct 2015 21:41:02 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72) (envelope-from <et@etit.hu>)
	id 1ZruwO-0002Yz-31
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 21:41:00 +0000
Received: from [85.158.139.211] by server-15.bemta-5.messagelabs.com id
	A9/B8-16870-B6292365; Thu, 29 Oct 2015 21:40:59 +0000
X-Env-Sender: et@etit.hu
X-Msg-Ref: server-6.tower-206.messagelabs.com!1446154858!46246761!1
X-Originating-IP: [95.140.34.219]
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 31915 invoked from network); 29 Oct 2015 21:40:58 -0000
Received: from mail.etit.hu (HELO mail.etit.hu) (95.140.34.219)
	by server-6.tower-206.messagelabs.com with SMTP;
	29 Oct 2015 21:40:58 -0000
Received: from localhost (localhost [127.0.0.1])
	by mail.etit.hu (Postfix) with ESMTP id 0F988407
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 29 Oct 2015 22:40:58 +0100 (CET)
Received: from [10.10.10.20] (cirmoscica.hu [193.225.122.133])
	by mail.etit.hu (Postfix) with ESMTPSA id A644118B
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 29 Oct 2015 22:40:49 +0100 (CET)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=etit.hu; s=mail;
	t=1446154850; bh=a2QTywEFtvcPSwAGpo9vYfrbLgL4M2H2M3z7lHKxsog=;
	h=Subject:To:From:Message-ID:Date:MIME-Version:Content-Type:From;
	b=QNYy2bnrxOGYu6q8d/oI0uEh7U04u1b5JlFkD3+1vTxG1IiU+r4LSCbh4HbJrz51W
	uBkLjJeEsppFomVTdANqpYG6I3M4GwpqPIp6wtv1NnNz7TBcXflfVUgHBlqdZvS5r6
	vFUXbHy8VLuUubNV6swxoxrmJXpX+Ci5sBkTxk4o=
To: win-pv-devel@lists.xenproject.org
References: <1AD33E34BA5E3649B4F6C7FE476686F4211C6848@AMSPEX01CL03.citrite.net>
	<CANXFt06TCJ2aqOy7Fjkd+64FZqjWjs5pDq_wAkOtXZ2Af_ecfg@mail.gmail.com>
From: =?UTF-8?B?w4lsacOhcyBUYW3DoXM=?= <et@etit.hu>
Organization: ETIT[nwpro] KFT
Message-ID: <56329260.9070805@etit.hu>
Date: Thu, 29 Oct 2015 22:40:48 +0100
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <CANXFt06TCJ2aqOy7Fjkd+64FZqjWjs5pDq_wAkOtXZ2Af_ecfg@mail.gmail.com>
Subject: Re: [win-pv-devel] Signed Windows PV 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>
Content-Type: multipart/mixed; boundary="===============6837119790279854385=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--===============6837119790279854385==
Content-Type: multipart/signed; micalg=pgp-sha1;
 protocol="application/pgp-signature";
 boundary="Bhib6DBd35kafbgIf3MFdU8cwIlDvqXcK"

This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--Bhib6DBd35kafbgIf3MFdU8cwIlDvqXcK
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Hi.

> So if I have a self signed certificate and import it to Windows's
> Trusted Root CA in the certificate store, I can properly install self
> compiled PV drivers signed by that certificate to that Windows guest.=20
> Is my understanding correct?
This should be the way, in my understandig too, but unfortunately after
installing the pfx certificates to my windows10 local machine cert
store, the drivers were still not working.

I had to stay with TESTSIGNING to make it work. I wonder what the
problem could be.

>=20
> I saw a lot mails in this mailing list discussing failure of PV drivers=

> working under Windows 10.  Does it mean the PV drivers are not yet
> stable enough to work under Windows 10?
>=20
PV drivers are working well, I'm using it on several Windows 10
machines. I just posted a message about how to install them,

The only issue is now that they work only when TESTSIGNING is on.

> Regards
> Terry
>=20
> On Thu, Oct 29, 2015 at 4:52 PM, Ben Chalmers <ben.chalmers@citrix.com
> <mailto:ben.chalmers@citrix.com>> wrote:
>=20
>     Those statements are correct.
>=20
>     __ __
>=20
>     The drivers provided by Citrix XenServer are from the same code bas=
e
>     as the Xen project PV drivers =E2=80=93 but are currently older (an=
d taken
>     from a point before the drivers were handed over from the XenServer=

>     project to the Xen project).  Those drivers have BSD licensed sourc=
e
>     code (as do the Xen project drivers) so there shouldn=E2=80=99t be =
a
>     conflict (but don=E2=80=99t trust me =E2=80=93 I=E2=80=99m not a la=
wyer and not speaking for
>     Citrix here)
>=20
>     __ __
>=20
>     I would expect the Citrix drivers to work with Xen (but no promises=
,
>     YMMV!).  And going forwards (as Citrix PV drivers are increasingly
>     built from Xen project rather then the XenServer project code) this=

>     will be more and more likely.
>=20
>     __ __
>=20
>     (incidentally, if you have a code signing cert with a chain of trus=
t
>     back to a root provider, you can sign any drivers you build =E2=80=93=
 and
>     then install those certificates into Windows =E2=80=93 avoiding wor=
rying
>     about needing to turn test signing on.  Not sure if that helps)
>=20
>     __ __
>=20
>     Ben Chalmers
>=20
>     __ __
>=20
>     __ __
>=20
>=20
>     *From: *Xen Newbie
>     *Sent: *29 October 2015 05:55
>     *To: *Xen Windows PV Drivers Development Mailing List
>     *Subject: *[win-pv-devel] Signed Windows PV Driver
>=20
>     __ __
>=20
>     __ __
>=20
>     I've asked the questions at the Xen users mailing list but nobody
>     has interest to offer me a help.  If the questions are too basic an=
d
>     should not be raised in this devel mailing list, please forgive me.=
____
>=20
>     __ __
>=20
>     I want to install a signed PV drivers in my HVM windows guest since=

>     I learnt from the web that a test signed driver may lead to
>     conflicts with some Windows applications.____
>=20
>     __ __
>=20
>     I studied a lot from the Xen project pages and Xen mailing list for=

>     users and pv driver development. I am confused since some of the
>     information seems to be out-dated. ____
>=20
>     __ __
>=20
>     I consolidated what I learnt so far and would like to seek for help=

>     to clarify the following conecpts before I make my next move:____
>=20
>     __ __
>=20
>     1) Those signed Windows drivers resided on univention seemed to be
>     already out-dated.____
>=20
>     2) Those PV drivers provided on
>     http://www.xenproject.org/developers/teams/windows-pv-drivers.html
>     requires my own compilation. The drivers compiled are test signed
>     and requires setting the Windows to test mode.____
>=20
>     3) The PV drivers provided by Citrix XenServer seems to work also
>     with Xen Hypervisor but I'm not sure whether there is any license
>     conflict.____
>=20
>     4) There are Microsoft signed PV drivers provided by Oracle VM but =
I
>     need to use Oracle VM as my Domain 0 in order to use them.____
>=20
>     __ __
>=20
>     Can anyone confirm my understanding as fore-mentioned?____
>=20
>     __ __
>=20
>     I want to make a PC as a HTPC/NAS combo with HTPC part played by a
>     Windows 7 (Windows 10 preferred if feasible) PV HVM guest.____
>=20
>     __ __
>=20
>     I'm now stuck at the planning stage of Windows PV drivers. I don't
>     want to compile anything and set the Windows to test mode.____
>=20
>     __ __
>=20
>     So can I just download the PV drivers from Citrix and installed to
>     the guest? Will it work with my Xen 4.5/4.6 Hypervisor with Ubuntu
>     15.04 Domain 0?____
>=20
>     __ __
>=20
>     I'll be very grateful if anyone can help me.____
>=20
>     __ __
>=20
>     Regards____
>=20
>     Lok____
>=20
>     __ __
>=20
>     __ __
>=20
>=20
>=20
>=20
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
>=20

--=20


=C3=89li=C3=A1s Tam=C3=A1s
Thomas Elias

ETIT[nwpro] KFT, =C3=9Cgyvezet=C5=91-H=C3=A1l=C3=B3zatbiztons=C3=A1gi spe=
cialista
ETIT[nwpro] Ltd, General Manager-Network security specialist

Tel. HU: +36/30-497-1626
Tel. DE: +49/160-651-8723
OpenPGP pubkey: http://etit.hu/doc/et-pub.asc

Okleveles m=C3=A9rn=C3=B6k-informatikus (MSC)
Master of Science in Information Technology (MSC)

Kapcsolat: http://etit.hu/index.php/hu/kapcsolat
Jogi nyilatkozat: http://etit.hu/disclaimer-email-hu.txt
Contact: http://etit.hu/index.php/en/contact
Disclaimer: http://etit.hu/disclaimer-email-en.txt


--Bhib6DBd35kafbgIf3MFdU8cwIlDvqXcK
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)

iQIcBAEBAgAGBQJWMpJgAAoJENWYes1C3s/CFkwQAI5mzxMv5Mc+wDwpghPVWv4g
jqWxO4RD7QenWWf79B0iqNAVONyKPg7mQK7oDfIZFmTfFG5Sx0I88PWdWSD5vH2T
79qgsx1Q6nL9vo9xtrbeQCzFtfQ2jXGQkhhaBmTWmky/GbihY1VIb1LZhF+uBTdR
oVueRxiQ0oKgfoyfpyuLeBiLmm1ctZTTNLdHylES235WXooicRfr5q5XCCT29IE5
Sox+PhLc80H/DN6QBZDT+0Q2LTwQDKp+gc5tYfeE4c5LCXOcPh/sc/DqoHfEfRAv
KMYzFuSCGTg0+7wDUzq5+VWg2Pma+Lgc8IfKWZr9GoouQpe4bnZ9UVfCmasZHoeI
kKjnUW5EtYB5BG4Er6m5WgjvtCC4/0g7boOqj8RtZWlGB41MwEQtFmIe3pDn+SSb
6XRfzjJibzc+WX2l90ALXnnI1GfFF+nuEAhjjcRnkYGHbHDjpXeVxfet90iUsrGH
XYMQTgKZvQIGVUhpfmG1h0cLNdjyNALKQwaAzzeT7io0PVmePqVeWauTVdHeXHj3
fOePojTyY5R50msv2oAWkVS47RMbWNW3QycAiv+Q4qRpU2k1LVBxTrhZAodJOL1G
Z/pszPII0mg/TPXy5oMJIHkEFXLcdu1jk4odQebXfciDxowO+VXXwzAxRv8hPA9x
SL1pk9aZMvQ3Acg6fBvi
=kRxL
-----END PGP SIGNATURE-----

--Bhib6DBd35kafbgIf3MFdU8cwIlDvqXcK--


--===============6837119790279854385==
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
--===============6837119790279854385==--


From win-pv-devel-bounces@lists.xenproject.org Thu Oct 29 21:41:02 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 29 Oct 2015 21:41:02 +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 1ZruwQ-0002ZA-06; Thu, 29 Oct 2015 21:41:02 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72) (envelope-from <et@etit.hu>)
	id 1ZruwO-0002Yz-31
	for win-pv-devel@lists.xenproject.org; Thu, 29 Oct 2015 21:41:00 +0000
Received: from [85.158.139.211] by server-15.bemta-5.messagelabs.com id
	A9/B8-16870-B6292365; Thu, 29 Oct 2015 21:40:59 +0000
X-Env-Sender: et@etit.hu
X-Msg-Ref: server-6.tower-206.messagelabs.com!1446154858!46246761!1
X-Originating-IP: [95.140.34.219]
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 31915 invoked from network); 29 Oct 2015 21:40:58 -0000
Received: from mail.etit.hu (HELO mail.etit.hu) (95.140.34.219)
	by server-6.tower-206.messagelabs.com with SMTP;
	29 Oct 2015 21:40:58 -0000
Received: from localhost (localhost [127.0.0.1])
	by mail.etit.hu (Postfix) with ESMTP id 0F988407
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 29 Oct 2015 22:40:58 +0100 (CET)
Received: from [10.10.10.20] (cirmoscica.hu [193.225.122.133])
	by mail.etit.hu (Postfix) with ESMTPSA id A644118B
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 29 Oct 2015 22:40:49 +0100 (CET)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=etit.hu; s=mail;
	t=1446154850; bh=a2QTywEFtvcPSwAGpo9vYfrbLgL4M2H2M3z7lHKxsog=;
	h=Subject:To:From:Message-ID:Date:MIME-Version:Content-Type:From;
	b=QNYy2bnrxOGYu6q8d/oI0uEh7U04u1b5JlFkD3+1vTxG1IiU+r4LSCbh4HbJrz51W
	uBkLjJeEsppFomVTdANqpYG6I3M4GwpqPIp6wtv1NnNz7TBcXflfVUgHBlqdZvS5r6
	vFUXbHy8VLuUubNV6swxoxrmJXpX+Ci5sBkTxk4o=
To: win-pv-devel@lists.xenproject.org
References: <1AD33E34BA5E3649B4F6C7FE476686F4211C6848@AMSPEX01CL03.citrite.net>
	<CANXFt06TCJ2aqOy7Fjkd+64FZqjWjs5pDq_wAkOtXZ2Af_ecfg@mail.gmail.com>
From: =?UTF-8?B?w4lsacOhcyBUYW3DoXM=?= <et@etit.hu>
Organization: ETIT[nwpro] KFT
Message-ID: <56329260.9070805@etit.hu>
Date: Thu, 29 Oct 2015 22:40:48 +0100
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <CANXFt06TCJ2aqOy7Fjkd+64FZqjWjs5pDq_wAkOtXZ2Af_ecfg@mail.gmail.com>
Subject: Re: [win-pv-devel] Signed Windows PV 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>
Content-Type: multipart/mixed; boundary="===============6837119790279854385=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--===============6837119790279854385==
Content-Type: multipart/signed; micalg=pgp-sha1;
 protocol="application/pgp-signature";
 boundary="Bhib6DBd35kafbgIf3MFdU8cwIlDvqXcK"

This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--Bhib6DBd35kafbgIf3MFdU8cwIlDvqXcK
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Hi.

> So if I have a self signed certificate and import it to Windows's
> Trusted Root CA in the certificate store, I can properly install self
> compiled PV drivers signed by that certificate to that Windows guest.=20
> Is my understanding correct?
This should be the way, in my understandig too, but unfortunately after
installing the pfx certificates to my windows10 local machine cert
store, the drivers were still not working.

I had to stay with TESTSIGNING to make it work. I wonder what the
problem could be.

>=20
> I saw a lot mails in this mailing list discussing failure of PV drivers=

> working under Windows 10.  Does it mean the PV drivers are not yet
> stable enough to work under Windows 10?
>=20
PV drivers are working well, I'm using it on several Windows 10
machines. I just posted a message about how to install them,

The only issue is now that they work only when TESTSIGNING is on.

> Regards
> Terry
>=20
> On Thu, Oct 29, 2015 at 4:52 PM, Ben Chalmers <ben.chalmers@citrix.com
> <mailto:ben.chalmers@citrix.com>> wrote:
>=20
>     Those statements are correct.
>=20
>     __ __
>=20
>     The drivers provided by Citrix XenServer are from the same code bas=
e
>     as the Xen project PV drivers =E2=80=93 but are currently older (an=
d taken
>     from a point before the drivers were handed over from the XenServer=

>     project to the Xen project).  Those drivers have BSD licensed sourc=
e
>     code (as do the Xen project drivers) so there shouldn=E2=80=99t be =
a
>     conflict (but don=E2=80=99t trust me =E2=80=93 I=E2=80=99m not a la=
wyer and not speaking for
>     Citrix here)
>=20
>     __ __
>=20
>     I would expect the Citrix drivers to work with Xen (but no promises=
,
>     YMMV!).  And going forwards (as Citrix PV drivers are increasingly
>     built from Xen project rather then the XenServer project code) this=

>     will be more and more likely.
>=20
>     __ __
>=20
>     (incidentally, if you have a code signing cert with a chain of trus=
t
>     back to a root provider, you can sign any drivers you build =E2=80=93=
 and
>     then install those certificates into Windows =E2=80=93 avoiding wor=
rying
>     about needing to turn test signing on.  Not sure if that helps)
>=20
>     __ __
>=20
>     Ben Chalmers
>=20
>     __ __
>=20
>     __ __
>=20
>=20
>     *From: *Xen Newbie
>     *Sent: *29 October 2015 05:55
>     *To: *Xen Windows PV Drivers Development Mailing List
>     *Subject: *[win-pv-devel] Signed Windows PV Driver
>=20
>     __ __
>=20
>     __ __
>=20
>     I've asked the questions at the Xen users mailing list but nobody
>     has interest to offer me a help.  If the questions are too basic an=
d
>     should not be raised in this devel mailing list, please forgive me.=
____
>=20
>     __ __
>=20
>     I want to install a signed PV drivers in my HVM windows guest since=

>     I learnt from the web that a test signed driver may lead to
>     conflicts with some Windows applications.____
>=20
>     __ __
>=20
>     I studied a lot from the Xen project pages and Xen mailing list for=

>     users and pv driver development. I am confused since some of the
>     information seems to be out-dated. ____
>=20
>     __ __
>=20
>     I consolidated what I learnt so far and would like to seek for help=

>     to clarify the following conecpts before I make my next move:____
>=20
>     __ __
>=20
>     1) Those signed Windows drivers resided on univention seemed to be
>     already out-dated.____
>=20
>     2) Those PV drivers provided on
>     http://www.xenproject.org/developers/teams/windows-pv-drivers.html
>     requires my own compilation. The drivers compiled are test signed
>     and requires setting the Windows to test mode.____
>=20
>     3) The PV drivers provided by Citrix XenServer seems to work also
>     with Xen Hypervisor but I'm not sure whether there is any license
>     conflict.____
>=20
>     4) There are Microsoft signed PV drivers provided by Oracle VM but =
I
>     need to use Oracle VM as my Domain 0 in order to use them.____
>=20
>     __ __
>=20
>     Can anyone confirm my understanding as fore-mentioned?____
>=20
>     __ __
>=20
>     I want to make a PC as a HTPC/NAS combo with HTPC part played by a
>     Windows 7 (Windows 10 preferred if feasible) PV HVM guest.____
>=20
>     __ __
>=20
>     I'm now stuck at the planning stage of Windows PV drivers. I don't
>     want to compile anything and set the Windows to test mode.____
>=20
>     __ __
>=20
>     So can I just download the PV drivers from Citrix and installed to
>     the guest? Will it work with my Xen 4.5/4.6 Hypervisor with Ubuntu
>     15.04 Domain 0?____
>=20
>     __ __
>=20
>     I'll be very grateful if anyone can help me.____
>=20
>     __ __
>=20
>     Regards____
>=20
>     Lok____
>=20
>     __ __
>=20
>     __ __
>=20
>=20
>=20
>=20
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
>=20

--=20


=C3=89li=C3=A1s Tam=C3=A1s
Thomas Elias

ETIT[nwpro] KFT, =C3=9Cgyvezet=C5=91-H=C3=A1l=C3=B3zatbiztons=C3=A1gi spe=
cialista
ETIT[nwpro] Ltd, General Manager-Network security specialist

Tel. HU: +36/30-497-1626
Tel. DE: +49/160-651-8723
OpenPGP pubkey: http://etit.hu/doc/et-pub.asc

Okleveles m=C3=A9rn=C3=B6k-informatikus (MSC)
Master of Science in Information Technology (MSC)

Kapcsolat: http://etit.hu/index.php/hu/kapcsolat
Jogi nyilatkozat: http://etit.hu/disclaimer-email-hu.txt
Contact: http://etit.hu/index.php/en/contact
Disclaimer: http://etit.hu/disclaimer-email-en.txt


--Bhib6DBd35kafbgIf3MFdU8cwIlDvqXcK
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)

iQIcBAEBAgAGBQJWMpJgAAoJENWYes1C3s/CFkwQAI5mzxMv5Mc+wDwpghPVWv4g
jqWxO4RD7QenWWf79B0iqNAVONyKPg7mQK7oDfIZFmTfFG5Sx0I88PWdWSD5vH2T
79qgsx1Q6nL9vo9xtrbeQCzFtfQ2jXGQkhhaBmTWmky/GbihY1VIb1LZhF+uBTdR
oVueRxiQ0oKgfoyfpyuLeBiLmm1ctZTTNLdHylES235WXooicRfr5q5XCCT29IE5
Sox+PhLc80H/DN6QBZDT+0Q2LTwQDKp+gc5tYfeE4c5LCXOcPh/sc/DqoHfEfRAv
KMYzFuSCGTg0+7wDUzq5+VWg2Pma+Lgc8IfKWZr9GoouQpe4bnZ9UVfCmasZHoeI
kKjnUW5EtYB5BG4Er6m5WgjvtCC4/0g7boOqj8RtZWlGB41MwEQtFmIe3pDn+SSb
6XRfzjJibzc+WX2l90ALXnnI1GfFF+nuEAhjjcRnkYGHbHDjpXeVxfet90iUsrGH
XYMQTgKZvQIGVUhpfmG1h0cLNdjyNALKQwaAzzeT7io0PVmePqVeWauTVdHeXHj3
fOePojTyY5R50msv2oAWkVS47RMbWNW3QycAiv+Q4qRpU2k1LVBxTrhZAodJOL1G
Z/pszPII0mg/TPXy5oMJIHkEFXLcdu1jk4odQebXfciDxowO+VXXwzAxRv8hPA9x
SL1pk9aZMvQ3Acg6fBvi
=kRxL
-----END PGP SIGNATURE-----

--Bhib6DBd35kafbgIf3MFdU8cwIlDvqXcK--


--===============6837119790279854385==
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
--===============6837119790279854385==--


From win-pv-devel-bounces@lists.xenproject.org Fri Oct 30 09:54:19 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 09:54:19 +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 1Zs6O3-0004LR-7E; Fri, 30 Oct 2015 09:54:19 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=738f7cb72=Paul.Durrant@citrix.com>)
	id 1Zs6O2-0004KF-AM
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 09:54:18 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	02/94-10678-34E33365; Fri, 30 Oct 2015 09:54:11 +0000
X-Env-Sender: prvs=738f7cb72=Paul.Durrant@citrix.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1446198850!12225705!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 17362 invoked from network); 30 Oct 2015 09:54:10 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-3.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2015 09:54:10 -0000
X-IronPort-AV: E=Sophos;i="5.20,217,1444694400"; 
   d="scan'208";a="6547943"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?utf-8?B?w4lsacOhcyBUYW3DoXM=?= <et@etit.hu>
Thread-Topic: [win-pv-devel] [Xen-users] Removing old glpv windows drivers
	to install new -> inaccessible boot device
Thread-Index: AQHREi2hjyog60o340+Ks5/BzOr7hZ6C7wOAgADd5wA=
Date: Fri, 30 Oct 2015 09:54:08 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F63DAEF@AMSPEX01CL01.citrite.net>
References: <562F93F5.9070505@etit.hu>
	<CABoYbGryR=rupt2DUROLeaCoYJqxVBC0VMpSiM1bjH4H2p-KZg@mail.gmail.com>
	<56308C66.1030806@etit.hu>
	<CAFLBxZZSO_re+Wt4_b1pnmgS33hXJS_SRhnvse9QW-NRpSTQ1A@mail.gmail.com>
	<563291B1.9080800@etit.hu>
In-Reply-To: <563291B1.9080800@etit.hu>
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
Cc: "xen-users@lists.xen.org" <xen-users@lists.xen.org>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] [Xen-users] Removing old glpv windows drivers to
 install new -> inaccessible boot device
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
aXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIMOJbGnDoXMgVGFtw6FzDQo+IFNlbnQ6
IDI5IE9jdG9iZXIgMjAxNSAyMTozOA0KPiBDYzogeGVuLXVzZXJzQGxpc3RzLnhlbi5vcmc7IHdp
bi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZw0KPiBTdWJqZWN0OiBSZTogW3dpbi1wdi1k
ZXZlbF0gW1hlbi11c2Vyc10gUmVtb3Zpbmcgb2xkIGdscHYgd2luZG93cyBkcml2ZXJzDQo+IHRv
IGluc3RhbGwgbmV3IC0+IGluYWNjZXNzaWJsZSBib290IGRldmljZQ0KPiANCj4gSGkgYWxsLiBU
aGFuayB5b3UgZm9yIHRoZSB0aXBzLg0KPiANCj4gSGVyZSBpcyB3aGF0IG5lZWRlZCB0byBiZSBk
b25lLg0KPiANCj4gLSBCb290IGluIHNhZmUgbW9kZS4NCj4gLSB1c2UgdW5pbnN0YWxsLmJhdCB0
byByZW1vdmUgb2xkIGRyaXZlcnMuDQo+IC0gdXNlIGNjbGVhbmVyIG9yIHNpbWlsYXIgYXBwbGlj
YXRpb24gdG8gcmVtb3ZlIG9sZCBkcml2ZXIgaW5zdGFsbCBlbnRyaWVzLg0KPiAtIHNjYW4gdGhy
b3VnaCB0aGUgZmlsZSBzeXN0ZW0gZW5kIGRlbGV0ZSB4ZW4qDQo+IC0gYmNkZWRpdCAtc2V0IFRF
U1RTSUdOSU5HIE9ODQo+IC0gaW5zdGFsbCBwZnggZmlsZXMgdG8gbG9jYWwgY29tcHV0ZXIgY2Vy
dCBzdG9yZS4NCj4gLSByZWJvb3QgaW50byBzYWZlIG1vZGUNCj4gLSBpbnN0YWxsIG5ldyBkcml2
ZXJzICh4ZW5idXMsIHhlbnZpZiwgZXRjKSB1c2luZyBkcGluc3QuZXhlIChhZG1pbiBtb2RlKQ0K
PiAtIHJlYm9vdCB0byBub3JtYWwgbW9kZSAodGhlcmUgd2lsbCBiZSBubyBuZXR3b3JrLCBubyB4
ZW4gZGV2aWNlcyBjYW4gYmUNCj4gc2VlbiwgZXRjIGZvciBzb21lIHJlYXNvbikNCj4gLSBnbyB0
byBoYXJkd2FyZSwgY2hlY2sgdW5rbm93biBQQ0kgZGV2aWNlIGFuZCBtYW51YWxseSBpbnN0YWxs
IHhlbmJ1cw0KPiBmb3IgdGhhdC4NCj4gLSBhZnRlciB0aGlzLCBhbGwgb3RoZXIgZHJpdmVycyBh
cHBlYXIgc3VkZGVubHkuDQo+IC0gcmVib290LCBkb25lLg0KPiANCj4gSXQgd291bGQgYmUgbmlj
ZSB0byByZW1vdmUgdGhlIHRlc3RzaWduaW5nIHRob3VnaCwgYnV0IGF0IGxlc3QgaXQgaXMNCj4g
d29ya2luZyBub3cuDQoNClRvIGdldCByaWQgb2YgdGhlIG5lZWQgZm9yIHRlc3RzaWduaW5nIGl0
J3MgbmVjZXNzYXJ5IGZvciBkcml2ZXJzIHRvIGJlICdyZWFsZWFzZSBzaWduZWQnIGFuZCBpbiB0
aGUgY2FzZSBvZiBXaW5kb3dzIDEwIHRoaXMgbWVhbnMgdGhhdCB0aGV5IGhhdmUgdG8gYmUgc2ln
bmVkIGRpcmVjdGx5IGJ5IE1pY3Jvc29mdC4gVG8gYWNoaWV2ZSBhbGwgdGhpcyBjZXJ0aWZpY2F0
ZXMgbXVzdCBiZSBwdXJjaGFzZWQgYW5kIGZlZXMgbXVzdCBiZSBwYWlkIHRvIE1pY3Jvc29mdCBz
byBidWRnZXQgaXMgcmVxdWlyZWQgZnJvbSBzb21ld2hlcmUuDQoNCiAgUGF1bA0KDQo+IA0KPiAy
MDE1LTEwLTI5IDEwOjM4IGtlbHRlesOpc3NlbCwgR2VvcmdlIER1bmxhcCDDrXJ0YToNCj4gPiBP
biBXZWQsIE9jdCAyOCwgMjAxNSBhdCA4OjUwIEFNLCDDiWxpw6FzIFRhbcOhcyA8ZXRAZXRpdC5o
dT4gd3JvdGU6DQo+ID4+IEhpLiBZZXMsIEkgY29uZmlybSwgdGhhdCBib290aW5nIGludG8gc2Fm
ZSBtb2RlIGlzIHBvc3NpYmxlLiBJIHR1cm5lZCBvbg0KPiA+PiB0ZXN0c2lnbmluZyB3aXRoIGJj
ZGVkaXQsIGFuZCB0cmllZCBpbnN0YWxsaW5nIHRoZSBkcml2ZXJzIGFnYWluLg0KPiA+Pg0KPiA+
PiBUaGUgaXNudGFsbCB3ZW50IGZpbmUsIEkgY291bGQgcmVib290LiBVbmZvcnR1bmF0ZWx5IHNp
bmNlIHRoZW4gKGl0IGlzDQo+ID4+IG1vcmUgdGhlbiA4IGhvdXJzIG5vdykgSSdtIGZhY2luZyB0
aGUgYXR0YWNoZWQgc2NyZWVuLiBUaGUgYW5pbWF0aW9uIGlzDQo+ID4+IGp1c3Qgcm9sbGluZywg
cm9sbGluZyByb2xsaW5nIGFuZCBub3RoaW5nIGhhcHBlbnMuIENQVSB0aWNrcyBhcmUgdXNlZCwN
Cj4gPj4gc28gSSBhc3N1bWUgc29tZXRoaW5nIGlzIGhhcHBlbmluZywgYnV0IGl0IHNlZW1lcyBw
cmV0dHkgbXVjaCBzdHVjay4NCj4gPj4NCj4gPj4gQW55IGlkZWFzPw0KPiA+DQo+ID4gSSAqdGhp
bmsqIHRoZSBYZW5TZXJ2ZXIgUFYgZHJpdmVycyBhcmUgdXNpbmcgbWluaXBvcnQ7IGluIHdoaWNo
IGNhc2UNCj4gPiB0aGlzIEtCIGFydGljbGUgbWlnaHQgYmUgb2YgdXNlOg0KPiA+DQo+ID4gaHR0
cHM6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vZW4tdXMva2IvMjc5NTM5Nw0KPiA+DQo+ID4gUGF1
bCBEdXJyYW50IGNhbiBjb3JyZWN0IG1lIGlmIEknbSB3cm9uZyBhYm91dCBtaW5pcG9ydCAoYW5k
IG1heSBiZQ0KPiA+IGFibGUgdG8gcG9pbnQgeW91IHRvIGEgbW9yZSB1c2VmdWwgZml4IGlmIHNv
KS4NCj4gPg0KPiA+ICAtR2VvcmdlDQo+ID4NCj4gDQo+IC0tDQo+IA0KPiANCj4gw4lsacOhcyBU
YW3DoXMNCj4gVGhvbWFzIEVsaWFzDQo+IA0KPiBFVElUW253cHJvXSBLRlQsIMOcZ3l2ZXpldMWR
LUjDoWzDs3phdGJpenRvbnPDoWdpIHNwZWNpYWxpc3RhDQo+IEVUSVRbbndwcm9dIEx0ZCwgR2Vu
ZXJhbCBNYW5hZ2VyLU5ldHdvcmsgc2VjdXJpdHkgc3BlY2lhbGlzdA0KPiANCj4gVGVsLiBIVTog
KzM2LzMwLTQ5Ny0xNjI2DQo+IFRlbC4gREU6ICs0OS8xNjAtNjUxLTg3MjMNCj4gT3BlblBHUCBw
dWJrZXk6IGh0dHA6Ly9ldGl0Lmh1L2RvYy9ldC1wdWIuYXNjDQo+IA0KPiBPa2xldmVsZXMgbcOp
cm7DtmstaW5mb3JtYXRpa3VzIChNU0MpDQo+IE1hc3RlciBvZiBTY2llbmNlIGluIEluZm9ybWF0
aW9uIFRlY2hub2xvZ3kgKE1TQykNCj4gDQo+IEthcGNzb2xhdDogaHR0cDovL2V0aXQuaHUvaW5k
ZXgucGhwL2h1L2thcGNzb2xhdA0KPiBKb2dpIG55aWxhdGtvemF0OiBodHRwOi8vZXRpdC5odS9k
aXNjbGFpbWVyLWVtYWlsLWh1LnR4dA0KPiBDb250YWN0OiBodHRwOi8vZXRpdC5odS9pbmRleC5w
aHAvZW4vY29udGFjdA0KPiBEaXNjbGFpbWVyOiBodHRwOi8vZXRpdC5odS9kaXNjbGFpbWVyLWVt
YWlsLWVuLnR4dA0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fXwp3aW4tcHYtZGV2ZWwgbWFpbGluZyBsaXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9q
ZWN0Lm9yZwpodHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3Rp
bmZvL3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Fri Oct 30 09:54:19 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 09:54:19 +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 1Zs6O3-0004LR-7E; Fri, 30 Oct 2015 09:54:19 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=738f7cb72=Paul.Durrant@citrix.com>)
	id 1Zs6O2-0004KF-AM
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 09:54:18 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	02/94-10678-34E33365; Fri, 30 Oct 2015 09:54:11 +0000
X-Env-Sender: prvs=738f7cb72=Paul.Durrant@citrix.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1446198850!12225705!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 17362 invoked from network); 30 Oct 2015 09:54:10 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-3.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2015 09:54:10 -0000
X-IronPort-AV: E=Sophos;i="5.20,217,1444694400"; 
   d="scan'208";a="6547943"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?utf-8?B?w4lsacOhcyBUYW3DoXM=?= <et@etit.hu>
Thread-Topic: [win-pv-devel] [Xen-users] Removing old glpv windows drivers
	to install new -> inaccessible boot device
Thread-Index: AQHREi2hjyog60o340+Ks5/BzOr7hZ6C7wOAgADd5wA=
Date: Fri, 30 Oct 2015 09:54:08 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F63DAEF@AMSPEX01CL01.citrite.net>
References: <562F93F5.9070505@etit.hu>
	<CABoYbGryR=rupt2DUROLeaCoYJqxVBC0VMpSiM1bjH4H2p-KZg@mail.gmail.com>
	<56308C66.1030806@etit.hu>
	<CAFLBxZZSO_re+Wt4_b1pnmgS33hXJS_SRhnvse9QW-NRpSTQ1A@mail.gmail.com>
	<563291B1.9080800@etit.hu>
In-Reply-To: <563291B1.9080800@etit.hu>
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
Cc: "xen-users@lists.xen.org" <xen-users@lists.xen.org>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] [Xen-users] Removing old glpv windows drivers to
 install new -> inaccessible boot device
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
aXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIMOJbGnDoXMgVGFtw6FzDQo+IFNlbnQ6
IDI5IE9jdG9iZXIgMjAxNSAyMTozOA0KPiBDYzogeGVuLXVzZXJzQGxpc3RzLnhlbi5vcmc7IHdp
bi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZw0KPiBTdWJqZWN0OiBSZTogW3dpbi1wdi1k
ZXZlbF0gW1hlbi11c2Vyc10gUmVtb3Zpbmcgb2xkIGdscHYgd2luZG93cyBkcml2ZXJzDQo+IHRv
IGluc3RhbGwgbmV3IC0+IGluYWNjZXNzaWJsZSBib290IGRldmljZQ0KPiANCj4gSGkgYWxsLiBU
aGFuayB5b3UgZm9yIHRoZSB0aXBzLg0KPiANCj4gSGVyZSBpcyB3aGF0IG5lZWRlZCB0byBiZSBk
b25lLg0KPiANCj4gLSBCb290IGluIHNhZmUgbW9kZS4NCj4gLSB1c2UgdW5pbnN0YWxsLmJhdCB0
byByZW1vdmUgb2xkIGRyaXZlcnMuDQo+IC0gdXNlIGNjbGVhbmVyIG9yIHNpbWlsYXIgYXBwbGlj
YXRpb24gdG8gcmVtb3ZlIG9sZCBkcml2ZXIgaW5zdGFsbCBlbnRyaWVzLg0KPiAtIHNjYW4gdGhy
b3VnaCB0aGUgZmlsZSBzeXN0ZW0gZW5kIGRlbGV0ZSB4ZW4qDQo+IC0gYmNkZWRpdCAtc2V0IFRF
U1RTSUdOSU5HIE9ODQo+IC0gaW5zdGFsbCBwZnggZmlsZXMgdG8gbG9jYWwgY29tcHV0ZXIgY2Vy
dCBzdG9yZS4NCj4gLSByZWJvb3QgaW50byBzYWZlIG1vZGUNCj4gLSBpbnN0YWxsIG5ldyBkcml2
ZXJzICh4ZW5idXMsIHhlbnZpZiwgZXRjKSB1c2luZyBkcGluc3QuZXhlIChhZG1pbiBtb2RlKQ0K
PiAtIHJlYm9vdCB0byBub3JtYWwgbW9kZSAodGhlcmUgd2lsbCBiZSBubyBuZXR3b3JrLCBubyB4
ZW4gZGV2aWNlcyBjYW4gYmUNCj4gc2VlbiwgZXRjIGZvciBzb21lIHJlYXNvbikNCj4gLSBnbyB0
byBoYXJkd2FyZSwgY2hlY2sgdW5rbm93biBQQ0kgZGV2aWNlIGFuZCBtYW51YWxseSBpbnN0YWxs
IHhlbmJ1cw0KPiBmb3IgdGhhdC4NCj4gLSBhZnRlciB0aGlzLCBhbGwgb3RoZXIgZHJpdmVycyBh
cHBlYXIgc3VkZGVubHkuDQo+IC0gcmVib290LCBkb25lLg0KPiANCj4gSXQgd291bGQgYmUgbmlj
ZSB0byByZW1vdmUgdGhlIHRlc3RzaWduaW5nIHRob3VnaCwgYnV0IGF0IGxlc3QgaXQgaXMNCj4g
d29ya2luZyBub3cuDQoNClRvIGdldCByaWQgb2YgdGhlIG5lZWQgZm9yIHRlc3RzaWduaW5nIGl0
J3MgbmVjZXNzYXJ5IGZvciBkcml2ZXJzIHRvIGJlICdyZWFsZWFzZSBzaWduZWQnIGFuZCBpbiB0
aGUgY2FzZSBvZiBXaW5kb3dzIDEwIHRoaXMgbWVhbnMgdGhhdCB0aGV5IGhhdmUgdG8gYmUgc2ln
bmVkIGRpcmVjdGx5IGJ5IE1pY3Jvc29mdC4gVG8gYWNoaWV2ZSBhbGwgdGhpcyBjZXJ0aWZpY2F0
ZXMgbXVzdCBiZSBwdXJjaGFzZWQgYW5kIGZlZXMgbXVzdCBiZSBwYWlkIHRvIE1pY3Jvc29mdCBz
byBidWRnZXQgaXMgcmVxdWlyZWQgZnJvbSBzb21ld2hlcmUuDQoNCiAgUGF1bA0KDQo+IA0KPiAy
MDE1LTEwLTI5IDEwOjM4IGtlbHRlesOpc3NlbCwgR2VvcmdlIER1bmxhcCDDrXJ0YToNCj4gPiBP
biBXZWQsIE9jdCAyOCwgMjAxNSBhdCA4OjUwIEFNLCDDiWxpw6FzIFRhbcOhcyA8ZXRAZXRpdC5o
dT4gd3JvdGU6DQo+ID4+IEhpLiBZZXMsIEkgY29uZmlybSwgdGhhdCBib290aW5nIGludG8gc2Fm
ZSBtb2RlIGlzIHBvc3NpYmxlLiBJIHR1cm5lZCBvbg0KPiA+PiB0ZXN0c2lnbmluZyB3aXRoIGJj
ZGVkaXQsIGFuZCB0cmllZCBpbnN0YWxsaW5nIHRoZSBkcml2ZXJzIGFnYWluLg0KPiA+Pg0KPiA+
PiBUaGUgaXNudGFsbCB3ZW50IGZpbmUsIEkgY291bGQgcmVib290LiBVbmZvcnR1bmF0ZWx5IHNp
bmNlIHRoZW4gKGl0IGlzDQo+ID4+IG1vcmUgdGhlbiA4IGhvdXJzIG5vdykgSSdtIGZhY2luZyB0
aGUgYXR0YWNoZWQgc2NyZWVuLiBUaGUgYW5pbWF0aW9uIGlzDQo+ID4+IGp1c3Qgcm9sbGluZywg
cm9sbGluZyByb2xsaW5nIGFuZCBub3RoaW5nIGhhcHBlbnMuIENQVSB0aWNrcyBhcmUgdXNlZCwN
Cj4gPj4gc28gSSBhc3N1bWUgc29tZXRoaW5nIGlzIGhhcHBlbmluZywgYnV0IGl0IHNlZW1lcyBw
cmV0dHkgbXVjaCBzdHVjay4NCj4gPj4NCj4gPj4gQW55IGlkZWFzPw0KPiA+DQo+ID4gSSAqdGhp
bmsqIHRoZSBYZW5TZXJ2ZXIgUFYgZHJpdmVycyBhcmUgdXNpbmcgbWluaXBvcnQ7IGluIHdoaWNo
IGNhc2UNCj4gPiB0aGlzIEtCIGFydGljbGUgbWlnaHQgYmUgb2YgdXNlOg0KPiA+DQo+ID4gaHR0
cHM6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vZW4tdXMva2IvMjc5NTM5Nw0KPiA+DQo+ID4gUGF1
bCBEdXJyYW50IGNhbiBjb3JyZWN0IG1lIGlmIEknbSB3cm9uZyBhYm91dCBtaW5pcG9ydCAoYW5k
IG1heSBiZQ0KPiA+IGFibGUgdG8gcG9pbnQgeW91IHRvIGEgbW9yZSB1c2VmdWwgZml4IGlmIHNv
KS4NCj4gPg0KPiA+ICAtR2VvcmdlDQo+ID4NCj4gDQo+IC0tDQo+IA0KPiANCj4gw4lsacOhcyBU
YW3DoXMNCj4gVGhvbWFzIEVsaWFzDQo+IA0KPiBFVElUW253cHJvXSBLRlQsIMOcZ3l2ZXpldMWR
LUjDoWzDs3phdGJpenRvbnPDoWdpIHNwZWNpYWxpc3RhDQo+IEVUSVRbbndwcm9dIEx0ZCwgR2Vu
ZXJhbCBNYW5hZ2VyLU5ldHdvcmsgc2VjdXJpdHkgc3BlY2lhbGlzdA0KPiANCj4gVGVsLiBIVTog
KzM2LzMwLTQ5Ny0xNjI2DQo+IFRlbC4gREU6ICs0OS8xNjAtNjUxLTg3MjMNCj4gT3BlblBHUCBw
dWJrZXk6IGh0dHA6Ly9ldGl0Lmh1L2RvYy9ldC1wdWIuYXNjDQo+IA0KPiBPa2xldmVsZXMgbcOp
cm7DtmstaW5mb3JtYXRpa3VzIChNU0MpDQo+IE1hc3RlciBvZiBTY2llbmNlIGluIEluZm9ybWF0
aW9uIFRlY2hub2xvZ3kgKE1TQykNCj4gDQo+IEthcGNzb2xhdDogaHR0cDovL2V0aXQuaHUvaW5k
ZXgucGhwL2h1L2thcGNzb2xhdA0KPiBKb2dpIG55aWxhdGtvemF0OiBodHRwOi8vZXRpdC5odS9k
aXNjbGFpbWVyLWVtYWlsLWh1LnR4dA0KPiBDb250YWN0OiBodHRwOi8vZXRpdC5odS9pbmRleC5w
aHAvZW4vY29udGFjdA0KPiBEaXNjbGFpbWVyOiBodHRwOi8vZXRpdC5odS9kaXNjbGFpbWVyLWVt
YWlsLWVuLnR4dA0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fXwp3aW4tcHYtZGV2ZWwgbWFpbGluZyBsaXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9q
ZWN0Lm9yZwpodHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3Rp
bmZvL3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Fri Oct 30 10:47:42 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 10:47: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 1Zs7Dh-00060S-Ig; Fri, 30 Oct 2015 10:47:41 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=738f7cb72=Paul.Durrant@citrix.com>)
	id 1Zs7Dg-00060N-EB
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 10:47:40 +0000
Received: from [193.109.254.147] by server-7.bemta-14.messagelabs.com id
	20/D2-28221-BCA43365; Fri, 30 Oct 2015 10:47:39 +0000
X-Env-Sender: prvs=738f7cb72=Paul.Durrant@citrix.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1446201955!29986383!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22307 invoked from network); 30 Oct 2015 10:45:55 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2015 10:45:55 -0000
X-IronPort-AV: E=Sophos;i="5.20,217,1444694400"; 
   d="scan'208";a="6551518"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH] Fix missing imports for NTDDI < WIN7
Thread-Index: AQHREOCyDVulNx35dkadWGk3ae3dA56D3k/w
Date: Fri, 30 Oct 2015 10:45:30 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F640487@AMSPEX01CL01.citrite.net>
References: <1445968482-28864-1-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1445968482-28864-1-git-send-email-owen.smith@citrix.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
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH] Fix missing imports for NTDDI < WIN7
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 Owen Smith
> Sent: 27 October 2015 17:55
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH] Fix missing imports for NTDDI < WIN7
> 
> Some APIs are used that are not available before Win7.
> Use preprocessor to substitute equivilent calls when NTDDI_VERSION
> is less than NTDDI_WIN7
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

I think there's less icky macro magic for this. XENBUS uses the new APIs all over the place and there's no problem with pre-Win7 OS.

  Paul

> ---
>  src/xeniface/fdo.c          | 13 +++++++++++++
>  src/xeniface/ioctl_evtchn.c |  9 +++++++--
>  2 files changed, 20 insertions(+), 2 deletions(-)
> 
> diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
> index 71ffbe2..d6b006e 100644
> --- a/src/xeniface/fdo.c
> +++ b/src/xeniface/fdo.c
> @@ -2385,7 +2385,11 @@ FdoCreate(
>      if (!NT_SUCCESS(status))
>          goto fail14;
> 
> +#if (NTDDI_VERSION >= NTDDI_WIN7)
>      ProcessorCount =
> KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
> +#else // NTDDI_VISTA / NTDDI_VISTASP1 / NTDDI_WS08
> +    ProcessorCount = KeQueryMaximumProcessorCount();
> +#endif
> 
>      status = STATUS_NO_MEMORY;
>      Fdo->EvtchnDpc = __FdoAllocate(sizeof (KDPC) * ProcessorCount);
> @@ -2393,6 +2397,7 @@ FdoCreate(
>          goto fail15;
> 
>      for (Index = 0; Index < ProcessorCount; Index++) {
> +#if (NTDDI_VERSION >= NTDDI_WIN7)
>          PROCESSOR_NUMBER ProcNumber;
> 
>          status = KeGetProcessorNumberFromIndex(Index, &ProcNumber);
> @@ -2401,6 +2406,10 @@ FdoCreate(
>          KeInitializeDpc(&Fdo->EvtchnDpc[Index], EvtchnNotificationDpc, NULL);
>          status = KeSetTargetProcessorDpcEx(&Fdo->EvtchnDpc[Index],
> &ProcNumber);
>          ASSERT(NT_SUCCESS(status));
> +#else // NTDDI_VISTA / NTDDI_VISTASP1 / NTDDI_WS08
> +        KeInitializeDpc(&Fdo->EvtchnDpc[Index], EvtchnNotificationDpc,
> NULL);
> +        KeSetTargetProcessorDpc(&Fdo->EvtchnDpc[Index], (CCHAR)Index);
> +#endif
>      }
> 
>      Info("%p (%s)\n",
> @@ -2525,7 +2534,11 @@ FdoDestroy(
> 
>      Dx->Fdo = NULL;
> 
> +#if (NTDDI_VERSION >= NTDDI_WIN7)
>      ProcessorCount =
> KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
> +#else // NTDDI_VISTA / NTDDI_VISTASP1 / NTDDI_WS08
> +    ProcessorCount = KeQueryMaximumProcessorCount();
> +#endif
>      RtlZeroMemory(Fdo->EvtchnDpc, sizeof (KDPC) * ProcessorCount);
>      __FdoFree(Fdo->EvtchnDpc);
> 
> diff --git a/src/xeniface/ioctl_evtchn.c b/src/xeniface/ioctl_evtchn.c
> index 93f1931..1501157 100644
> --- a/src/xeniface/ioctl_evtchn.c
> +++ b/src/xeniface/ioctl_evtchn.c
> @@ -51,7 +51,7 @@ EvtchnNotificationDpc(
>      UNREFERENCED_PARAMETER(_Context);
>      UNREFERENCED_PARAMETER(Argument2);
> 
> -    ASSERT(Context);
> +    ASSERT(Context != NULL);
> 
>  #if DBG
>      XenIfaceDebugPrint(INFO, "Channel %p, LocalPort %d, Cpu %lu\n",
> @@ -80,10 +80,15 @@ EvtchnInterruptHandler(
>      ULONG ProcIndex;
> 
>      UNREFERENCED_PARAMETER(Interrupt);
> -    ASSERT(Context);
> +    ASSERT(Context != NULL);
> 
> +#if (NTDD_VERSION >= NTDDI_WIN7)
>      KeGetCurrentProcessorNumberEx(&ProcNumber);
>      ProcIndex = KeGetProcessorIndexFromNumber(&ProcNumber);
> +#else // NTDDI_VISTA / NTDDI_VISTASP1 / NTDDI_WS08
> +    UNREFERENCED_PARAMETER(ProcNumber); // keep compiler happy
> +    ProcIndex = KeGetCurrentProcessorNumber();
> +#endif
>      if (!KeInsertQueueDpc(&Context->Fdo->EvtchnDpc[ProcIndex], Context,
> NULL)) {
>          XenIfaceDebugPrint(TRACE, "NOT INSERTED: Context %p, Port %lu, FO
> %p, Cpu %lu\n",
>                             Context, Context->LocalPort, Context->FileObject, ProcIndex);
> --
> 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

_______________________________________________
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 Oct 30 10:47:42 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 10:47: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 1Zs7Dh-00060S-Ig; Fri, 30 Oct 2015 10:47:41 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=738f7cb72=Paul.Durrant@citrix.com>)
	id 1Zs7Dg-00060N-EB
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 10:47:40 +0000
Received: from [193.109.254.147] by server-7.bemta-14.messagelabs.com id
	20/D2-28221-BCA43365; Fri, 30 Oct 2015 10:47:39 +0000
X-Env-Sender: prvs=738f7cb72=Paul.Durrant@citrix.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1446201955!29986383!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22307 invoked from network); 30 Oct 2015 10:45:55 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2015 10:45:55 -0000
X-IronPort-AV: E=Sophos;i="5.20,217,1444694400"; 
   d="scan'208";a="6551518"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH] Fix missing imports for NTDDI < WIN7
Thread-Index: AQHREOCyDVulNx35dkadWGk3ae3dA56D3k/w
Date: Fri, 30 Oct 2015 10:45:30 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F640487@AMSPEX01CL01.citrite.net>
References: <1445968482-28864-1-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1445968482-28864-1-git-send-email-owen.smith@citrix.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
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH] Fix missing imports for NTDDI < WIN7
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 Owen Smith
> Sent: 27 October 2015 17:55
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH] Fix missing imports for NTDDI < WIN7
> 
> Some APIs are used that are not available before Win7.
> Use preprocessor to substitute equivilent calls when NTDDI_VERSION
> is less than NTDDI_WIN7
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

I think there's less icky macro magic for this. XENBUS uses the new APIs all over the place and there's no problem with pre-Win7 OS.

  Paul

> ---
>  src/xeniface/fdo.c          | 13 +++++++++++++
>  src/xeniface/ioctl_evtchn.c |  9 +++++++--
>  2 files changed, 20 insertions(+), 2 deletions(-)
> 
> diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
> index 71ffbe2..d6b006e 100644
> --- a/src/xeniface/fdo.c
> +++ b/src/xeniface/fdo.c
> @@ -2385,7 +2385,11 @@ FdoCreate(
>      if (!NT_SUCCESS(status))
>          goto fail14;
> 
> +#if (NTDDI_VERSION >= NTDDI_WIN7)
>      ProcessorCount =
> KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
> +#else // NTDDI_VISTA / NTDDI_VISTASP1 / NTDDI_WS08
> +    ProcessorCount = KeQueryMaximumProcessorCount();
> +#endif
> 
>      status = STATUS_NO_MEMORY;
>      Fdo->EvtchnDpc = __FdoAllocate(sizeof (KDPC) * ProcessorCount);
> @@ -2393,6 +2397,7 @@ FdoCreate(
>          goto fail15;
> 
>      for (Index = 0; Index < ProcessorCount; Index++) {
> +#if (NTDDI_VERSION >= NTDDI_WIN7)
>          PROCESSOR_NUMBER ProcNumber;
> 
>          status = KeGetProcessorNumberFromIndex(Index, &ProcNumber);
> @@ -2401,6 +2406,10 @@ FdoCreate(
>          KeInitializeDpc(&Fdo->EvtchnDpc[Index], EvtchnNotificationDpc, NULL);
>          status = KeSetTargetProcessorDpcEx(&Fdo->EvtchnDpc[Index],
> &ProcNumber);
>          ASSERT(NT_SUCCESS(status));
> +#else // NTDDI_VISTA / NTDDI_VISTASP1 / NTDDI_WS08
> +        KeInitializeDpc(&Fdo->EvtchnDpc[Index], EvtchnNotificationDpc,
> NULL);
> +        KeSetTargetProcessorDpc(&Fdo->EvtchnDpc[Index], (CCHAR)Index);
> +#endif
>      }
> 
>      Info("%p (%s)\n",
> @@ -2525,7 +2534,11 @@ FdoDestroy(
> 
>      Dx->Fdo = NULL;
> 
> +#if (NTDDI_VERSION >= NTDDI_WIN7)
>      ProcessorCount =
> KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
> +#else // NTDDI_VISTA / NTDDI_VISTASP1 / NTDDI_WS08
> +    ProcessorCount = KeQueryMaximumProcessorCount();
> +#endif
>      RtlZeroMemory(Fdo->EvtchnDpc, sizeof (KDPC) * ProcessorCount);
>      __FdoFree(Fdo->EvtchnDpc);
> 
> diff --git a/src/xeniface/ioctl_evtchn.c b/src/xeniface/ioctl_evtchn.c
> index 93f1931..1501157 100644
> --- a/src/xeniface/ioctl_evtchn.c
> +++ b/src/xeniface/ioctl_evtchn.c
> @@ -51,7 +51,7 @@ EvtchnNotificationDpc(
>      UNREFERENCED_PARAMETER(_Context);
>      UNREFERENCED_PARAMETER(Argument2);
> 
> -    ASSERT(Context);
> +    ASSERT(Context != NULL);
> 
>  #if DBG
>      XenIfaceDebugPrint(INFO, "Channel %p, LocalPort %d, Cpu %lu\n",
> @@ -80,10 +80,15 @@ EvtchnInterruptHandler(
>      ULONG ProcIndex;
> 
>      UNREFERENCED_PARAMETER(Interrupt);
> -    ASSERT(Context);
> +    ASSERT(Context != NULL);
> 
> +#if (NTDD_VERSION >= NTDDI_WIN7)
>      KeGetCurrentProcessorNumberEx(&ProcNumber);
>      ProcIndex = KeGetProcessorIndexFromNumber(&ProcNumber);
> +#else // NTDDI_VISTA / NTDDI_VISTASP1 / NTDDI_WS08
> +    UNREFERENCED_PARAMETER(ProcNumber); // keep compiler happy
> +    ProcIndex = KeGetCurrentProcessorNumber();
> +#endif
>      if (!KeInsertQueueDpc(&Context->Fdo->EvtchnDpc[ProcIndex], Context,
> NULL)) {
>          XenIfaceDebugPrint(TRACE, "NOT INSERTED: Context %p, Port %lu, FO
> %p, Cpu %lu\n",
>                             Context, Context->LocalPort, Context->FileObject, ProcIndex);
> --
> 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

_______________________________________________
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 Oct 30 13:35:59 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 13:35: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 1Zs9qY-0008Bp-0k; Fri, 30 Oct 2015 13:35:58 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=738f7cb72=Paul.Durrant@citrix.com>)
	id 1Zs9qX-0008Bk-4Q
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 13:35:57 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	55/D9-30270-C3273365; Fri, 30 Oct 2015 13:35:56 +0000
X-Env-Sender: prvs=738f7cb72=Paul.Durrant@citrix.com
X-Msg-Ref: server-11.tower-206.messagelabs.com!1446212155!42320010!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24208 invoked from network); 30 Oct 2015 13:35:55 -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;
	30 Oct 2015 13:35:55 -0000
X-IronPort-AV: E=Sophos;i="5.20,218,1444694400"; 
   d="scan'208";a="6563935"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 1/8] SRB_FUNCTION_RESET_DEVICE should
	succeed... otherwise the entire controller is reset.
Thread-Index: AQHREKjxmdMl6YxfNEW7hb/ur4U7Q56EDobQ
Date: Fri, 30 Oct 2015 13:35:54 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F641121@AMSPEX01CL01.citrite.net>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
	<1445944546-21500-2-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1445944546-21500-2-git-send-email-owen.smith@citrix.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
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 1/8] SRB_FUNCTION_RESET_DEVICE
	should	succeed... otherwise the entire controller is reset.
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 Owen Smith
> Sent: 27 October 2015 11:16
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 1/8] SRB_FUNCTION_RESET_DEVICE should
> succeed... otherwise the entire controller is reset.
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xenvbd/fdo.c |  2 ++
>  src/xenvbd/pdo.c | 25 ++++++++++++++++++++-----
>  2 files changed, 22 insertions(+), 5 deletions(-)
> 
> diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
> index f6b47f2..82b7fb6 100644
> --- a/src/xenvbd/fdo.c
> +++ b/src/xenvbd/fdo.c
> @@ -1449,6 +1449,7 @@ FdoResetBus(
>  {
>      ULONG           TargetId;
> 
> +    Verbose("====>\n");
>      for (TargetId = 0; TargetId < XENVBD_MAX_TARGETS; ++TargetId) {
>          PXENVBD_PDO Pdo = __FdoGetPdo(Fdo, TargetId);
>          if (Pdo) {
> @@ -1456,6 +1457,7 @@ FdoResetBus(
>              PdoDereference(Pdo);
>          }
>      }
> +    Verbose("<====\n");
> 
>      return TRUE;
>  }
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index 198c4d3..de8ba02 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -2242,7 +2242,7 @@ __PdoExecuteScsi(
>      return TRUE;
>  }
> 
> -static FORCEINLINE VOID
> +static FORCEINLINE BOOLEAN
>  __PdoQueueShutdown(
>      __in PXENVBD_PDO             Pdo,
>      __in PSCSI_REQUEST_BLOCK     Srb
> @@ -2253,6 +2253,23 @@ __PdoQueueShutdown(
> 
>      QueueAppend(&Pdo->ShutdownSrbs, &SrbExt->Entry);
>      NotifierKick(Notifier);
> +
> +    return FALSE;
> +}
> +
> +static FORCEINLINE BOOLEAN
> +__PdoReset(
> +    __in PXENVBD_PDO             Pdo,
> +    __in PSCSI_REQUEST_BLOCK     Srb
> +    )
> +{
> +    Verbose("Target[%u] ====>\n", PdoGetTargetId(Pdo));
> +
> +    PdoReset(Pdo);
> +    Srb->SrbStatus = SRB_STATUS_SUCCESS;
> +
> +    Verbose("Target[%u] <====\n", PdoGetTargetId(Pdo));
> +    return TRUE;
>  }
> 
>  static FORCEINLINE VOID
> @@ -2378,13 +2395,11 @@ PdoStartIo(
>          return __PdoExecuteScsi(Pdo, Srb);
> 
>      case SRB_FUNCTION_RESET_DEVICE:
> -        PdoReset(Pdo);
> -        return TRUE;
> +        return __PdoReset(Pdo, Srb);
> 
>      case SRB_FUNCTION_FLUSH:
>      case SRB_FUNCTION_SHUTDOWN:
> -        __PdoQueueShutdown(Pdo, Srb);
> -        return FALSE;
> +        return __PdoQueueShutdown(Pdo, Srb);
> 
>      default:
>          return TRUE;
> --
> 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

_______________________________________________
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 Oct 30 13:35:59 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 13:35: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 1Zs9qY-0008Bp-0k; Fri, 30 Oct 2015 13:35:58 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=738f7cb72=Paul.Durrant@citrix.com>)
	id 1Zs9qX-0008Bk-4Q
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 13:35:57 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	55/D9-30270-C3273365; Fri, 30 Oct 2015 13:35:56 +0000
X-Env-Sender: prvs=738f7cb72=Paul.Durrant@citrix.com
X-Msg-Ref: server-11.tower-206.messagelabs.com!1446212155!42320010!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24208 invoked from network); 30 Oct 2015 13:35:55 -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;
	30 Oct 2015 13:35:55 -0000
X-IronPort-AV: E=Sophos;i="5.20,218,1444694400"; 
   d="scan'208";a="6563935"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 1/8] SRB_FUNCTION_RESET_DEVICE should
	succeed... otherwise the entire controller is reset.
Thread-Index: AQHREKjxmdMl6YxfNEW7hb/ur4U7Q56EDobQ
Date: Fri, 30 Oct 2015 13:35:54 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F641121@AMSPEX01CL01.citrite.net>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
	<1445944546-21500-2-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1445944546-21500-2-git-send-email-owen.smith@citrix.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
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 1/8] SRB_FUNCTION_RESET_DEVICE
	should	succeed... otherwise the entire controller is reset.
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 Owen Smith
> Sent: 27 October 2015 11:16
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 1/8] SRB_FUNCTION_RESET_DEVICE should
> succeed... otherwise the entire controller is reset.
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xenvbd/fdo.c |  2 ++
>  src/xenvbd/pdo.c | 25 ++++++++++++++++++++-----
>  2 files changed, 22 insertions(+), 5 deletions(-)
> 
> diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
> index f6b47f2..82b7fb6 100644
> --- a/src/xenvbd/fdo.c
> +++ b/src/xenvbd/fdo.c
> @@ -1449,6 +1449,7 @@ FdoResetBus(
>  {
>      ULONG           TargetId;
> 
> +    Verbose("====>\n");
>      for (TargetId = 0; TargetId < XENVBD_MAX_TARGETS; ++TargetId) {
>          PXENVBD_PDO Pdo = __FdoGetPdo(Fdo, TargetId);
>          if (Pdo) {
> @@ -1456,6 +1457,7 @@ FdoResetBus(
>              PdoDereference(Pdo);
>          }
>      }
> +    Verbose("<====\n");
> 
>      return TRUE;
>  }
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index 198c4d3..de8ba02 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -2242,7 +2242,7 @@ __PdoExecuteScsi(
>      return TRUE;
>  }
> 
> -static FORCEINLINE VOID
> +static FORCEINLINE BOOLEAN
>  __PdoQueueShutdown(
>      __in PXENVBD_PDO             Pdo,
>      __in PSCSI_REQUEST_BLOCK     Srb
> @@ -2253,6 +2253,23 @@ __PdoQueueShutdown(
> 
>      QueueAppend(&Pdo->ShutdownSrbs, &SrbExt->Entry);
>      NotifierKick(Notifier);
> +
> +    return FALSE;
> +}
> +
> +static FORCEINLINE BOOLEAN
> +__PdoReset(
> +    __in PXENVBD_PDO             Pdo,
> +    __in PSCSI_REQUEST_BLOCK     Srb
> +    )
> +{
> +    Verbose("Target[%u] ====>\n", PdoGetTargetId(Pdo));
> +
> +    PdoReset(Pdo);
> +    Srb->SrbStatus = SRB_STATUS_SUCCESS;
> +
> +    Verbose("Target[%u] <====\n", PdoGetTargetId(Pdo));
> +    return TRUE;
>  }
> 
>  static FORCEINLINE VOID
> @@ -2378,13 +2395,11 @@ PdoStartIo(
>          return __PdoExecuteScsi(Pdo, Srb);
> 
>      case SRB_FUNCTION_RESET_DEVICE:
> -        PdoReset(Pdo);
> -        return TRUE;
> +        return __PdoReset(Pdo, Srb);
> 
>      case SRB_FUNCTION_FLUSH:
>      case SRB_FUNCTION_SHUTDOWN:
> -        __PdoQueueShutdown(Pdo, Srb);
> -        return FALSE;
> +        return __PdoQueueShutdown(Pdo, Srb);
> 
>      default:
>          return TRUE;
> --
> 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

_______________________________________________
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 Oct 30 13:38:55 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 13:38: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 1Zs9tP-0008He-8d; Fri, 30 Oct 2015 13:38:55 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=738f7cb72=Paul.Durrant@citrix.com>)
	id 1Zs9tO-0008HZ-1n
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 13:38:54 +0000
Received: from [85.158.139.211] by server-6.bemta-5.messagelabs.com id
	78/BF-22089-DE273365; Fri, 30 Oct 2015 13:38:53 +0000
X-Env-Sender: prvs=738f7cb72=Paul.Durrant@citrix.com
X-Msg-Ref: server-8.tower-206.messagelabs.com!1446212331!46423767!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10362 invoked from network); 30 Oct 2015 13:38:51 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-8.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2015 13:38:51 -0000
X-IronPort-AV: E=Sophos;i="5.20,218,1444694400"; 
   d="scan'208";a="6564151"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 2/8] Refacror - reorder functions in pdo.c
Thread-Index: AQHREKjo3pMrzjDaiE6CtRrPtTJ2/p6ED0vA
Date: Fri, 30 Oct 2015 13:38:51 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F641133@AMSPEX01CL01.citrite.net>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
	<1445944546-21500-3-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1445944546-21500-3-git-send-email-owen.smith@citrix.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
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 2/8] Refacror - reorder functions in pdo.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>
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 Owen Smith
> Sent: 27 October 2015 11:16
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 2/8] Refacror - reorder functions in pdo.c
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

I'll fix the spelling mistake when I commit.

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xenvbd/pdo.c | 657 +++++++++++++++++++++++++++---------------------
> -------
>  src/xenvbd/pdo.h |   5 -
>  2 files changed, 323 insertions(+), 339 deletions(-)
> 
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index de8ba02..9387742 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -448,286 +448,6 @@ __PdoRestoreDevicePnpState(
>      }
>  }
> 
> -static FORCEINLINE VOID
> -__PdoPauseDataPath(
> -    __in PXENVBD_PDO             Pdo,
> -    __in BOOLEAN                 Timeout
> -    )
> -{
> -    KIRQL               Irql;
> -    ULONG               Requests;
> -    ULONG               Count = 0;
> -    PXENVBD_NOTIFIER    Notifier = FrontendGetNotifier(Pdo->Frontend);
> -    PXENVBD_BLOCKRING   BlockRing = FrontendGetBlockRing(Pdo-
> >Frontend);
> -
> -    KeAcquireSpinLock(&Pdo->Lock, &Irql);
> -    ++Pdo->Paused;
> -    KeReleaseSpinLock(&Pdo->Lock, Irql);
> -
> -    Requests = QueueCount(&Pdo->SubmittedReqs);
> -    KeMemoryBarrier();
> -
> -    Verbose("Target[%d] : Waiting for %d Submitted requests\n",
> PdoGetTargetId(Pdo), Requests);
> -
> -    // poll ring and send event channel notification every 1ms (for up to 3
> minutes)
> -    while (QueueCount(&Pdo->SubmittedReqs)) {
> -        if (Timeout && Count > 180000)
> -            break;
> -        KeRaiseIrql(DISPATCH_LEVEL, &Irql);
> -        BlockRingPoll(BlockRing);
> -        KeLowerIrql(Irql);
> -        NotifierSend(Notifier);         // let backend know it needs to do some
> work
> -        StorPortStallExecution(1000);   // 1000 micro-seconds
> -        ++Count;
> -    }
> -
> -    Verbose("Target[%d] : %u/%u Submitted requests left (%u
> iterrations)\n",
> -            PdoGetTargetId(Pdo), QueueCount(&Pdo->SubmittedReqs),
> Requests, Count);
> -}
> -
> -static FORCEINLINE VOID
> -__PdoUnpauseDataPath(
> -    __in PXENVBD_PDO             Pdo
> -    )
> -{
> -    KIRQL   Irql;
> -
> -    KeAcquireSpinLock(&Pdo->Lock, &Irql);
> -    --Pdo->Paused;
> -    KeReleaseSpinLock(&Pdo->Lock, Irql);
> -}
> -
> -
> //=========================================================
> ====================
> -// Creation/Deletion
> -__checkReturn
> -NTSTATUS
> -PdoCreate(
> -    __in PXENVBD_FDO             Fdo,
> -    __in __nullterminated PCHAR  DeviceId,
> -    __in ULONG                   TargetId,
> -    __in BOOLEAN                 EmulatedUnplugged,
> -    __in PKEVENT                 FrontendEvent,
> -    __in XENVBD_DEVICE_TYPE      DeviceType
> -    )
> -{
> -    NTSTATUS    Status;
> -    PXENVBD_PDO Pdo;
> -
> -    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
> -
> -    Status = STATUS_INSUFFICIENT_RESOURCES;
> -#pragma warning(suppress: 6014)
> -    Pdo = __PdoAlloc(sizeof(XENVBD_PDO));
> -    if (!Pdo)
> -        goto fail1;
> -
> -    Verbose("Target[%d] : Creating (%s)\n", TargetId, EmulatedUnplugged ?
> "PV" : "Emulated");
> -    Pdo->Signature      = PDO_SIGNATURE;
> -    Pdo->Fdo            = Fdo;
> -    Pdo->DeviceObject   = NULL; // filled in later
> -    KeInitializeEvent(&Pdo->RemoveEvent, SynchronizationEvent, FALSE);
> -    Pdo->ReferenceCount = 1;
> -    Pdo->Paused         = 1; // Paused until D3->D0 transition
> -    Pdo->DevicePnpState = Present;
> -    Pdo->DevicePowerState = PowerDeviceD3;
> -    Pdo->EmulatedUnplugged = EmulatedUnplugged;
> -    Pdo->DeviceType     = DeviceType;
> -
> -    KeInitializeSpinLock(&Pdo->Lock);
> -    QueueInit(&Pdo->FreshSrbs);
> -    QueueInit(&Pdo->PreparedReqs);
> -    QueueInit(&Pdo->SubmittedReqs);
> -    QueueInit(&Pdo->ShutdownSrbs);
> -
> -    Status = FrontendCreate(Pdo, DeviceId, TargetId, FrontendEvent, &Pdo-
> >Frontend);
> -    if (!NT_SUCCESS(Status))
> -        goto fail2;
> -
> -    __LookasideInit(&Pdo->RequestList, sizeof(XENVBD_REQUEST),
> REQUEST_POOL_TAG);
> -    __LookasideInit(&Pdo->SegmentList, sizeof(XENVBD_SEGMENT),
> SEGMENT_POOL_TAG);
> -    __LookasideInit(&Pdo->IndirectList, PAGE_SIZE, INDIRECT_POOL_TAG);
> -
> -    Status = PdoD3ToD0(Pdo);
> -    if (!NT_SUCCESS(Status))
> -        goto fail3;
> -
> -    if (!FdoLinkPdo(Fdo, Pdo))
> -        goto fail4;
> -
> -    Verbose("Target[%d] : Created (%s)\n", TargetId, EmulatedUnplugged ?
> "PV" : "Emulated");
> -    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
> -    return STATUS_SUCCESS;
> -
> -fail4:
> -    Error("Fail4\n");
> -    PdoD0ToD3(Pdo);
> -
> -fail3:
> -    Error("Fail3\n");
> -    __LookasideTerm(&Pdo->IndirectList);
> -    __LookasideTerm(&Pdo->SegmentList);
> -    __LookasideTerm(&Pdo->RequestList);
> -    FrontendDestroy(Pdo->Frontend);
> -    Pdo->Frontend = NULL;
> -
> -fail2:
> -    Error("Fail2\n");
> -    __PdoFree(Pdo);
> -
> -fail1:
> -    Error("Fail1 (%08x)\n", Status);
> -    return Status;
> -}
> -
> -VOID
> -PdoDestroy(
> -    __in PXENVBD_PDO    Pdo
> -    )
> -{
> -    const ULONG         TargetId = PdoGetTargetId(Pdo);
> -    PVOID               Objects[4];
> -    PKWAIT_BLOCK        WaitBlock;
> -
> -    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
> -    Verbose("Target[%d] : Destroying\n", TargetId);
> -
> -    ASSERT3U(Pdo->Signature, ==, PDO_SIGNATURE);
> -    if (!FdoUnlinkPdo(PdoGetFdo(Pdo), Pdo)) {
> -        Error("Target[%d] : PDO 0x%p not linked to FDO 0x%p\n", TargetId, Pdo,
> PdoGetFdo(Pdo));
> -    }
> -
> -    PdoD0ToD3(Pdo);
> -    PdoDereference(Pdo); // drop initial ref count
> -
> -    // Wait for ReferenceCount == 0 and RequestListUsed == 0
> -    Verbose("Target[%d] : ReferenceCount %d, RequestListUsed %d\n",
> TargetId, Pdo->ReferenceCount, Pdo->RequestList.Used);
> -    Objects[0] = &Pdo->RemoveEvent;
> -    Objects[1] = &Pdo->RequestList.Empty;
> -    Objects[2] = &Pdo->SegmentList.Empty;
> -    Objects[3] = &Pdo->IndirectList.Empty;
> -
> -    WaitBlock = (PKWAIT_BLOCK)__PdoAlloc(sizeof(KWAIT_BLOCK) *
> ARRAYSIZE(Objects));
> -    if (WaitBlock == NULL) {
> -        ULONG   Index;
> -
> -        Error("Unable to allocate resources for KWAIT_BLOCK\n");
> -
> -        for (Index = 0; Index < ARRAYSIZE(Objects); Index++)
> -            KeWaitForSingleObject(Objects[Index],
> -                                  Executive,
> -                                  KernelMode,
> -                                  FALSE,
> -                                  NULL);
> -    } else {
> -        KeWaitForMultipleObjects(ARRAYSIZE(Objects),
> -                                 Objects,
> -                                 WaitAll,
> -                                 Executive,
> -                                 KernelMode,
> -                                 FALSE,
> -                                 NULL,
> -                                 WaitBlock);
> -#pragma prefast(suppress:6102)
> -        __PdoFree(WaitBlock);
> -    }
> -
> -    ASSERT3S(Pdo->ReferenceCount, ==, 0);
> -    ASSERT3U(PdoGetDevicePnpState(Pdo), ==, Deleted);
> -
> -    __LookasideTerm(&Pdo->IndirectList);
> -    __LookasideTerm(&Pdo->SegmentList);
> -    __LookasideTerm(&Pdo->RequestList);
> -
> -    FrontendDestroy(Pdo->Frontend);
> -    Pdo->Frontend = NULL;
> -
> -    ASSERT3U(Pdo->Signature, ==, PDO_SIGNATURE);
> -    RtlZeroMemory(Pdo, sizeof(XENVBD_PDO));
> -    __PdoFree(Pdo);
> -
> -    Verbose("Target[%d] : Destroyed\n", TargetId);
> -    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
> -}
> -
> -__checkReturn
> -NTSTATUS
> -PdoD3ToD0(
> -    __in PXENVBD_PDO            Pdo
> -    )
> -{
> -    NTSTATUS                    Status;
> -    const ULONG                 TargetId = PdoGetTargetId(Pdo);
> -
> -    if (!PdoSetDevicePowerState(Pdo, PowerDeviceD0))
> -        return STATUS_SUCCESS;
> -
> -    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
> -    Verbose("Target[%d] : D3->D0 (%s)\n", TargetId, Pdo-
> >EmulatedUnplugged ? "PV" : "Emulated");
> -
> -    // power up frontend
> -    Status = FrontendD3ToD0(Pdo->Frontend);
> -    if (!NT_SUCCESS(Status))
> -        goto fail1;
> -
> -    // connect frontend
> -    if (Pdo->EmulatedUnplugged) {
> -        Status = FrontendSetState(Pdo->Frontend, XENVBD_ENABLED);
> -        if (!NT_SUCCESS(Status))
> -            goto fail2;
> -        __PdoUnpauseDataPath(Pdo);
> -    }
> -
> -    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
> -    return STATUS_SUCCESS;
> -
> -fail2:
> -    Error("Fail2\n");
> -    FrontendD0ToD3(Pdo->Frontend);
> -
> -fail1:
> -    Error("Fail1 (%08x)\n", Status);
> -
> -    Pdo->DevicePowerState = PowerDeviceD3;
> -
> -    return Status;
> -}
> -
> -VOID
> -PdoD0ToD3(
> -    __in PXENVBD_PDO            Pdo
> -    )
> -{
> -    const ULONG                 TargetId = PdoGetTargetId(Pdo);
> -
> -    if (!PdoSetDevicePowerState(Pdo, PowerDeviceD3))
> -        return;
> -
> -    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
> -    Verbose("Target[%d] : D0->D3 (%s)\n", TargetId, Pdo-
> >EmulatedUnplugged ? "PV" : "Emulated");
> -
> -    // close frontend
> -    if (Pdo->EmulatedUnplugged) {
> -        __PdoPauseDataPath(Pdo, FALSE);
> -        PdoAbortAllSrbs(Pdo);
> -        (VOID) FrontendSetState(Pdo->Frontend, XENVBD_CLOSED);
> -        ASSERT3U(QueueCount(&Pdo->SubmittedReqs), ==, 0);
> -    }
> -
> -    // power down frontend
> -    FrontendD0ToD3(Pdo->Frontend);
> -
> -    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
> -}
> -
> -__drv_requiresIRQL(DISPATCH_LEVEL)
> -VOID
> -PdoBackendPathChanged(
> -    __in PXENVBD_PDO             Pdo
> -    )
> -{
> -    FrontendBackendPathChanged(Pdo->Frontend);
> -}
> -
> 
> //=========================================================
> ====================
>  // Reference Counting
>  FORCEINLINE LONG
> @@ -1522,6 +1242,91 @@ fail1:
> 
> 
> //=========================================================
> ====================
>  // Queue-Related
> +static FORCEINLINE VOID
> +__PdoPauseDataPath(
> +    __in PXENVBD_PDO             Pdo,
> +    __in BOOLEAN                 Timeout
> +    )
> +{
> +    KIRQL               Irql;
> +    ULONG               Requests;
> +    ULONG               Count = 0;
> +    PXENVBD_NOTIFIER    Notifier = FrontendGetNotifier(Pdo->Frontend);
> +    PXENVBD_BLOCKRING   BlockRing = FrontendGetBlockRing(Pdo-
> >Frontend);
> +
> +    KeAcquireSpinLock(&Pdo->Lock, &Irql);
> +    ++Pdo->Paused;
> +    KeReleaseSpinLock(&Pdo->Lock, Irql);
> +
> +    Requests = QueueCount(&Pdo->SubmittedReqs);
> +    KeMemoryBarrier();
> +
> +    Verbose("Target[%d] : Waiting for %d Submitted requests\n",
> PdoGetTargetId(Pdo), Requests);
> +
> +    // poll ring and send event channel notification every 1ms (for up to 3
> minutes)
> +    while (QueueCount(&Pdo->SubmittedReqs)) {
> +        if (Timeout && Count > 180000)
> +            break;
> +        KeRaiseIrql(DISPATCH_LEVEL, &Irql);
> +        BlockRingPoll(BlockRing);
> +        KeLowerIrql(Irql);
> +        NotifierSend(Notifier);         // let backend know it needs to do some
> work
> +        StorPortStallExecution(1000);   // 1000 micro-seconds
> +        ++Count;
> +    }
> +
> +    Verbose("Target[%d] : %u/%u Submitted requests left (%u
> iterrations)\n",
> +            PdoGetTargetId(Pdo), QueueCount(&Pdo->SubmittedReqs),
> Requests, Count);
> +
> +    // Abort Fresh SRBs
> +    for (;;) {
> +        PXENVBD_SRBEXT  SrbExt;
> +        PLIST_ENTRY     Entry = QueuePop(&Pdo->FreshSrbs);
> +        if (Entry == NULL)
> +            break;
> +        SrbExt = CONTAINING_RECORD(Entry, XENVBD_SRBEXT, Entry);
> +
> +        Verbose("Target[%d] : FreshSrb 0x%p -> SCSI_ABORTED\n",
> PdoGetTargetId(Pdo), SrbExt->Srb);
> +        SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
> +        SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED;
> +        FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
> +    }
> +
> +    // Fail PreparedReqs
> +    for (;;) {
> +        PXENVBD_SRBEXT  SrbExt;
> +        PXENVBD_REQUEST Request;
> +        PLIST_ENTRY     Entry = QueuePop(&Pdo->PreparedReqs);
> +        if (Entry == NULL)
> +            break;
> +        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> +        SrbExt = GetSrbExt(Request->Srb);
> +
> +        Verbose("Target[%d] : PreparedReq 0x%p -> FAILED\n",
> PdoGetTargetId(Pdo), Request);
> +
> +        SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
> +        RequestCleanup(Pdo, Request);
> +        __LookasideFree(&Pdo->RequestList, Request);
> +
> +        if (InterlockedDecrement(&SrbExt->Count) == 0) {
> +            SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
> +            FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
> +        }
> +    }
> +}
> +
> +static FORCEINLINE VOID
> +__PdoUnpauseDataPath(
> +    __in PXENVBD_PDO             Pdo
> +    )
> +{
> +    KIRQL   Irql;
> +
> +    KeAcquireSpinLock(&Pdo->Lock, &Irql);
> +    --Pdo->Paused;
> +    KeReleaseSpinLock(&Pdo->Lock, Irql);
> +}
> +
>  static FORCEINLINE BOOLEAN
>  PdoPrepareFresh(
>      __in PXENVBD_PDO             Pdo
> @@ -2310,7 +2115,6 @@ PdoReset(
>      Trace("Target[%d] ====> (Irql=%d)\n", PdoGetTargetId(Pdo),
> KeGetCurrentIrql());
> 
>      __PdoPauseDataPath(Pdo, TRUE);
> -    PdoAbortAllSrbs(Pdo);
> 
>      if (QueueCount(&Pdo->SubmittedReqs)) {
>          Error("Target[%d] : backend has %u outstanding requests after a
> PdoReset\n",
> @@ -2390,61 +2194,19 @@ PdoStartIo(
>      if (!__ValidateSrbForPdo(Pdo, Srb))
>          return TRUE;
> 
> -    switch (Srb->Function) {
> -    case SRB_FUNCTION_EXECUTE_SCSI:
> -        return __PdoExecuteScsi(Pdo, Srb);
> -
> -    case SRB_FUNCTION_RESET_DEVICE:
> -        return __PdoReset(Pdo, Srb);
> -
> -    case SRB_FUNCTION_FLUSH:
> -    case SRB_FUNCTION_SHUTDOWN:
> -        return __PdoQueueShutdown(Pdo, Srb);
> -
> -    default:
> -        return TRUE;
> -    }
> -}
> -
> -VOID
> -PdoAbortAllSrbs(
> -    __in PXENVBD_PDO             Pdo
> -    )
> -{
> -    // Abort Fresh SRBs
> -    for (;;) {
> -        PXENVBD_SRBEXT  SrbExt;
> -        PLIST_ENTRY     Entry = QueuePop(&Pdo->FreshSrbs);
> -        if (Entry == NULL)
> -            break;
> -        SrbExt = CONTAINING_RECORD(Entry, XENVBD_SRBEXT, Entry);
> -
> -        Verbose("Target[%d] : FreshSrb 0x%p -> SCSI_ABORTED\n",
> PdoGetTargetId(Pdo), SrbExt->Srb);
> -        SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
> -        SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED;
> -        FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
> -    }
> -
> -    // Fail PreparedReqs
> -    for (;;) {
> -        PXENVBD_SRBEXT  SrbExt;
> -        PXENVBD_REQUEST Request;
> -        PLIST_ENTRY     Entry = QueuePop(&Pdo->PreparedReqs);
> -        if (Entry == NULL)
> -            break;
> -        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> -        SrbExt = GetSrbExt(Request->Srb);
> +    switch (Srb->Function) {
> +    case SRB_FUNCTION_EXECUTE_SCSI:
> +        return __PdoExecuteScsi(Pdo, Srb);
> 
> -        Verbose("Target[%d] : PreparedReq 0x%p -> FAILED\n",
> PdoGetTargetId(Pdo), Request);
> -
> -        SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
> -        RequestCleanup(Pdo, Request);
> -        __LookasideFree(&Pdo->RequestList, Request);
> +    case SRB_FUNCTION_RESET_DEVICE:
> +        return __PdoReset(Pdo, Srb);
> 
> -        if (InterlockedDecrement(&SrbExt->Count) == 0) {
> -            SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
> -            FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
> -        }
> +    case SRB_FUNCTION_FLUSH:
> +    case SRB_FUNCTION_SHUTDOWN:
> +        return __PdoQueueShutdown(Pdo, Srb);
> +
> +    default:
> +        return TRUE;
>      }
>  }
> 
> @@ -2697,3 +2459,230 @@ PdoIssueDeviceEject(
>      }
>  }
> 
> +__drv_requiresIRQL(DISPATCH_LEVEL)
> +VOID
> +PdoBackendPathChanged(
> +    __in PXENVBD_PDO             Pdo
> +    )
> +{
> +    FrontendBackendPathChanged(Pdo->Frontend);
> +}
> +
> +__checkReturn
> +NTSTATUS
> +PdoD3ToD0(
> +    __in PXENVBD_PDO            Pdo
> +    )
> +{
> +    NTSTATUS                    Status;
> +    const ULONG                 TargetId = PdoGetTargetId(Pdo);
> +
> +    if (!PdoSetDevicePowerState(Pdo, PowerDeviceD0))
> +        return STATUS_SUCCESS;
> +
> +    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
> +    Verbose("Target[%d] : D3->D0 (%s)\n", TargetId, Pdo-
> >EmulatedUnplugged ? "PV" : "Emulated");
> +
> +    // power up frontend
> +    Status = FrontendD3ToD0(Pdo->Frontend);
> +    if (!NT_SUCCESS(Status))
> +        goto fail1;
> +
> +    // connect frontend
> +    if (Pdo->EmulatedUnplugged) {
> +        Status = FrontendSetState(Pdo->Frontend, XENVBD_ENABLED);
> +        if (!NT_SUCCESS(Status))
> +            goto fail2;
> +        __PdoUnpauseDataPath(Pdo);
> +    }
> +
> +    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    Error("Fail2\n");
> +    FrontendD0ToD3(Pdo->Frontend);
> +
> +fail1:
> +    Error("Fail1 (%08x)\n", Status);
> +
> +    Pdo->DevicePowerState = PowerDeviceD3;
> +
> +    return Status;
> +}
> +
> +VOID
> +PdoD0ToD3(
> +    __in PXENVBD_PDO            Pdo
> +    )
> +{
> +    const ULONG                 TargetId = PdoGetTargetId(Pdo);
> +
> +    if (!PdoSetDevicePowerState(Pdo, PowerDeviceD3))
> +        return;
> +
> +    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
> +    Verbose("Target[%d] : D0->D3 (%s)\n", TargetId, Pdo-
> >EmulatedUnplugged ? "PV" : "Emulated");
> +
> +    // close frontend
> +    if (Pdo->EmulatedUnplugged) {
> +        __PdoPauseDataPath(Pdo, FALSE);
> +        (VOID) FrontendSetState(Pdo->Frontend, XENVBD_CLOSED);
> +        ASSERT3U(QueueCount(&Pdo->SubmittedReqs), ==, 0);
> +    }
> +
> +    // power down frontend
> +    FrontendD0ToD3(Pdo->Frontend);
> +
> +    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
> +}
> +
> +__checkReturn
> +NTSTATUS
> +PdoCreate(
> +    __in PXENVBD_FDO             Fdo,
> +    __in __nullterminated PCHAR  DeviceId,
> +    __in ULONG                   TargetId,
> +    __in BOOLEAN                 EmulatedUnplugged,
> +    __in PKEVENT                 FrontendEvent,
> +    __in XENVBD_DEVICE_TYPE      DeviceType
> +    )
> +{
> +    NTSTATUS    Status;
> +    PXENVBD_PDO Pdo;
> +
> +    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
> +
> +    Status = STATUS_INSUFFICIENT_RESOURCES;
> +#pragma warning(suppress: 6014)
> +    Pdo = __PdoAlloc(sizeof(XENVBD_PDO));
> +    if (!Pdo)
> +        goto fail1;
> +
> +    Verbose("Target[%d] : Creating (%s)\n", TargetId, EmulatedUnplugged ?
> "PV" : "Emulated");
> +    Pdo->Signature      = PDO_SIGNATURE;
> +    Pdo->Fdo            = Fdo;
> +    Pdo->DeviceObject   = NULL; // filled in later
> +    KeInitializeEvent(&Pdo->RemoveEvent, SynchronizationEvent, FALSE);
> +    Pdo->ReferenceCount = 1;
> +    Pdo->Paused         = 1; // Paused until D3->D0 transition
> +    Pdo->DevicePnpState = Present;
> +    Pdo->DevicePowerState = PowerDeviceD3;
> +    Pdo->EmulatedUnplugged = EmulatedUnplugged;
> +    Pdo->DeviceType     = DeviceType;
> +
> +    KeInitializeSpinLock(&Pdo->Lock);
> +    QueueInit(&Pdo->FreshSrbs);
> +    QueueInit(&Pdo->PreparedReqs);
> +    QueueInit(&Pdo->SubmittedReqs);
> +    QueueInit(&Pdo->ShutdownSrbs);
> +
> +    Status = FrontendCreate(Pdo, DeviceId, TargetId, FrontendEvent, &Pdo-
> >Frontend);
> +    if (!NT_SUCCESS(Status))
> +        goto fail2;
> +
> +    __LookasideInit(&Pdo->RequestList, sizeof(XENVBD_REQUEST),
> REQUEST_POOL_TAG);
> +    __LookasideInit(&Pdo->SegmentList, sizeof(XENVBD_SEGMENT),
> SEGMENT_POOL_TAG);
> +    __LookasideInit(&Pdo->IndirectList, PAGE_SIZE, INDIRECT_POOL_TAG);
> +
> +    Status = PdoD3ToD0(Pdo);
> +    if (!NT_SUCCESS(Status))
> +        goto fail3;
> +
> +    if (!FdoLinkPdo(Fdo, Pdo))
> +        goto fail4;
> +
> +    Verbose("Target[%d] : Created (%s)\n", TargetId, EmulatedUnplugged ?
> "PV" : "Emulated");
> +    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
> +    return STATUS_SUCCESS;
> +
> +fail4:
> +    Error("Fail4\n");
> +    PdoD0ToD3(Pdo);
> +
> +fail3:
> +    Error("Fail3\n");
> +    __LookasideTerm(&Pdo->IndirectList);
> +    __LookasideTerm(&Pdo->SegmentList);
> +    __LookasideTerm(&Pdo->RequestList);
> +    FrontendDestroy(Pdo->Frontend);
> +    Pdo->Frontend = NULL;
> +
> +fail2:
> +    Error("Fail2\n");
> +    __PdoFree(Pdo);
> +
> +fail1:
> +    Error("Fail1 (%08x)\n", Status);
> +    return Status;
> +}
> +
> +VOID
> +PdoDestroy(
> +    __in PXENVBD_PDO    Pdo
> +    )
> +{
> +    const ULONG         TargetId = PdoGetTargetId(Pdo);
> +    PVOID               Objects[4];
> +    PKWAIT_BLOCK        WaitBlock;
> +
> +    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
> +    Verbose("Target[%d] : Destroying\n", TargetId);
> +
> +    ASSERT3U(Pdo->Signature, ==, PDO_SIGNATURE);
> +    if (!FdoUnlinkPdo(PdoGetFdo(Pdo), Pdo)) {
> +        Error("Target[%d] : PDO 0x%p not linked to FDO 0x%p\n", TargetId,
> Pdo, PdoGetFdo(Pdo));
> +    }
> +
> +    PdoD0ToD3(Pdo);
> +    PdoDereference(Pdo); // drop initial ref count
> +
> +    // Wait for ReferenceCount == 0 and RequestListUsed == 0
> +    Verbose("Target[%d] : ReferenceCount %d, RequestListUsed %d\n",
> TargetId, Pdo->ReferenceCount, Pdo->RequestList.Used);
> +    Objects[0] = &Pdo->RemoveEvent;
> +    Objects[1] = &Pdo->RequestList.Empty;
> +    Objects[2] = &Pdo->SegmentList.Empty;
> +    Objects[3] = &Pdo->IndirectList.Empty;
> +
> +    WaitBlock = (PKWAIT_BLOCK)__PdoAlloc(sizeof(KWAIT_BLOCK) *
> ARRAYSIZE(Objects));
> +    if (WaitBlock == NULL) {
> +        ULONG   Index;
> +
> +        Error("Unable to allocate resources for KWAIT_BLOCK\n");
> +
> +        for (Index = 0; Index < ARRAYSIZE(Objects); Index++)
> +            KeWaitForSingleObject(Objects[Index],
> +                                  Executive,
> +                                  KernelMode,
> +                                  FALSE,
> +                                  NULL);
> +    } else {
> +        KeWaitForMultipleObjects(ARRAYSIZE(Objects),
> +                                 Objects,
> +                                 WaitAll,
> +                                 Executive,
> +                                 KernelMode,
> +                                 FALSE,
> +                                 NULL,
> +                                 WaitBlock);
> +#pragma prefast(suppress:6102)
> +        __PdoFree(WaitBlock);
> +    }
> +
> +    ASSERT3S(Pdo->ReferenceCount, ==, 0);
> +    ASSERT3U(PdoGetDevicePnpState(Pdo), ==, Deleted);
> +
> +    __LookasideTerm(&Pdo->IndirectList);
> +    __LookasideTerm(&Pdo->SegmentList);
> +    __LookasideTerm(&Pdo->RequestList);
> +
> +    FrontendDestroy(Pdo->Frontend);
> +    Pdo->Frontend = NULL;
> +
> +    ASSERT3U(Pdo->Signature, ==, PDO_SIGNATURE);
> +    RtlZeroMemory(Pdo, sizeof(XENVBD_PDO));
> +    __PdoFree(Pdo);
> +
> +    Verbose("Target[%d] : Destroyed\n", TargetId);
> +    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
> +}
> diff --git a/src/xenvbd/pdo.h b/src/xenvbd/pdo.h
> index c5e81ab..fbd6681 100644
> --- a/src/xenvbd/pdo.h
> +++ b/src/xenvbd/pdo.h
> @@ -213,11 +213,6 @@ PdoStartIo(
>      );
> 
>  extern VOID
> -PdoAbortAllSrbs(
> -    __in PXENVBD_PDO             Pdo
> -    );
> -
> -extern VOID
>  PdoSrbPnp(
>      __in PXENVBD_PDO             Pdo,
>      __in PSCSI_PNP_REQUEST_BLOCK Srb
> --
> 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

_______________________________________________
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 Oct 30 13:38:55 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 13:38: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 1Zs9tP-0008He-8d; Fri, 30 Oct 2015 13:38:55 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=738f7cb72=Paul.Durrant@citrix.com>)
	id 1Zs9tO-0008HZ-1n
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 13:38:54 +0000
Received: from [85.158.139.211] by server-6.bemta-5.messagelabs.com id
	78/BF-22089-DE273365; Fri, 30 Oct 2015 13:38:53 +0000
X-Env-Sender: prvs=738f7cb72=Paul.Durrant@citrix.com
X-Msg-Ref: server-8.tower-206.messagelabs.com!1446212331!46423767!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10362 invoked from network); 30 Oct 2015 13:38:51 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-8.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2015 13:38:51 -0000
X-IronPort-AV: E=Sophos;i="5.20,218,1444694400"; 
   d="scan'208";a="6564151"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 2/8] Refacror - reorder functions in pdo.c
Thread-Index: AQHREKjo3pMrzjDaiE6CtRrPtTJ2/p6ED0vA
Date: Fri, 30 Oct 2015 13:38:51 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F641133@AMSPEX01CL01.citrite.net>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
	<1445944546-21500-3-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1445944546-21500-3-git-send-email-owen.smith@citrix.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
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 2/8] Refacror - reorder functions in pdo.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>
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 Owen Smith
> Sent: 27 October 2015 11:16
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 2/8] Refacror - reorder functions in pdo.c
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

I'll fix the spelling mistake when I commit.

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xenvbd/pdo.c | 657 +++++++++++++++++++++++++++---------------------
> -------
>  src/xenvbd/pdo.h |   5 -
>  2 files changed, 323 insertions(+), 339 deletions(-)
> 
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index de8ba02..9387742 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -448,286 +448,6 @@ __PdoRestoreDevicePnpState(
>      }
>  }
> 
> -static FORCEINLINE VOID
> -__PdoPauseDataPath(
> -    __in PXENVBD_PDO             Pdo,
> -    __in BOOLEAN                 Timeout
> -    )
> -{
> -    KIRQL               Irql;
> -    ULONG               Requests;
> -    ULONG               Count = 0;
> -    PXENVBD_NOTIFIER    Notifier = FrontendGetNotifier(Pdo->Frontend);
> -    PXENVBD_BLOCKRING   BlockRing = FrontendGetBlockRing(Pdo-
> >Frontend);
> -
> -    KeAcquireSpinLock(&Pdo->Lock, &Irql);
> -    ++Pdo->Paused;
> -    KeReleaseSpinLock(&Pdo->Lock, Irql);
> -
> -    Requests = QueueCount(&Pdo->SubmittedReqs);
> -    KeMemoryBarrier();
> -
> -    Verbose("Target[%d] : Waiting for %d Submitted requests\n",
> PdoGetTargetId(Pdo), Requests);
> -
> -    // poll ring and send event channel notification every 1ms (for up to 3
> minutes)
> -    while (QueueCount(&Pdo->SubmittedReqs)) {
> -        if (Timeout && Count > 180000)
> -            break;
> -        KeRaiseIrql(DISPATCH_LEVEL, &Irql);
> -        BlockRingPoll(BlockRing);
> -        KeLowerIrql(Irql);
> -        NotifierSend(Notifier);         // let backend know it needs to do some
> work
> -        StorPortStallExecution(1000);   // 1000 micro-seconds
> -        ++Count;
> -    }
> -
> -    Verbose("Target[%d] : %u/%u Submitted requests left (%u
> iterrations)\n",
> -            PdoGetTargetId(Pdo), QueueCount(&Pdo->SubmittedReqs),
> Requests, Count);
> -}
> -
> -static FORCEINLINE VOID
> -__PdoUnpauseDataPath(
> -    __in PXENVBD_PDO             Pdo
> -    )
> -{
> -    KIRQL   Irql;
> -
> -    KeAcquireSpinLock(&Pdo->Lock, &Irql);
> -    --Pdo->Paused;
> -    KeReleaseSpinLock(&Pdo->Lock, Irql);
> -}
> -
> -
> //=========================================================
> ====================
> -// Creation/Deletion
> -__checkReturn
> -NTSTATUS
> -PdoCreate(
> -    __in PXENVBD_FDO             Fdo,
> -    __in __nullterminated PCHAR  DeviceId,
> -    __in ULONG                   TargetId,
> -    __in BOOLEAN                 EmulatedUnplugged,
> -    __in PKEVENT                 FrontendEvent,
> -    __in XENVBD_DEVICE_TYPE      DeviceType
> -    )
> -{
> -    NTSTATUS    Status;
> -    PXENVBD_PDO Pdo;
> -
> -    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
> -
> -    Status = STATUS_INSUFFICIENT_RESOURCES;
> -#pragma warning(suppress: 6014)
> -    Pdo = __PdoAlloc(sizeof(XENVBD_PDO));
> -    if (!Pdo)
> -        goto fail1;
> -
> -    Verbose("Target[%d] : Creating (%s)\n", TargetId, EmulatedUnplugged ?
> "PV" : "Emulated");
> -    Pdo->Signature      = PDO_SIGNATURE;
> -    Pdo->Fdo            = Fdo;
> -    Pdo->DeviceObject   = NULL; // filled in later
> -    KeInitializeEvent(&Pdo->RemoveEvent, SynchronizationEvent, FALSE);
> -    Pdo->ReferenceCount = 1;
> -    Pdo->Paused         = 1; // Paused until D3->D0 transition
> -    Pdo->DevicePnpState = Present;
> -    Pdo->DevicePowerState = PowerDeviceD3;
> -    Pdo->EmulatedUnplugged = EmulatedUnplugged;
> -    Pdo->DeviceType     = DeviceType;
> -
> -    KeInitializeSpinLock(&Pdo->Lock);
> -    QueueInit(&Pdo->FreshSrbs);
> -    QueueInit(&Pdo->PreparedReqs);
> -    QueueInit(&Pdo->SubmittedReqs);
> -    QueueInit(&Pdo->ShutdownSrbs);
> -
> -    Status = FrontendCreate(Pdo, DeviceId, TargetId, FrontendEvent, &Pdo-
> >Frontend);
> -    if (!NT_SUCCESS(Status))
> -        goto fail2;
> -
> -    __LookasideInit(&Pdo->RequestList, sizeof(XENVBD_REQUEST),
> REQUEST_POOL_TAG);
> -    __LookasideInit(&Pdo->SegmentList, sizeof(XENVBD_SEGMENT),
> SEGMENT_POOL_TAG);
> -    __LookasideInit(&Pdo->IndirectList, PAGE_SIZE, INDIRECT_POOL_TAG);
> -
> -    Status = PdoD3ToD0(Pdo);
> -    if (!NT_SUCCESS(Status))
> -        goto fail3;
> -
> -    if (!FdoLinkPdo(Fdo, Pdo))
> -        goto fail4;
> -
> -    Verbose("Target[%d] : Created (%s)\n", TargetId, EmulatedUnplugged ?
> "PV" : "Emulated");
> -    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
> -    return STATUS_SUCCESS;
> -
> -fail4:
> -    Error("Fail4\n");
> -    PdoD0ToD3(Pdo);
> -
> -fail3:
> -    Error("Fail3\n");
> -    __LookasideTerm(&Pdo->IndirectList);
> -    __LookasideTerm(&Pdo->SegmentList);
> -    __LookasideTerm(&Pdo->RequestList);
> -    FrontendDestroy(Pdo->Frontend);
> -    Pdo->Frontend = NULL;
> -
> -fail2:
> -    Error("Fail2\n");
> -    __PdoFree(Pdo);
> -
> -fail1:
> -    Error("Fail1 (%08x)\n", Status);
> -    return Status;
> -}
> -
> -VOID
> -PdoDestroy(
> -    __in PXENVBD_PDO    Pdo
> -    )
> -{
> -    const ULONG         TargetId = PdoGetTargetId(Pdo);
> -    PVOID               Objects[4];
> -    PKWAIT_BLOCK        WaitBlock;
> -
> -    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
> -    Verbose("Target[%d] : Destroying\n", TargetId);
> -
> -    ASSERT3U(Pdo->Signature, ==, PDO_SIGNATURE);
> -    if (!FdoUnlinkPdo(PdoGetFdo(Pdo), Pdo)) {
> -        Error("Target[%d] : PDO 0x%p not linked to FDO 0x%p\n", TargetId, Pdo,
> PdoGetFdo(Pdo));
> -    }
> -
> -    PdoD0ToD3(Pdo);
> -    PdoDereference(Pdo); // drop initial ref count
> -
> -    // Wait for ReferenceCount == 0 and RequestListUsed == 0
> -    Verbose("Target[%d] : ReferenceCount %d, RequestListUsed %d\n",
> TargetId, Pdo->ReferenceCount, Pdo->RequestList.Used);
> -    Objects[0] = &Pdo->RemoveEvent;
> -    Objects[1] = &Pdo->RequestList.Empty;
> -    Objects[2] = &Pdo->SegmentList.Empty;
> -    Objects[3] = &Pdo->IndirectList.Empty;
> -
> -    WaitBlock = (PKWAIT_BLOCK)__PdoAlloc(sizeof(KWAIT_BLOCK) *
> ARRAYSIZE(Objects));
> -    if (WaitBlock == NULL) {
> -        ULONG   Index;
> -
> -        Error("Unable to allocate resources for KWAIT_BLOCK\n");
> -
> -        for (Index = 0; Index < ARRAYSIZE(Objects); Index++)
> -            KeWaitForSingleObject(Objects[Index],
> -                                  Executive,
> -                                  KernelMode,
> -                                  FALSE,
> -                                  NULL);
> -    } else {
> -        KeWaitForMultipleObjects(ARRAYSIZE(Objects),
> -                                 Objects,
> -                                 WaitAll,
> -                                 Executive,
> -                                 KernelMode,
> -                                 FALSE,
> -                                 NULL,
> -                                 WaitBlock);
> -#pragma prefast(suppress:6102)
> -        __PdoFree(WaitBlock);
> -    }
> -
> -    ASSERT3S(Pdo->ReferenceCount, ==, 0);
> -    ASSERT3U(PdoGetDevicePnpState(Pdo), ==, Deleted);
> -
> -    __LookasideTerm(&Pdo->IndirectList);
> -    __LookasideTerm(&Pdo->SegmentList);
> -    __LookasideTerm(&Pdo->RequestList);
> -
> -    FrontendDestroy(Pdo->Frontend);
> -    Pdo->Frontend = NULL;
> -
> -    ASSERT3U(Pdo->Signature, ==, PDO_SIGNATURE);
> -    RtlZeroMemory(Pdo, sizeof(XENVBD_PDO));
> -    __PdoFree(Pdo);
> -
> -    Verbose("Target[%d] : Destroyed\n", TargetId);
> -    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
> -}
> -
> -__checkReturn
> -NTSTATUS
> -PdoD3ToD0(
> -    __in PXENVBD_PDO            Pdo
> -    )
> -{
> -    NTSTATUS                    Status;
> -    const ULONG                 TargetId = PdoGetTargetId(Pdo);
> -
> -    if (!PdoSetDevicePowerState(Pdo, PowerDeviceD0))
> -        return STATUS_SUCCESS;
> -
> -    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
> -    Verbose("Target[%d] : D3->D0 (%s)\n", TargetId, Pdo-
> >EmulatedUnplugged ? "PV" : "Emulated");
> -
> -    // power up frontend
> -    Status = FrontendD3ToD0(Pdo->Frontend);
> -    if (!NT_SUCCESS(Status))
> -        goto fail1;
> -
> -    // connect frontend
> -    if (Pdo->EmulatedUnplugged) {
> -        Status = FrontendSetState(Pdo->Frontend, XENVBD_ENABLED);
> -        if (!NT_SUCCESS(Status))
> -            goto fail2;
> -        __PdoUnpauseDataPath(Pdo);
> -    }
> -
> -    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
> -    return STATUS_SUCCESS;
> -
> -fail2:
> -    Error("Fail2\n");
> -    FrontendD0ToD3(Pdo->Frontend);
> -
> -fail1:
> -    Error("Fail1 (%08x)\n", Status);
> -
> -    Pdo->DevicePowerState = PowerDeviceD3;
> -
> -    return Status;
> -}
> -
> -VOID
> -PdoD0ToD3(
> -    __in PXENVBD_PDO            Pdo
> -    )
> -{
> -    const ULONG                 TargetId = PdoGetTargetId(Pdo);
> -
> -    if (!PdoSetDevicePowerState(Pdo, PowerDeviceD3))
> -        return;
> -
> -    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
> -    Verbose("Target[%d] : D0->D3 (%s)\n", TargetId, Pdo-
> >EmulatedUnplugged ? "PV" : "Emulated");
> -
> -    // close frontend
> -    if (Pdo->EmulatedUnplugged) {
> -        __PdoPauseDataPath(Pdo, FALSE);
> -        PdoAbortAllSrbs(Pdo);
> -        (VOID) FrontendSetState(Pdo->Frontend, XENVBD_CLOSED);
> -        ASSERT3U(QueueCount(&Pdo->SubmittedReqs), ==, 0);
> -    }
> -
> -    // power down frontend
> -    FrontendD0ToD3(Pdo->Frontend);
> -
> -    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
> -}
> -
> -__drv_requiresIRQL(DISPATCH_LEVEL)
> -VOID
> -PdoBackendPathChanged(
> -    __in PXENVBD_PDO             Pdo
> -    )
> -{
> -    FrontendBackendPathChanged(Pdo->Frontend);
> -}
> -
> 
> //=========================================================
> ====================
>  // Reference Counting
>  FORCEINLINE LONG
> @@ -1522,6 +1242,91 @@ fail1:
> 
> 
> //=========================================================
> ====================
>  // Queue-Related
> +static FORCEINLINE VOID
> +__PdoPauseDataPath(
> +    __in PXENVBD_PDO             Pdo,
> +    __in BOOLEAN                 Timeout
> +    )
> +{
> +    KIRQL               Irql;
> +    ULONG               Requests;
> +    ULONG               Count = 0;
> +    PXENVBD_NOTIFIER    Notifier = FrontendGetNotifier(Pdo->Frontend);
> +    PXENVBD_BLOCKRING   BlockRing = FrontendGetBlockRing(Pdo-
> >Frontend);
> +
> +    KeAcquireSpinLock(&Pdo->Lock, &Irql);
> +    ++Pdo->Paused;
> +    KeReleaseSpinLock(&Pdo->Lock, Irql);
> +
> +    Requests = QueueCount(&Pdo->SubmittedReqs);
> +    KeMemoryBarrier();
> +
> +    Verbose("Target[%d] : Waiting for %d Submitted requests\n",
> PdoGetTargetId(Pdo), Requests);
> +
> +    // poll ring and send event channel notification every 1ms (for up to 3
> minutes)
> +    while (QueueCount(&Pdo->SubmittedReqs)) {
> +        if (Timeout && Count > 180000)
> +            break;
> +        KeRaiseIrql(DISPATCH_LEVEL, &Irql);
> +        BlockRingPoll(BlockRing);
> +        KeLowerIrql(Irql);
> +        NotifierSend(Notifier);         // let backend know it needs to do some
> work
> +        StorPortStallExecution(1000);   // 1000 micro-seconds
> +        ++Count;
> +    }
> +
> +    Verbose("Target[%d] : %u/%u Submitted requests left (%u
> iterrations)\n",
> +            PdoGetTargetId(Pdo), QueueCount(&Pdo->SubmittedReqs),
> Requests, Count);
> +
> +    // Abort Fresh SRBs
> +    for (;;) {
> +        PXENVBD_SRBEXT  SrbExt;
> +        PLIST_ENTRY     Entry = QueuePop(&Pdo->FreshSrbs);
> +        if (Entry == NULL)
> +            break;
> +        SrbExt = CONTAINING_RECORD(Entry, XENVBD_SRBEXT, Entry);
> +
> +        Verbose("Target[%d] : FreshSrb 0x%p -> SCSI_ABORTED\n",
> PdoGetTargetId(Pdo), SrbExt->Srb);
> +        SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
> +        SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED;
> +        FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
> +    }
> +
> +    // Fail PreparedReqs
> +    for (;;) {
> +        PXENVBD_SRBEXT  SrbExt;
> +        PXENVBD_REQUEST Request;
> +        PLIST_ENTRY     Entry = QueuePop(&Pdo->PreparedReqs);
> +        if (Entry == NULL)
> +            break;
> +        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> +        SrbExt = GetSrbExt(Request->Srb);
> +
> +        Verbose("Target[%d] : PreparedReq 0x%p -> FAILED\n",
> PdoGetTargetId(Pdo), Request);
> +
> +        SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
> +        RequestCleanup(Pdo, Request);
> +        __LookasideFree(&Pdo->RequestList, Request);
> +
> +        if (InterlockedDecrement(&SrbExt->Count) == 0) {
> +            SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
> +            FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
> +        }
> +    }
> +}
> +
> +static FORCEINLINE VOID
> +__PdoUnpauseDataPath(
> +    __in PXENVBD_PDO             Pdo
> +    )
> +{
> +    KIRQL   Irql;
> +
> +    KeAcquireSpinLock(&Pdo->Lock, &Irql);
> +    --Pdo->Paused;
> +    KeReleaseSpinLock(&Pdo->Lock, Irql);
> +}
> +
>  static FORCEINLINE BOOLEAN
>  PdoPrepareFresh(
>      __in PXENVBD_PDO             Pdo
> @@ -2310,7 +2115,6 @@ PdoReset(
>      Trace("Target[%d] ====> (Irql=%d)\n", PdoGetTargetId(Pdo),
> KeGetCurrentIrql());
> 
>      __PdoPauseDataPath(Pdo, TRUE);
> -    PdoAbortAllSrbs(Pdo);
> 
>      if (QueueCount(&Pdo->SubmittedReqs)) {
>          Error("Target[%d] : backend has %u outstanding requests after a
> PdoReset\n",
> @@ -2390,61 +2194,19 @@ PdoStartIo(
>      if (!__ValidateSrbForPdo(Pdo, Srb))
>          return TRUE;
> 
> -    switch (Srb->Function) {
> -    case SRB_FUNCTION_EXECUTE_SCSI:
> -        return __PdoExecuteScsi(Pdo, Srb);
> -
> -    case SRB_FUNCTION_RESET_DEVICE:
> -        return __PdoReset(Pdo, Srb);
> -
> -    case SRB_FUNCTION_FLUSH:
> -    case SRB_FUNCTION_SHUTDOWN:
> -        return __PdoQueueShutdown(Pdo, Srb);
> -
> -    default:
> -        return TRUE;
> -    }
> -}
> -
> -VOID
> -PdoAbortAllSrbs(
> -    __in PXENVBD_PDO             Pdo
> -    )
> -{
> -    // Abort Fresh SRBs
> -    for (;;) {
> -        PXENVBD_SRBEXT  SrbExt;
> -        PLIST_ENTRY     Entry = QueuePop(&Pdo->FreshSrbs);
> -        if (Entry == NULL)
> -            break;
> -        SrbExt = CONTAINING_RECORD(Entry, XENVBD_SRBEXT, Entry);
> -
> -        Verbose("Target[%d] : FreshSrb 0x%p -> SCSI_ABORTED\n",
> PdoGetTargetId(Pdo), SrbExt->Srb);
> -        SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
> -        SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED;
> -        FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
> -    }
> -
> -    // Fail PreparedReqs
> -    for (;;) {
> -        PXENVBD_SRBEXT  SrbExt;
> -        PXENVBD_REQUEST Request;
> -        PLIST_ENTRY     Entry = QueuePop(&Pdo->PreparedReqs);
> -        if (Entry == NULL)
> -            break;
> -        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> -        SrbExt = GetSrbExt(Request->Srb);
> +    switch (Srb->Function) {
> +    case SRB_FUNCTION_EXECUTE_SCSI:
> +        return __PdoExecuteScsi(Pdo, Srb);
> 
> -        Verbose("Target[%d] : PreparedReq 0x%p -> FAILED\n",
> PdoGetTargetId(Pdo), Request);
> -
> -        SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
> -        RequestCleanup(Pdo, Request);
> -        __LookasideFree(&Pdo->RequestList, Request);
> +    case SRB_FUNCTION_RESET_DEVICE:
> +        return __PdoReset(Pdo, Srb);
> 
> -        if (InterlockedDecrement(&SrbExt->Count) == 0) {
> -            SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
> -            FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
> -        }
> +    case SRB_FUNCTION_FLUSH:
> +    case SRB_FUNCTION_SHUTDOWN:
> +        return __PdoQueueShutdown(Pdo, Srb);
> +
> +    default:
> +        return TRUE;
>      }
>  }
> 
> @@ -2697,3 +2459,230 @@ PdoIssueDeviceEject(
>      }
>  }
> 
> +__drv_requiresIRQL(DISPATCH_LEVEL)
> +VOID
> +PdoBackendPathChanged(
> +    __in PXENVBD_PDO             Pdo
> +    )
> +{
> +    FrontendBackendPathChanged(Pdo->Frontend);
> +}
> +
> +__checkReturn
> +NTSTATUS
> +PdoD3ToD0(
> +    __in PXENVBD_PDO            Pdo
> +    )
> +{
> +    NTSTATUS                    Status;
> +    const ULONG                 TargetId = PdoGetTargetId(Pdo);
> +
> +    if (!PdoSetDevicePowerState(Pdo, PowerDeviceD0))
> +        return STATUS_SUCCESS;
> +
> +    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
> +    Verbose("Target[%d] : D3->D0 (%s)\n", TargetId, Pdo-
> >EmulatedUnplugged ? "PV" : "Emulated");
> +
> +    // power up frontend
> +    Status = FrontendD3ToD0(Pdo->Frontend);
> +    if (!NT_SUCCESS(Status))
> +        goto fail1;
> +
> +    // connect frontend
> +    if (Pdo->EmulatedUnplugged) {
> +        Status = FrontendSetState(Pdo->Frontend, XENVBD_ENABLED);
> +        if (!NT_SUCCESS(Status))
> +            goto fail2;
> +        __PdoUnpauseDataPath(Pdo);
> +    }
> +
> +    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    Error("Fail2\n");
> +    FrontendD0ToD3(Pdo->Frontend);
> +
> +fail1:
> +    Error("Fail1 (%08x)\n", Status);
> +
> +    Pdo->DevicePowerState = PowerDeviceD3;
> +
> +    return Status;
> +}
> +
> +VOID
> +PdoD0ToD3(
> +    __in PXENVBD_PDO            Pdo
> +    )
> +{
> +    const ULONG                 TargetId = PdoGetTargetId(Pdo);
> +
> +    if (!PdoSetDevicePowerState(Pdo, PowerDeviceD3))
> +        return;
> +
> +    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
> +    Verbose("Target[%d] : D0->D3 (%s)\n", TargetId, Pdo-
> >EmulatedUnplugged ? "PV" : "Emulated");
> +
> +    // close frontend
> +    if (Pdo->EmulatedUnplugged) {
> +        __PdoPauseDataPath(Pdo, FALSE);
> +        (VOID) FrontendSetState(Pdo->Frontend, XENVBD_CLOSED);
> +        ASSERT3U(QueueCount(&Pdo->SubmittedReqs), ==, 0);
> +    }
> +
> +    // power down frontend
> +    FrontendD0ToD3(Pdo->Frontend);
> +
> +    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
> +}
> +
> +__checkReturn
> +NTSTATUS
> +PdoCreate(
> +    __in PXENVBD_FDO             Fdo,
> +    __in __nullterminated PCHAR  DeviceId,
> +    __in ULONG                   TargetId,
> +    __in BOOLEAN                 EmulatedUnplugged,
> +    __in PKEVENT                 FrontendEvent,
> +    __in XENVBD_DEVICE_TYPE      DeviceType
> +    )
> +{
> +    NTSTATUS    Status;
> +    PXENVBD_PDO Pdo;
> +
> +    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
> +
> +    Status = STATUS_INSUFFICIENT_RESOURCES;
> +#pragma warning(suppress: 6014)
> +    Pdo = __PdoAlloc(sizeof(XENVBD_PDO));
> +    if (!Pdo)
> +        goto fail1;
> +
> +    Verbose("Target[%d] : Creating (%s)\n", TargetId, EmulatedUnplugged ?
> "PV" : "Emulated");
> +    Pdo->Signature      = PDO_SIGNATURE;
> +    Pdo->Fdo            = Fdo;
> +    Pdo->DeviceObject   = NULL; // filled in later
> +    KeInitializeEvent(&Pdo->RemoveEvent, SynchronizationEvent, FALSE);
> +    Pdo->ReferenceCount = 1;
> +    Pdo->Paused         = 1; // Paused until D3->D0 transition
> +    Pdo->DevicePnpState = Present;
> +    Pdo->DevicePowerState = PowerDeviceD3;
> +    Pdo->EmulatedUnplugged = EmulatedUnplugged;
> +    Pdo->DeviceType     = DeviceType;
> +
> +    KeInitializeSpinLock(&Pdo->Lock);
> +    QueueInit(&Pdo->FreshSrbs);
> +    QueueInit(&Pdo->PreparedReqs);
> +    QueueInit(&Pdo->SubmittedReqs);
> +    QueueInit(&Pdo->ShutdownSrbs);
> +
> +    Status = FrontendCreate(Pdo, DeviceId, TargetId, FrontendEvent, &Pdo-
> >Frontend);
> +    if (!NT_SUCCESS(Status))
> +        goto fail2;
> +
> +    __LookasideInit(&Pdo->RequestList, sizeof(XENVBD_REQUEST),
> REQUEST_POOL_TAG);
> +    __LookasideInit(&Pdo->SegmentList, sizeof(XENVBD_SEGMENT),
> SEGMENT_POOL_TAG);
> +    __LookasideInit(&Pdo->IndirectList, PAGE_SIZE, INDIRECT_POOL_TAG);
> +
> +    Status = PdoD3ToD0(Pdo);
> +    if (!NT_SUCCESS(Status))
> +        goto fail3;
> +
> +    if (!FdoLinkPdo(Fdo, Pdo))
> +        goto fail4;
> +
> +    Verbose("Target[%d] : Created (%s)\n", TargetId, EmulatedUnplugged ?
> "PV" : "Emulated");
> +    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
> +    return STATUS_SUCCESS;
> +
> +fail4:
> +    Error("Fail4\n");
> +    PdoD0ToD3(Pdo);
> +
> +fail3:
> +    Error("Fail3\n");
> +    __LookasideTerm(&Pdo->IndirectList);
> +    __LookasideTerm(&Pdo->SegmentList);
> +    __LookasideTerm(&Pdo->RequestList);
> +    FrontendDestroy(Pdo->Frontend);
> +    Pdo->Frontend = NULL;
> +
> +fail2:
> +    Error("Fail2\n");
> +    __PdoFree(Pdo);
> +
> +fail1:
> +    Error("Fail1 (%08x)\n", Status);
> +    return Status;
> +}
> +
> +VOID
> +PdoDestroy(
> +    __in PXENVBD_PDO    Pdo
> +    )
> +{
> +    const ULONG         TargetId = PdoGetTargetId(Pdo);
> +    PVOID               Objects[4];
> +    PKWAIT_BLOCK        WaitBlock;
> +
> +    Trace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql());
> +    Verbose("Target[%d] : Destroying\n", TargetId);
> +
> +    ASSERT3U(Pdo->Signature, ==, PDO_SIGNATURE);
> +    if (!FdoUnlinkPdo(PdoGetFdo(Pdo), Pdo)) {
> +        Error("Target[%d] : PDO 0x%p not linked to FDO 0x%p\n", TargetId,
> Pdo, PdoGetFdo(Pdo));
> +    }
> +
> +    PdoD0ToD3(Pdo);
> +    PdoDereference(Pdo); // drop initial ref count
> +
> +    // Wait for ReferenceCount == 0 and RequestListUsed == 0
> +    Verbose("Target[%d] : ReferenceCount %d, RequestListUsed %d\n",
> TargetId, Pdo->ReferenceCount, Pdo->RequestList.Used);
> +    Objects[0] = &Pdo->RemoveEvent;
> +    Objects[1] = &Pdo->RequestList.Empty;
> +    Objects[2] = &Pdo->SegmentList.Empty;
> +    Objects[3] = &Pdo->IndirectList.Empty;
> +
> +    WaitBlock = (PKWAIT_BLOCK)__PdoAlloc(sizeof(KWAIT_BLOCK) *
> ARRAYSIZE(Objects));
> +    if (WaitBlock == NULL) {
> +        ULONG   Index;
> +
> +        Error("Unable to allocate resources for KWAIT_BLOCK\n");
> +
> +        for (Index = 0; Index < ARRAYSIZE(Objects); Index++)
> +            KeWaitForSingleObject(Objects[Index],
> +                                  Executive,
> +                                  KernelMode,
> +                                  FALSE,
> +                                  NULL);
> +    } else {
> +        KeWaitForMultipleObjects(ARRAYSIZE(Objects),
> +                                 Objects,
> +                                 WaitAll,
> +                                 Executive,
> +                                 KernelMode,
> +                                 FALSE,
> +                                 NULL,
> +                                 WaitBlock);
> +#pragma prefast(suppress:6102)
> +        __PdoFree(WaitBlock);
> +    }
> +
> +    ASSERT3S(Pdo->ReferenceCount, ==, 0);
> +    ASSERT3U(PdoGetDevicePnpState(Pdo), ==, Deleted);
> +
> +    __LookasideTerm(&Pdo->IndirectList);
> +    __LookasideTerm(&Pdo->SegmentList);
> +    __LookasideTerm(&Pdo->RequestList);
> +
> +    FrontendDestroy(Pdo->Frontend);
> +    Pdo->Frontend = NULL;
> +
> +    ASSERT3U(Pdo->Signature, ==, PDO_SIGNATURE);
> +    RtlZeroMemory(Pdo, sizeof(XENVBD_PDO));
> +    __PdoFree(Pdo);
> +
> +    Verbose("Target[%d] : Destroyed\n", TargetId);
> +    Trace("Target[%d] @ (%d) <=====\n", TargetId, KeGetCurrentIrql());
> +}
> diff --git a/src/xenvbd/pdo.h b/src/xenvbd/pdo.h
> index c5e81ab..fbd6681 100644
> --- a/src/xenvbd/pdo.h
> +++ b/src/xenvbd/pdo.h
> @@ -213,11 +213,6 @@ PdoStartIo(
>      );
> 
>  extern VOID
> -PdoAbortAllSrbs(
> -    __in PXENVBD_PDO             Pdo
> -    );
> -
> -extern VOID
>  PdoSrbPnp(
>      __in PXENVBD_PDO             Pdo,
>      __in PSCSI_PNP_REQUEST_BLOCK Srb
> --
> 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

_______________________________________________
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 Oct 30 13:50:23 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 13:50:23 +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 1ZsA4U-0008Od-DJ; Fri, 30 Oct 2015 13:50:22 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=738f7cb72=Paul.Durrant@citrix.com>)
	id 1ZsA4S-0008OY-PK
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 13:50:20 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	3B/FB-30270-C9573365; Fri, 30 Oct 2015 13:50:20 +0000
X-Env-Sender: prvs=738f7cb72=Paul.Durrant@citrix.com
X-Msg-Ref: server-15.tower-206.messagelabs.com!1446213019!30711896!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 12964 invoked from network); 30 Oct 2015 13:50:19 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-15.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2015 13:50:19 -0000
X-IronPort-AV: E=Sophos;i="5.20,218,1444694400"; 
   d="scan'208";a="6565122"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 3/8] Refactor - hide default Pnp/Power
	function pointers
Thread-Index: AQHREKjm16iebNiC20C2XlcIX2SrVp6EEpMg
Date: Fri, 30 Oct 2015 13:50:19 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F64118D@AMSPEX01CL01.citrite.net>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
	<1445944546-21500-4-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1445944546-21500-4-git-send-email-owen.smith@citrix.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
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 3/8] Refactor - hide default
	Pnp/Power	function pointers
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 Owen Smith
> Sent: 27 October 2015 11:16
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 3/8] Refactor - hide default Pnp/Power
> function pointers
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xenvbd/driver.c | 32 +++++++++++++++++++++++++-------
>  src/xenvbd/driver.h | 12 ++++++++++++
>  src/xenvbd/fdo.c    | 14 +++++---------
>  src/xenvbd/pdo.c    |  4 +---
>  4 files changed, 43 insertions(+), 19 deletions(-)
> 
> diff --git a/src/xenvbd/driver.c b/src/xenvbd/driver.c
> index 2a41c8c..2f13ba6 100644
> --- a/src/xenvbd/driver.c
> +++ b/src/xenvbd/driver.c
> @@ -208,10 +208,28 @@ __DriverParseParameterKey(
>  }
> 
> 
> //=========================================================
> ====================
> +static PDRIVER_DISPATCH     StorPortDispatchPnp;
> +static PDRIVER_DISPATCH     StorPortDispatchPower;
> +static PDRIVER_UNLOAD       StorPortDriverUnload;
> +
> +NTSTATUS
> +DriverDispatchPnp(
> +    IN  PDEVICE_OBJECT  DeviceObject,
> +    IN  PIRP            Irp
> +    )
> +{
> +    return StorPortDispatchPnp(DeviceObject, Irp);
> +}
> +
> +NTSTATUS
> +DriverDispatchPower(
> +    IN  PDEVICE_OBJECT  DeviceObject,
> +    IN  PIRP            Irp
> +    )
> +{
> +    return StorPortDispatchPower(DeviceObject, Irp);
> +}
> 
> -PDRIVER_DISPATCH     StorPortDispatchPnp;
> -PDRIVER_DISPATCH     StorPortDispatchPower;
> -PDRIVER_UNLOAD       StorPortDriverUnload;
> 
> //=========================================================
> ====================
>  // Fdo Device Extension management
>  static PXENVBD_FDO              __XenvbdFdo;
> @@ -298,7 +316,7 @@ DriverMapPdo(
>          }
>      }
>      KeReleaseSpinLock(&__XenvbdLock, Irql);
> -    Status = StorPortDispatchPnp(DeviceObject, Irp);
> +    Status = DriverDispatchPnp(DeviceObject, Irp);
> 
>  done:
>      return Status;
> @@ -555,7 +573,7 @@ DispatchPnp(
>      case IS_NULL:
>      default:
>          Warning("DeviceObject 0x%p is not FDO (0x%p) or a PDO\n",
> DeviceObject, __XenvbdFdo);
> -        Status = StorPortDispatchPnp(DeviceObject, Irp);
> +        Status = DriverDispatchPnp(DeviceObject, Irp);
>          break;
>      }
> 
> @@ -589,13 +607,13 @@ DispatchPower(
>          if (Pdo) {
>              PdoDereference(Pdo); // drops Pdo reference
>          }
> -        Status = StorPortDispatchPower(DeviceObject, Irp);
> +        Status = DriverDispatchPower(DeviceObject, Irp);
>          break;
> 
>      case IS_NULL:
>      default:
>          Warning("DeviceObject 0x%p is not FDO (0x%p) or a PDO\n",
> DeviceObject, __XenvbdFdo);
> -        Status = StorPortDispatchPower(DeviceObject, Irp);
> +        Status = DriverDispatchPower(DeviceObject, Irp);
>          break;
>      }
> 
> diff --git a/src/xenvbd/driver.h b/src/xenvbd/driver.h
> index d59f053..560dd4e 100644
> --- a/src/xenvbd/driver.h
> +++ b/src/xenvbd/driver.h
> @@ -59,6 +59,18 @@ extern XENVBD_PARAMETERS    DriverParameters;
> 
>  extern HANDLE               DriverStatusKey;
> 
> +extern NTSTATUS
> +DriverDispatchPnp(
> +    IN  PDEVICE_OBJECT  DeviceObject,
> +    IN  PIRP            Irp
> +    );
> +
> +extern NTSTATUS
> +DriverDispatchPower(
> +    IN  PDEVICE_OBJECT  DeviceObject,
> +    IN  PIRP            Irp
> +    );
> +
>  // Fdo Device Extension management
>  extern VOID
>  DriverLinkFdo(
> diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
> index 82b7fb6..724d8ea 100644
> --- a/src/xenvbd/fdo.c
> +++ b/src/xenvbd/fdo.c
> @@ -98,8 +98,6 @@ struct _XENVBD_FDO {
>      LONG                        TotalSrbs;
>  };
> 
> -extern PDRIVER_DISPATCH StorPortDispatchPower;
> -
> 
> //=========================================================
> ====================
>  static FORCEINLINE BOOLEAN
>  __FdoSetDevicePowerState(
> @@ -1215,7 +1213,7 @@ FdoDevicePower(
>              break;
>          }
>          FdoDereference(Fdo);
> -        Status = StorPortDispatchPower(Fdo->DeviceObject, Irp);
> +        Status = DriverDispatchPower(Fdo->DeviceObject, Irp);
>          if (!NT_SUCCESS(Status)) {
>              Warning("StorPort failed PowerIRP with %08x\n", Status);
>          }
> @@ -1644,8 +1642,6 @@ FdoStartIo(
> 
> 
> //=========================================================
> ====================
>  // PnP Handler
> -extern PDRIVER_DISPATCH StorPortDispatchPnp;
> -
>  __checkReturn
>  NTSTATUS
>  FdoDispatchPnp(
> @@ -1699,7 +1695,7 @@ FdoDispatchPnp(
>          break;
>      }
> 
> -    Status = StorPortDispatchPnp(DeviceObject, Irp);
> +    Status = DriverDispatchPnp(DeviceObject, Irp);
>      if (!NT_SUCCESS(Status)) {
>          Verbose("%02x:%s -> %08x\n", Minor, PnpMinorFunctionName(Minor),
> Status);
>      }
> @@ -1847,7 +1843,7 @@ FdoMapDeviceObjectToPdo(
>      ExFreePool(String);
> 
>  done:
> -    Status = StorPortDispatchPnp(DeviceObject, Irp);;
> +    Status = DriverDispatchPnp(DeviceObject, Irp);;
>      if (!NT_SUCCESS(Status)) {
>          Verbose("%02x:%s -> %08x\n", Minor, PnpMinorFunctionName(Minor),
> Status);
>      }
> @@ -1876,7 +1872,7 @@ FdoDispatchPower(
>          if (Fdo->DevicePowerThread == NULL) {
>              Verbose("DevicePower IRP before DevicePowerThread ready\n");
>              FdoDereference(Fdo);
> -            status = StorPortDispatchPower(DeviceObject, Irp);
> +            status = DriverDispatchPower(DeviceObject, Irp);
>              break;
>          }
> 
> @@ -1894,7 +1890,7 @@ FdoDispatchPower(
>      case SystemPowerState:
>      default:
>          FdoDereference(Fdo);
> -        status = StorPortDispatchPower(DeviceObject, Irp);
> +        status = DriverDispatchPower(DeviceObject, Irp);
>          break;
>      }
> 
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index 9387742..c0447db 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -2239,8 +2239,6 @@ PdoSrbPnp(
> 
> 
> //=========================================================
> ====================
>  // PnP Handler
> -extern PDRIVER_DISPATCH StorPortDispatchPnp;
> -
>  static FORCEINLINE VOID
>  __PdoDeviceUsageNotification(
>      __in PXENVBD_PDO             Pdo,
> @@ -2419,7 +2417,7 @@ PdoDispatchPnp(
>          break;
>      }
>      PdoDereference(Pdo);
> -    Status = StorPortDispatchPnp(DeviceObject, Irp);
> +    Status = DriverDispatchPnp(DeviceObject, Irp);
>      if (!NT_SUCCESS(Status)) {
>          Verbose("Target[%d] : %02x:%s -> %08x\n", TargetId, Minor,
> PnpMinorFunctionName(Minor), Status);
>      }
> --
> 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

_______________________________________________
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 Oct 30 13:50:23 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 13:50:23 +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 1ZsA4U-0008Od-DJ; Fri, 30 Oct 2015 13:50:22 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=738f7cb72=Paul.Durrant@citrix.com>)
	id 1ZsA4S-0008OY-PK
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 13:50:20 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	3B/FB-30270-C9573365; Fri, 30 Oct 2015 13:50:20 +0000
X-Env-Sender: prvs=738f7cb72=Paul.Durrant@citrix.com
X-Msg-Ref: server-15.tower-206.messagelabs.com!1446213019!30711896!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 12964 invoked from network); 30 Oct 2015 13:50:19 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-15.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2015 13:50:19 -0000
X-IronPort-AV: E=Sophos;i="5.20,218,1444694400"; 
   d="scan'208";a="6565122"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 3/8] Refactor - hide default Pnp/Power
	function pointers
Thread-Index: AQHREKjm16iebNiC20C2XlcIX2SrVp6EEpMg
Date: Fri, 30 Oct 2015 13:50:19 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F64118D@AMSPEX01CL01.citrite.net>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
	<1445944546-21500-4-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1445944546-21500-4-git-send-email-owen.smith@citrix.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
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 3/8] Refactor - hide default
	Pnp/Power	function pointers
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 Owen Smith
> Sent: 27 October 2015 11:16
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 3/8] Refactor - hide default Pnp/Power
> function pointers
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xenvbd/driver.c | 32 +++++++++++++++++++++++++-------
>  src/xenvbd/driver.h | 12 ++++++++++++
>  src/xenvbd/fdo.c    | 14 +++++---------
>  src/xenvbd/pdo.c    |  4 +---
>  4 files changed, 43 insertions(+), 19 deletions(-)
> 
> diff --git a/src/xenvbd/driver.c b/src/xenvbd/driver.c
> index 2a41c8c..2f13ba6 100644
> --- a/src/xenvbd/driver.c
> +++ b/src/xenvbd/driver.c
> @@ -208,10 +208,28 @@ __DriverParseParameterKey(
>  }
> 
> 
> //=========================================================
> ====================
> +static PDRIVER_DISPATCH     StorPortDispatchPnp;
> +static PDRIVER_DISPATCH     StorPortDispatchPower;
> +static PDRIVER_UNLOAD       StorPortDriverUnload;
> +
> +NTSTATUS
> +DriverDispatchPnp(
> +    IN  PDEVICE_OBJECT  DeviceObject,
> +    IN  PIRP            Irp
> +    )
> +{
> +    return StorPortDispatchPnp(DeviceObject, Irp);
> +}
> +
> +NTSTATUS
> +DriverDispatchPower(
> +    IN  PDEVICE_OBJECT  DeviceObject,
> +    IN  PIRP            Irp
> +    )
> +{
> +    return StorPortDispatchPower(DeviceObject, Irp);
> +}
> 
> -PDRIVER_DISPATCH     StorPortDispatchPnp;
> -PDRIVER_DISPATCH     StorPortDispatchPower;
> -PDRIVER_UNLOAD       StorPortDriverUnload;
> 
> //=========================================================
> ====================
>  // Fdo Device Extension management
>  static PXENVBD_FDO              __XenvbdFdo;
> @@ -298,7 +316,7 @@ DriverMapPdo(
>          }
>      }
>      KeReleaseSpinLock(&__XenvbdLock, Irql);
> -    Status = StorPortDispatchPnp(DeviceObject, Irp);
> +    Status = DriverDispatchPnp(DeviceObject, Irp);
> 
>  done:
>      return Status;
> @@ -555,7 +573,7 @@ DispatchPnp(
>      case IS_NULL:
>      default:
>          Warning("DeviceObject 0x%p is not FDO (0x%p) or a PDO\n",
> DeviceObject, __XenvbdFdo);
> -        Status = StorPortDispatchPnp(DeviceObject, Irp);
> +        Status = DriverDispatchPnp(DeviceObject, Irp);
>          break;
>      }
> 
> @@ -589,13 +607,13 @@ DispatchPower(
>          if (Pdo) {
>              PdoDereference(Pdo); // drops Pdo reference
>          }
> -        Status = StorPortDispatchPower(DeviceObject, Irp);
> +        Status = DriverDispatchPower(DeviceObject, Irp);
>          break;
> 
>      case IS_NULL:
>      default:
>          Warning("DeviceObject 0x%p is not FDO (0x%p) or a PDO\n",
> DeviceObject, __XenvbdFdo);
> -        Status = StorPortDispatchPower(DeviceObject, Irp);
> +        Status = DriverDispatchPower(DeviceObject, Irp);
>          break;
>      }
> 
> diff --git a/src/xenvbd/driver.h b/src/xenvbd/driver.h
> index d59f053..560dd4e 100644
> --- a/src/xenvbd/driver.h
> +++ b/src/xenvbd/driver.h
> @@ -59,6 +59,18 @@ extern XENVBD_PARAMETERS    DriverParameters;
> 
>  extern HANDLE               DriverStatusKey;
> 
> +extern NTSTATUS
> +DriverDispatchPnp(
> +    IN  PDEVICE_OBJECT  DeviceObject,
> +    IN  PIRP            Irp
> +    );
> +
> +extern NTSTATUS
> +DriverDispatchPower(
> +    IN  PDEVICE_OBJECT  DeviceObject,
> +    IN  PIRP            Irp
> +    );
> +
>  // Fdo Device Extension management
>  extern VOID
>  DriverLinkFdo(
> diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
> index 82b7fb6..724d8ea 100644
> --- a/src/xenvbd/fdo.c
> +++ b/src/xenvbd/fdo.c
> @@ -98,8 +98,6 @@ struct _XENVBD_FDO {
>      LONG                        TotalSrbs;
>  };
> 
> -extern PDRIVER_DISPATCH StorPortDispatchPower;
> -
> 
> //=========================================================
> ====================
>  static FORCEINLINE BOOLEAN
>  __FdoSetDevicePowerState(
> @@ -1215,7 +1213,7 @@ FdoDevicePower(
>              break;
>          }
>          FdoDereference(Fdo);
> -        Status = StorPortDispatchPower(Fdo->DeviceObject, Irp);
> +        Status = DriverDispatchPower(Fdo->DeviceObject, Irp);
>          if (!NT_SUCCESS(Status)) {
>              Warning("StorPort failed PowerIRP with %08x\n", Status);
>          }
> @@ -1644,8 +1642,6 @@ FdoStartIo(
> 
> 
> //=========================================================
> ====================
>  // PnP Handler
> -extern PDRIVER_DISPATCH StorPortDispatchPnp;
> -
>  __checkReturn
>  NTSTATUS
>  FdoDispatchPnp(
> @@ -1699,7 +1695,7 @@ FdoDispatchPnp(
>          break;
>      }
> 
> -    Status = StorPortDispatchPnp(DeviceObject, Irp);
> +    Status = DriverDispatchPnp(DeviceObject, Irp);
>      if (!NT_SUCCESS(Status)) {
>          Verbose("%02x:%s -> %08x\n", Minor, PnpMinorFunctionName(Minor),
> Status);
>      }
> @@ -1847,7 +1843,7 @@ FdoMapDeviceObjectToPdo(
>      ExFreePool(String);
> 
>  done:
> -    Status = StorPortDispatchPnp(DeviceObject, Irp);;
> +    Status = DriverDispatchPnp(DeviceObject, Irp);;
>      if (!NT_SUCCESS(Status)) {
>          Verbose("%02x:%s -> %08x\n", Minor, PnpMinorFunctionName(Minor),
> Status);
>      }
> @@ -1876,7 +1872,7 @@ FdoDispatchPower(
>          if (Fdo->DevicePowerThread == NULL) {
>              Verbose("DevicePower IRP before DevicePowerThread ready\n");
>              FdoDereference(Fdo);
> -            status = StorPortDispatchPower(DeviceObject, Irp);
> +            status = DriverDispatchPower(DeviceObject, Irp);
>              break;
>          }
> 
> @@ -1894,7 +1890,7 @@ FdoDispatchPower(
>      case SystemPowerState:
>      default:
>          FdoDereference(Fdo);
> -        status = StorPortDispatchPower(DeviceObject, Irp);
> +        status = DriverDispatchPower(DeviceObject, Irp);
>          break;
>      }
> 
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index 9387742..c0447db 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -2239,8 +2239,6 @@ PdoSrbPnp(
> 
> 
> //=========================================================
> ====================
>  // PnP Handler
> -extern PDRIVER_DISPATCH StorPortDispatchPnp;
> -
>  static FORCEINLINE VOID
>  __PdoDeviceUsageNotification(
>      __in PXENVBD_PDO             Pdo,
> @@ -2419,7 +2417,7 @@ PdoDispatchPnp(
>          break;
>      }
>      PdoDereference(Pdo);
> -    Status = StorPortDispatchPnp(DeviceObject, Irp);
> +    Status = DriverDispatchPnp(DeviceObject, Irp);
>      if (!NT_SUCCESS(Status)) {
>          Verbose("Target[%d] : %02x:%s -> %08x\n", TargetId, Minor,
> PnpMinorFunctionName(Minor), Status);
>      }
> --
> 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

_______________________________________________
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 Oct 30 13:54:25 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 13:54:25 +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 1ZsA8O-0008PN-NK; Fri, 30 Oct 2015 13:54:24 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=738f7cb72=Paul.Durrant@citrix.com>)
	id 1ZsA8N-0008PI-TD
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 13:54:24 +0000
Received: from [85.158.139.211] by server-15.bemta-5.messagelabs.com id
	4F/9C-16870-F8673365; Fri, 30 Oct 2015 13:54:23 +0000
X-Env-Sender: prvs=738f7cb72=Paul.Durrant@citrix.com
X-Msg-Ref: server-6.tower-206.messagelabs.com!1446213262!46445867!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17951 invoked from network); 30 Oct 2015 13:54:22 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-6.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2015 13:54:22 -0000
X-IronPort-AV: E=Sophos;i="5.20,218,1444694400"; 
   d="scan'208";a="6565421"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 4/8] Remove PdoPnpSrb,	since StorPort
	doesn't call for targets
Thread-Index: AQHREKjx0bLdp5j9d0afmgABsEA5Bp6EE4Dw
Date: Fri, 30 Oct 2015 13:54:22 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6411AA@AMSPEX01CL01.citrite.net>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
	<1445944546-21500-5-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1445944546-21500-5-git-send-email-owen.smith@citrix.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
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 4/8] Remove PdoPnpSrb,
 since StorPort doesn't call for targets
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 Owen Smith
> Sent: 27 October 2015 11:16
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 4/8] Remove PdoPnpSrb, since StorPort
> doesn't call for targets
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>
> ---
>  src/xenvbd/fdo.c | 18 ------------------
>  src/xenvbd/pdo.c | 27 ---------------------------
>  src/xenvbd/pdo.h |  6 ------
>  3 files changed, 51 deletions(-)
> 
> diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
> index 724d8ea..593875e 100644
> --- a/src/xenvbd/fdo.c
> +++ b/src/xenvbd/fdo.c
> @@ -1565,23 +1565,6 @@ FdoFindAdapter(
>      return SP_RETURN_FOUND;
>  }
> 
> -static FORCEINLINE VOID
> -__FdoSrbPnp(
> -    __in PXENVBD_FDO                 Fdo,
> -    __in PSCSI_PNP_REQUEST_BLOCK     Srb
> -    )
> -{
> -    if (!(Srb->SrbPnPFlags & SRB_PNP_FLAGS_ADAPTER_REQUEST)) {
> -        PXENVBD_PDO     Pdo;
> -
> -        Pdo = __FdoGetPdo(Fdo, Srb->TargetId);
> -        if (Pdo) {
> -            PdoSrbPnp(Pdo, Srb);
> -            PdoDereference(Pdo);
> -        }
> -    }
> -}
> -
>  BOOLEAN
>  FdoBuildIo(
>      __in PXENVBD_FDO                 Fdo,
> @@ -1600,7 +1583,6 @@ FdoBuildIo(
> 
>          // dont pass to StartIo
>      case SRB_FUNCTION_PNP:
> -        __FdoSrbPnp(Fdo, (PSCSI_PNP_REQUEST_BLOCK)Srb);
>          Srb->SrbStatus = SRB_STATUS_SUCCESS;
>          break;

I think this whole case should go then. I'll make that change, so...

Acked-by: Paul Durrant <paul.durrant@citrix.com>

>      case SRB_FUNCTION_ABORT_COMMAND:
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index c0447db..172fa67 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -2210,33 +2210,6 @@ PdoStartIo(
>      }
>  }
> 
> -VOID
> -PdoSrbPnp(
> -    __in PXENVBD_PDO             Pdo,
> -    __in PSCSI_PNP_REQUEST_BLOCK Srb
> -    )
> -{
> -    switch (Srb->PnPAction) {
> -    case StorQueryCapabilities: {
> -        PSTOR_DEVICE_CAPABILITIES DeviceCaps = Srb->DataBuffer;
> -        PXENVBD_CAPS    Caps = FrontendGetCaps(Pdo->Frontend);
> -
> -        if (Caps->Removable)
> -            DeviceCaps->Removable = 1;
> -        if (Caps->Removable)
> -            DeviceCaps->EjectSupported = 1;
> -        if (Caps->SurpriseRemovable)
> -            DeviceCaps->SurpriseRemovalOK = 1;
> -
> -        DeviceCaps->UniqueID = 1;
> -
> -        } break;
> -
> -    default:
> -        break;
> -    }
> -}
> -
> 
> //=========================================================
> ====================
>  // PnP Handler
>  static FORCEINLINE VOID
> diff --git a/src/xenvbd/pdo.h b/src/xenvbd/pdo.h
> index fbd6681..1211174 100644
> --- a/src/xenvbd/pdo.h
> +++ b/src/xenvbd/pdo.h
> @@ -212,12 +212,6 @@ PdoStartIo(
>      __in PSCSI_REQUEST_BLOCK     Srb
>      );
> 
> -extern VOID
> -PdoSrbPnp(
> -    __in PXENVBD_PDO             Pdo,
> -    __in PSCSI_PNP_REQUEST_BLOCK Srb
> -    );
> -
>  // PnP Handler
>  __checkReturn
>  extern NTSTATUS
> --
> 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

_______________________________________________
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 Oct 30 13:54:25 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 13:54:25 +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 1ZsA8O-0008PN-NK; Fri, 30 Oct 2015 13:54:24 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=738f7cb72=Paul.Durrant@citrix.com>)
	id 1ZsA8N-0008PI-TD
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 13:54:24 +0000
Received: from [85.158.139.211] by server-15.bemta-5.messagelabs.com id
	4F/9C-16870-F8673365; Fri, 30 Oct 2015 13:54:23 +0000
X-Env-Sender: prvs=738f7cb72=Paul.Durrant@citrix.com
X-Msg-Ref: server-6.tower-206.messagelabs.com!1446213262!46445867!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17951 invoked from network); 30 Oct 2015 13:54:22 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-6.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2015 13:54:22 -0000
X-IronPort-AV: E=Sophos;i="5.20,218,1444694400"; 
   d="scan'208";a="6565421"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 4/8] Remove PdoPnpSrb,	since StorPort
	doesn't call for targets
Thread-Index: AQHREKjx0bLdp5j9d0afmgABsEA5Bp6EE4Dw
Date: Fri, 30 Oct 2015 13:54:22 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6411AA@AMSPEX01CL01.citrite.net>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
	<1445944546-21500-5-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1445944546-21500-5-git-send-email-owen.smith@citrix.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
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 4/8] Remove PdoPnpSrb,
 since StorPort doesn't call for targets
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 Owen Smith
> Sent: 27 October 2015 11:16
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 4/8] Remove PdoPnpSrb, since StorPort
> doesn't call for targets
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>
> ---
>  src/xenvbd/fdo.c | 18 ------------------
>  src/xenvbd/pdo.c | 27 ---------------------------
>  src/xenvbd/pdo.h |  6 ------
>  3 files changed, 51 deletions(-)
> 
> diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
> index 724d8ea..593875e 100644
> --- a/src/xenvbd/fdo.c
> +++ b/src/xenvbd/fdo.c
> @@ -1565,23 +1565,6 @@ FdoFindAdapter(
>      return SP_RETURN_FOUND;
>  }
> 
> -static FORCEINLINE VOID
> -__FdoSrbPnp(
> -    __in PXENVBD_FDO                 Fdo,
> -    __in PSCSI_PNP_REQUEST_BLOCK     Srb
> -    )
> -{
> -    if (!(Srb->SrbPnPFlags & SRB_PNP_FLAGS_ADAPTER_REQUEST)) {
> -        PXENVBD_PDO     Pdo;
> -
> -        Pdo = __FdoGetPdo(Fdo, Srb->TargetId);
> -        if (Pdo) {
> -            PdoSrbPnp(Pdo, Srb);
> -            PdoDereference(Pdo);
> -        }
> -    }
> -}
> -
>  BOOLEAN
>  FdoBuildIo(
>      __in PXENVBD_FDO                 Fdo,
> @@ -1600,7 +1583,6 @@ FdoBuildIo(
> 
>          // dont pass to StartIo
>      case SRB_FUNCTION_PNP:
> -        __FdoSrbPnp(Fdo, (PSCSI_PNP_REQUEST_BLOCK)Srb);
>          Srb->SrbStatus = SRB_STATUS_SUCCESS;
>          break;

I think this whole case should go then. I'll make that change, so...

Acked-by: Paul Durrant <paul.durrant@citrix.com>

>      case SRB_FUNCTION_ABORT_COMMAND:
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index c0447db..172fa67 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -2210,33 +2210,6 @@ PdoStartIo(
>      }
>  }
> 
> -VOID
> -PdoSrbPnp(
> -    __in PXENVBD_PDO             Pdo,
> -    __in PSCSI_PNP_REQUEST_BLOCK Srb
> -    )
> -{
> -    switch (Srb->PnPAction) {
> -    case StorQueryCapabilities: {
> -        PSTOR_DEVICE_CAPABILITIES DeviceCaps = Srb->DataBuffer;
> -        PXENVBD_CAPS    Caps = FrontendGetCaps(Pdo->Frontend);
> -
> -        if (Caps->Removable)
> -            DeviceCaps->Removable = 1;
> -        if (Caps->Removable)
> -            DeviceCaps->EjectSupported = 1;
> -        if (Caps->SurpriseRemovable)
> -            DeviceCaps->SurpriseRemovalOK = 1;
> -
> -        DeviceCaps->UniqueID = 1;
> -
> -        } break;
> -
> -    default:
> -        break;
> -    }
> -}
> -
> 
> //=========================================================
> ====================
>  // PnP Handler
>  static FORCEINLINE VOID
> diff --git a/src/xenvbd/pdo.h b/src/xenvbd/pdo.h
> index fbd6681..1211174 100644
> --- a/src/xenvbd/pdo.h
> +++ b/src/xenvbd/pdo.h
> @@ -212,12 +212,6 @@ PdoStartIo(
>      __in PSCSI_REQUEST_BLOCK     Srb
>      );
> 
> -extern VOID
> -PdoSrbPnp(
> -    __in PXENVBD_PDO             Pdo,
> -    __in PSCSI_PNP_REQUEST_BLOCK Srb
> -    );
> -
>  // PnP Handler
>  __checkReturn
>  extern NTSTATUS
> --
> 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

_______________________________________________
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 Oct 30 13:58:00 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 13:58:00 +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 1ZsABs-0008V4-0a; Fri, 30 Oct 2015 13:58:00 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=738f7cb72=Paul.Durrant@citrix.com>)
	id 1ZsABq-0008Uz-LQ
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 13:57:58 +0000
Received: from [193.109.254.147] by server-12.bemta-14.messagelabs.com id
	3C/45-18744-56773365; Fri, 30 Oct 2015 13:57:57 +0000
X-Env-Sender: prvs=738f7cb72=Paul.Durrant@citrix.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1446213476!24100343!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12468 invoked from network); 30 Oct 2015 13:57:57 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2015 13:57:57 -0000
X-IronPort-AV: E=Sophos;i="5.20,218,1444694400"; 
   d="scan'208";a="6565804"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 5/8] Refactor - move more functions
Thread-Index: AQHREKjlYDx5H7jPe0qx9cSeqMpROJ6EFKqQ
Date: Fri, 30 Oct 2015 13:57:55 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6411C6@AMSPEX01CL01.citrite.net>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
	<1445944546-21500-6-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1445944546-21500-6-git-send-email-owen.smith@citrix.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
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 5/8] Refactor - move more functions
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 Owen Smith
> Sent: 27 October 2015 11:16
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 5/8] Refactor - move more functions
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xenvbd/pdo.c | 120 +++++++++++++++++++++++++++---------------------
> -------
>  1 file changed, 60 insertions(+), 60 deletions(-)
> 
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index 172fa67..4e88302 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -2077,66 +2077,6 @@ __PdoReset(
>      return TRUE;
>  }
> 
> -static FORCEINLINE VOID
> -__PdoCleanupSubmittedReqs(
> -    IN  PXENVBD_PDO             Pdo
> -    )
> -{
> -    // Fail PreparedReqs
> -    for (;;) {
> -        PXENVBD_SRBEXT  SrbExt;
> -        PXENVBD_REQUEST Request;
> -        PLIST_ENTRY     Entry = QueuePop(&Pdo->SubmittedReqs);
> -        if (Entry == NULL)
> -            break;
> -        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> -        SrbExt = GetSrbExt(Request->Srb);
> -
> -        Verbose("Target[%d] : SubmittedReq 0x%p -> FAILED\n",
> PdoGetTargetId(Pdo), Request);
> -
> -        RequestCleanup(Pdo, Request);
> -        __LookasideFree(&Pdo->RequestList, Request);
> -
> -        if (InterlockedDecrement(&SrbExt->Count) == 0) {
> -            SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
> -            SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
> -            FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
> -        }
> -    }
> -}
> -
> -VOID
> -PdoReset(
> -    __in PXENVBD_PDO             Pdo
> -    )
> -{
> -    NTSTATUS        Status;
> -
> -    Trace("Target[%d] ====> (Irql=%d)\n", PdoGetTargetId(Pdo),
> KeGetCurrentIrql());
> -
> -    __PdoPauseDataPath(Pdo, TRUE);
> -
> -    if (QueueCount(&Pdo->SubmittedReqs)) {
> -        Error("Target[%d] : backend has %u outstanding requests after a
> PdoReset\n",
> -                PdoGetTargetId(Pdo), QueueCount(&Pdo->SubmittedReqs));
> -    }
> -
> -    Status = FrontendSetState(Pdo->Frontend, XENVBD_CLOSING);
> -    ASSERT(NT_SUCCESS(Status));
> -
> -    __PdoCleanupSubmittedReqs(Pdo);
> -
> -    Status = FrontendSetState(Pdo->Frontend, XENVBD_CLOSED);
> -    ASSERT(NT_SUCCESS(Status));
> -
> -    Status = FrontendSetState(Pdo->Frontend, XENVBD_ENABLED);
> -    ASSERT(NT_SUCCESS(Status));
> -
> -    __PdoUnpauseDataPath(Pdo);
> -
> -    Trace("Target[%d] <==== (Irql=%d)\n", PdoGetTargetId(Pdo),
> KeGetCurrentIrql());
> -}
> -
>  __checkReturn
>  static FORCEINLINE BOOLEAN
>  __ValidateSrbForPdo(
> @@ -2210,6 +2150,66 @@ PdoStartIo(
>      }
>  }
> 
> +static FORCEINLINE VOID
> +__PdoCleanupSubmittedReqs(
> +    IN  PXENVBD_PDO             Pdo
> +    )
> +{
> +    // Fail PreparedReqs
> +    for (;;) {
> +        PXENVBD_SRBEXT  SrbExt;
> +        PXENVBD_REQUEST Request;
> +        PLIST_ENTRY     Entry = QueuePop(&Pdo->SubmittedReqs);
> +        if (Entry == NULL)
> +            break;
> +        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> +        SrbExt = GetSrbExt(Request->Srb);
> +
> +        Verbose("Target[%d] : SubmittedReq 0x%p -> FAILED\n",
> PdoGetTargetId(Pdo), Request);
> +
> +        RequestCleanup(Pdo, Request);
> +        __LookasideFree(&Pdo->RequestList, Request);
> +
> +        if (InterlockedDecrement(&SrbExt->Count) == 0) {
> +            SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
> +            SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
> +            FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
> +        }
> +    }
> +}
> +
> +VOID
> +PdoReset(
> +    __in PXENVBD_PDO             Pdo
> +    )
> +{
> +    NTSTATUS        Status;
> +
> +    Trace("Target[%d] ====> (Irql=%d)\n", PdoGetTargetId(Pdo),
> KeGetCurrentIrql());
> +
> +    __PdoPauseDataPath(Pdo, TRUE);
> +
> +    if (QueueCount(&Pdo->SubmittedReqs)) {
> +        Error("Target[%d] : backend has %u outstanding requests after a
> PdoReset\n",
> +                PdoGetTargetId(Pdo), QueueCount(&Pdo->SubmittedReqs));
> +    }
> +
> +    Status = FrontendSetState(Pdo->Frontend, XENVBD_CLOSING);
> +    ASSERT(NT_SUCCESS(Status));
> +
> +    __PdoCleanupSubmittedReqs(Pdo);
> +
> +    Status = FrontendSetState(Pdo->Frontend, XENVBD_CLOSED);
> +    ASSERT(NT_SUCCESS(Status));
> +
> +    Status = FrontendSetState(Pdo->Frontend, XENVBD_ENABLED);
> +    ASSERT(NT_SUCCESS(Status));
> +
> +    __PdoUnpauseDataPath(Pdo);
> +
> +    Trace("Target[%d] <==== (Irql=%d)\n", PdoGetTargetId(Pdo),
> KeGetCurrentIrql());
> +}
> +
> 
> //=========================================================
> ====================
>  // PnP Handler
>  static FORCEINLINE VOID
> --
> 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

_______________________________________________
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 Oct 30 13:58:00 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 13:58:00 +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 1ZsABs-0008V4-0a; Fri, 30 Oct 2015 13:58:00 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=738f7cb72=Paul.Durrant@citrix.com>)
	id 1ZsABq-0008Uz-LQ
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 13:57:58 +0000
Received: from [193.109.254.147] by server-12.bemta-14.messagelabs.com id
	3C/45-18744-56773365; Fri, 30 Oct 2015 13:57:57 +0000
X-Env-Sender: prvs=738f7cb72=Paul.Durrant@citrix.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1446213476!24100343!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12468 invoked from network); 30 Oct 2015 13:57:57 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2015 13:57:57 -0000
X-IronPort-AV: E=Sophos;i="5.20,218,1444694400"; 
   d="scan'208";a="6565804"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 5/8] Refactor - move more functions
Thread-Index: AQHREKjlYDx5H7jPe0qx9cSeqMpROJ6EFKqQ
Date: Fri, 30 Oct 2015 13:57:55 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6411C6@AMSPEX01CL01.citrite.net>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
	<1445944546-21500-6-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1445944546-21500-6-git-send-email-owen.smith@citrix.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
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 5/8] Refactor - move more functions
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 Owen Smith
> Sent: 27 October 2015 11:16
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 5/8] Refactor - move more functions
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xenvbd/pdo.c | 120 +++++++++++++++++++++++++++---------------------
> -------
>  1 file changed, 60 insertions(+), 60 deletions(-)
> 
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index 172fa67..4e88302 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -2077,66 +2077,6 @@ __PdoReset(
>      return TRUE;
>  }
> 
> -static FORCEINLINE VOID
> -__PdoCleanupSubmittedReqs(
> -    IN  PXENVBD_PDO             Pdo
> -    )
> -{
> -    // Fail PreparedReqs
> -    for (;;) {
> -        PXENVBD_SRBEXT  SrbExt;
> -        PXENVBD_REQUEST Request;
> -        PLIST_ENTRY     Entry = QueuePop(&Pdo->SubmittedReqs);
> -        if (Entry == NULL)
> -            break;
> -        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> -        SrbExt = GetSrbExt(Request->Srb);
> -
> -        Verbose("Target[%d] : SubmittedReq 0x%p -> FAILED\n",
> PdoGetTargetId(Pdo), Request);
> -
> -        RequestCleanup(Pdo, Request);
> -        __LookasideFree(&Pdo->RequestList, Request);
> -
> -        if (InterlockedDecrement(&SrbExt->Count) == 0) {
> -            SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
> -            SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
> -            FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
> -        }
> -    }
> -}
> -
> -VOID
> -PdoReset(
> -    __in PXENVBD_PDO             Pdo
> -    )
> -{
> -    NTSTATUS        Status;
> -
> -    Trace("Target[%d] ====> (Irql=%d)\n", PdoGetTargetId(Pdo),
> KeGetCurrentIrql());
> -
> -    __PdoPauseDataPath(Pdo, TRUE);
> -
> -    if (QueueCount(&Pdo->SubmittedReqs)) {
> -        Error("Target[%d] : backend has %u outstanding requests after a
> PdoReset\n",
> -                PdoGetTargetId(Pdo), QueueCount(&Pdo->SubmittedReqs));
> -    }
> -
> -    Status = FrontendSetState(Pdo->Frontend, XENVBD_CLOSING);
> -    ASSERT(NT_SUCCESS(Status));
> -
> -    __PdoCleanupSubmittedReqs(Pdo);
> -
> -    Status = FrontendSetState(Pdo->Frontend, XENVBD_CLOSED);
> -    ASSERT(NT_SUCCESS(Status));
> -
> -    Status = FrontendSetState(Pdo->Frontend, XENVBD_ENABLED);
> -    ASSERT(NT_SUCCESS(Status));
> -
> -    __PdoUnpauseDataPath(Pdo);
> -
> -    Trace("Target[%d] <==== (Irql=%d)\n", PdoGetTargetId(Pdo),
> KeGetCurrentIrql());
> -}
> -
>  __checkReturn
>  static FORCEINLINE BOOLEAN
>  __ValidateSrbForPdo(
> @@ -2210,6 +2150,66 @@ PdoStartIo(
>      }
>  }
> 
> +static FORCEINLINE VOID
> +__PdoCleanupSubmittedReqs(
> +    IN  PXENVBD_PDO             Pdo
> +    )
> +{
> +    // Fail PreparedReqs
> +    for (;;) {
> +        PXENVBD_SRBEXT  SrbExt;
> +        PXENVBD_REQUEST Request;
> +        PLIST_ENTRY     Entry = QueuePop(&Pdo->SubmittedReqs);
> +        if (Entry == NULL)
> +            break;
> +        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> +        SrbExt = GetSrbExt(Request->Srb);
> +
> +        Verbose("Target[%d] : SubmittedReq 0x%p -> FAILED\n",
> PdoGetTargetId(Pdo), Request);
> +
> +        RequestCleanup(Pdo, Request);
> +        __LookasideFree(&Pdo->RequestList, Request);
> +
> +        if (InterlockedDecrement(&SrbExt->Count) == 0) {
> +            SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
> +            SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
> +            FdoCompleteSrb(PdoGetFdo(Pdo), SrbExt->Srb);
> +        }
> +    }
> +}
> +
> +VOID
> +PdoReset(
> +    __in PXENVBD_PDO             Pdo
> +    )
> +{
> +    NTSTATUS        Status;
> +
> +    Trace("Target[%d] ====> (Irql=%d)\n", PdoGetTargetId(Pdo),
> KeGetCurrentIrql());
> +
> +    __PdoPauseDataPath(Pdo, TRUE);
> +
> +    if (QueueCount(&Pdo->SubmittedReqs)) {
> +        Error("Target[%d] : backend has %u outstanding requests after a
> PdoReset\n",
> +                PdoGetTargetId(Pdo), QueueCount(&Pdo->SubmittedReqs));
> +    }
> +
> +    Status = FrontendSetState(Pdo->Frontend, XENVBD_CLOSING);
> +    ASSERT(NT_SUCCESS(Status));
> +
> +    __PdoCleanupSubmittedReqs(Pdo);
> +
> +    Status = FrontendSetState(Pdo->Frontend, XENVBD_CLOSED);
> +    ASSERT(NT_SUCCESS(Status));
> +
> +    Status = FrontendSetState(Pdo->Frontend, XENVBD_ENABLED);
> +    ASSERT(NT_SUCCESS(Status));
> +
> +    __PdoUnpauseDataPath(Pdo);
> +
> +    Trace("Target[%d] <==== (Irql=%d)\n", PdoGetTargetId(Pdo),
> KeGetCurrentIrql());
> +}
> +
> 
> //=========================================================
> ====================
>  // PnP Handler
>  static FORCEINLINE VOID
> --
> 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

_______________________________________________
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 Oct 30 14:02:00 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 14:02:00 +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 1ZsAFk-00008M-AY; Fri, 30 Oct 2015 14:02:00 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=738f7cb72=Paul.Durrant@citrix.com>)
	id 1ZsAFi-00008H-Qp
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 14:01:59 +0000
Received: from [85.158.137.68] by server-16.bemta-3.messagelabs.com id
	6B/54-03763-55873365; Fri, 30 Oct 2015 14:01:57 +0000
X-Env-Sender: prvs=738f7cb72=Paul.Durrant@citrix.com
X-Msg-Ref: server-6.tower-31.messagelabs.com!1446213709!8898431!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12633 invoked from network); 30 Oct 2015 14:01:49 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-6.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2015 14:01:49 -0000
X-IronPort-AV: E=Sophos;i="5.20,218,1444694400"; 
   d="scan'208";a="6566175"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 6/8] Prepare calls only need to return
	success/failure, not an error code
Thread-Index: AQHREKjmnx+w7S1ECkOLZxhc0/6HHp6EFaZw
Date: Fri, 30 Oct 2015 14:01:23 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6411FA@AMSPEX01CL01.citrite.net>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
	<1445944546-21500-7-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1445944546-21500-7-git-send-email-owen.smith@citrix.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
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 6/8] Prepare calls only need to
	return	success/failure, not an error 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>
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 Owen Smith
> Sent: 27 October 2015 11:16
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 6/8] Prepare calls only need to return
> success/failure, not an error code
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xenvbd/pdo.c | 260 ++++++++++++++++++++++++++----------------------
> -------
>  1 file changed, 124 insertions(+), 136 deletions(-)
> 
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index 4e88302..5023a93 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -869,7 +869,7 @@ RequestCopyOutput(
>      }
>  }
> 
> -static NTSTATUS
> +static BOOLEAN
>  PrepareSegment(
>      IN  PXENVBD_PDO             Pdo,
>      IN  PXENVBD_SEGMENT         Segment,
> @@ -880,7 +880,7 @@ PrepareSegment(
>      )
>  {
>      PFN_NUMBER      Pfn;
> -    NTSTATUS        Status = STATUS_UNSUCCESSFUL;
> +    NTSTATUS        Status;
>      PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
>      const ULONG     SectorSize = PdoSectorSize(Pdo);
>      const ULONG     SectorsPerPage = __SectorsPerPage(SectorSize);
> @@ -908,13 +908,13 @@ PrepareSegment(
>          // map SGList to Virtual Address. Populates Segment->Buffer and
> Segment->Length
>          if (!MapSegmentBuffer(Pdo, Segment, SGList, SectorSize,
> *SectorsNow)) {
>              ++Pdo->FailedMaps;
> -            goto fail;
> +            goto fail1;
>          }
> 
>          // get a buffer
>          if (!BufferGet(Segment, &Segment->BufferId, &Pfn)) {
>              ++Pdo->FailedBounces;
> -            goto fail;
> +            goto fail2;
>          }
> 
>          // copy contents in
> @@ -927,16 +927,18 @@ PrepareSegment(
>      Status = GranterGet(Granter, Pfn, ReadOnly, &Segment->Grant);
>      if (!NT_SUCCESS(Status)) {
>          ++Pdo->FailedGrants;
> -        goto fail;
> +        goto fail3;
>      }
> 
> -    return STATUS_SUCCESS;
> +    return TRUE;
> 
> -fail:
> -    return Status;
> +fail3:
> +fail2:
> +fail1:
> +    return FALSE;
>  }
> 
> -static NTSTATUS
> +static BOOLEAN
>  PrepareBlkifReadWrite(
>      IN  PXENVBD_PDO             Pdo,
>      IN  PXENVBD_REQUEST         Request,
> @@ -947,7 +949,6 @@ PrepareBlkifReadWrite(
>      OUT PULONG                  SectorsDone
>      )
>  {
> -    NTSTATUS        Status;
>      UCHAR           Operation;
>      BOOLEAN         ReadOnly;
>      ULONG           Index;
> @@ -965,20 +966,18 @@ PrepareBlkifReadWrite(
>          ULONG           SectorsNow;
> 
>          Segment = __LookasideAlloc(&Pdo->SegmentList);
> -        Status = STATUS_NO_MEMORY;
>          if (Segment == NULL)
>              goto fail1;
> 
>          InsertTailList(&Request->Segments, &Segment->Entry);
>          ++Request->NrSegments;
> 
> -        Status = PrepareSegment(Pdo,
> -                                Segment,
> -                                SGList,
> -                                ReadOnly,
> -                                SectorsLeft,
> -                                &SectorsNow);
> -        if (!NT_SUCCESS(Status))
> +        if (!PrepareSegment(Pdo,
> +                            Segment,
> +                            SGList,
> +                            ReadOnly,
> +                            SectorsLeft,
> +                            &SectorsNow))
>              goto fail2;
> 
>          *SectorsDone += SectorsNow;
> @@ -987,14 +986,14 @@ PrepareBlkifReadWrite(
>      ASSERT3U(Request->NrSegments, >, 0);
>      ASSERT3U(Request->NrSegments, <=, MaxSegments);
> 
> -    return STATUS_SUCCESS;
> +    return TRUE;
> 
>  fail2:
>  fail1:
> -    return Status;
> +    return FALSE;
>  }
> 
> -static NTSTATUS
> +static BOOLEAN
>  PrepareBlkifIndirect(
>      IN  PXENVBD_PDO             Pdo,
>      IN  PXENVBD_REQUEST         Request
> @@ -1010,8 +1009,6 @@ PrepareBlkifIndirect(
>              NrSegments < Request->NrSegments;
>                  ++Index) {
>          Request->Pages[Index] = __LookasideAlloc(&Pdo->IndirectList);
> -
> -        status = STATUS_NO_MEMORY;
>          if (Request->Pages[Index] == NULL)
>              goto fail1;
> 
> @@ -1025,11 +1022,11 @@ PrepareBlkifIndirect(
>          NrSegments += XENVBD_MAX_SEGMENTS_PER_PAGE;
>      }
> 
> -    return STATUS_SUCCESS;
> +    return TRUE;
> 
>  fail2:
>  fail1:
> -    return status;
> +    return FALSE;
>  }
> 
>  static FORCEINLINE ULONG
> @@ -1050,130 +1047,148 @@ UseIndirect(
>      return MaxIndirectSegs;
>  }
> 
> +static FORCEINLINE ULONG
> +PdoQueueRequestList(
> +    IN  PXENVBD_PDO     Pdo,
> +    IN  PLIST_ENTRY     List
> +    )
> +{
> +    ULONG               Count = 0;
> +    for (;;) {
> +        PXENVBD_REQUEST Request;
> +        PLIST_ENTRY     Entry;
> +
> +        Entry = RemoveHeadList(List);
> +        if (Entry == List)
> +            break;
> +
> +        ++Count;
> +        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> +        __PdoIncBlkifOpCount(Pdo, Request);
> +        QueueAppend(&Pdo->PreparedReqs, &Request->Entry);
> +    }
> +    return Count;
> +}
> +
> +static FORCEINLINE VOID
> +PdoCancelRequestList(
> +    IN  PXENVBD_PDO     Pdo,
> +    IN  PLIST_ENTRY     List
> +    )
> +{
> +    for (;;) {
> +        PXENVBD_REQUEST Request;
> +        PLIST_ENTRY     Entry;
> +
> +        Entry = RemoveHeadList(List);
> +        if (Entry == List)
> +            break;
> +
> +        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> +        __LookasideFree(&Pdo->RequestList, Request);
> +    }
> +}
> +
>  __checkReturn
> -static NTSTATUS
> +static BOOLEAN
>  PrepareReadWrite(
>      __in PXENVBD_PDO             Pdo,
>      __in PSCSI_REQUEST_BLOCK     Srb
>      )
>  {
> -    NTSTATUS        Status;
> -    LIST_ENTRY      ReqList;
> -    XENVBD_SG_LIST  SGList;
>      PXENVBD_SRBEXT  SrbExt = GetSrbExt(Srb);
>      ULONG64         SectorStart = Cdb_LogicalBlock(Srb);
>      ULONG           SectorsLeft = Cdb_TransferBlock(Srb);
> +    LIST_ENTRY      List;
> +    XENVBD_SG_LIST  SGList;
> 
> -    InitializeListHead(&ReqList);
> -    RtlZeroMemory(&SGList, sizeof(SGList));
> -    SGList.SGList = StorPortGetScatterGatherList(PdoGetFdo(Pdo), Srb);
> -
> +    InitializeListHead(&List);
>      SrbExt->Count = 0;
> -    // mark the SRB as pending, completion will check for pending to detect
> failures
>      Srb->SrbStatus = SRB_STATUS_PENDING;
> 
> +    RtlZeroMemory(&SGList, sizeof(SGList));
> +    SGList.SGList = StorPortGetScatterGatherList(PdoGetFdo(Pdo), Srb);
> +
>      while (SectorsLeft > 0) {
>          ULONG           MaxSegments;
>          ULONG           SectorsDone = 0;
> -        PXENVBD_REQUEST Request = __LookasideAlloc(&Pdo->RequestList);
> +        PXENVBD_REQUEST Request;
> 
> -        Status = STATUS_NO_MEMORY;
> +        Request = __LookasideAlloc(&Pdo->RequestList);
>          if (Request == NULL)
> -            goto fail;
> +            goto fail1;
> +        InsertTailList(&List, &Request->Entry);
> 
>          Request->Srb    = Srb;
>          Request->Id     = PdoGetTag(Pdo);
>          InitializeListHead(&Request->Segments);
> -        InsertTailList(&ReqList, &Request->Entry);
> 
>          MaxSegments = UseIndirect(Pdo, SectorsLeft);
> 
> -        Status = PrepareBlkifReadWrite(Pdo,
> -                                       Request,
> -                                       &SGList,
> -                                       MaxSegments,
> -                                       SectorStart,
> -                                       SectorsLeft,
> -                                       &SectorsDone);
> -        if (!NT_SUCCESS(Status))
> -            goto fail;
> +        if (!PrepareBlkifReadWrite(Pdo,
> +                                   Request,
> +                                   &SGList,
> +                                   MaxSegments,
> +                                   SectorStart,
> +                                   SectorsLeft,
> +                                   &SectorsDone))
> +            goto fail2;
> 
>          if (MaxSegments > BLKIF_MAX_SEGMENTS_PER_REQUEST) {
> -            Status = PrepareBlkifIndirect(Pdo,
> -                                          Request);
> -            if (!NT_SUCCESS(Status))
> -                goto fail;
> +            if (!PrepareBlkifIndirect(Pdo, Request))
> +                goto fail3;
>          }
> 
>          SectorsLeft -= SectorsDone;
>          SectorStart += SectorsDone;
>      }
> 
> -    // completed preparing SRB, move requests to pending queue
> -    for (;;) {
> -        PXENVBD_REQUEST Request;
> -        PLIST_ENTRY     Entry;
> -
> -        Entry = RemoveHeadList(&ReqList);
> -        if (Entry == &ReqList)
> -            break;
> -
> -        ++SrbExt->Count;
> -        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> -
> -        __PdoIncBlkifOpCount(Pdo, Request);
> -        QueueAppend(&Pdo->PreparedReqs, Entry);
> -    }
> -    return STATUS_SUCCESS;
> -
> -fail:
> -    for (;;) {
> -        PXENVBD_REQUEST Request;
> -        PLIST_ENTRY     Entry;
> -
> -        Entry = RemoveHeadList(&ReqList);
> -        if (Entry == &ReqList)
> -            break;
> -
> -        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> +    SrbExt->Count = PdoQueueRequestList(Pdo, &List);
> +    return TRUE;
> 
> -        RequestCleanup(Pdo, Request);
> -        __LookasideFree(&Pdo->RequestList, Request);
> -    }
> -    ASSERT3S(SrbExt->Count, ==, 0);
> -    ASSERT(!NT_SUCCESS(Status));
> -    return Status;
> +fail3:
> +fail2:
> +fail1:
> +    PdoCancelRequestList(Pdo, &List);
> +    return FALSE;
>  }
> 
>  __checkReturn
> -static NTSTATUS
> +static BOOLEAN
>  PrepareSyncCache(
>      __in PXENVBD_PDO             Pdo,
>      __in PSCSI_REQUEST_BLOCK     Srb
>      )
>  {
> -    PXENVBD_SRBEXT  SrbExt = GetSrbExt(Srb);
> -    PXENVBD_REQUEST Request = __LookasideAlloc(&Pdo->RequestList);
> -    if (Request == NULL)
> -        return STATUS_UNSUCCESSFUL;
> +    PXENVBD_SRBEXT      SrbExt = GetSrbExt(Srb);
> +    PXENVBD_REQUEST     Request;
> +    LIST_ENTRY          List;
> 
> -    SrbExt->Count = 1;
> -    // mark the SRB as pending, completion will check for pending to detect
> failures
> +    InitializeListHead(&List);
> +    SrbExt->Count = 0;
>      Srb->SrbStatus = SRB_STATUS_PENDING;
> 
> +    Request = __LookasideAlloc(&Pdo->RequestList);
> +    if (Request == NULL)
> +        goto fail1;
> +    InsertTailList(&List, &Request->Entry);
> +
>      Request->Srb        = Srb;
>      Request->Id         = PdoGetTag(Pdo);
>      Request->Operation  = BLKIF_OP_WRITE_BARRIER;
>      Request->FirstSector = Cdb_LogicalBlock(Srb);
>      InitializeListHead(&Request->Segments);
> 
> -    __PdoIncBlkifOpCount(Pdo, Request);
> -    QueueAppend(&Pdo->PreparedReqs, &Request->Entry);
> -    return STATUS_SUCCESS;
> +    SrbExt->Count = PdoQueueRequestList(Pdo, &List);
> +    return TRUE;
> +
> +fail1:
> +    PdoCancelRequestList(Pdo, &List);
> +    return FALSE;
>  }
> 
>  __checkReturn
> -static NTSTATUS
> +static BOOLEAN
>  PrepareUnmap(
>      __in PXENVBD_PDO             Pdo,
>      __in PSCSI_REQUEST_BLOCK     Srb
> @@ -1192,11 +1207,11 @@ PrepareUnmap(
> 
>      for (Index = 0; Index < Count; ++Index) {
>          PUNMAP_BLOCK_DESCRIPTOR Descr = &Unmap->Descriptors[Index];
> -        PXENVBD_REQUEST         Request = __LookasideAlloc(&Pdo-
> >RequestList);
> +        PXENVBD_REQUEST         Request;
> +
> +        Request = __LookasideAlloc(&Pdo->RequestList);
>          if (Request == NULL)
>              goto fail1;
> -
> -        ++SrbExt->Count;
>          InsertTailList(&List, &Request->Entry);
> 
>          Request->Srb            = Srb;
> @@ -1208,36 +1223,12 @@ PrepareUnmap(
>          InitializeListHead(&Request->Segments);
>      }
> 
> -    for (;;) {
> -        PXENVBD_REQUEST Request;
> -        PLIST_ENTRY     Entry;
> -
> -        Entry = RemoveHeadList(&List);
> -        if (Entry == &List)
> -            break;
> -
> -        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> -        __PdoIncBlkifOpCount(Pdo, Request);
> -        QueueAppend(&Pdo->PreparedReqs, &Request->Entry);
> -    }
> -
> -    return STATUS_SUCCESS;
> -
> +    SrbExt->Count = PdoQueueRequestList(Pdo, &List);
> +    return TRUE;
> 
>  fail1:
> -    for (;;) {
> -        PXENVBD_REQUEST Request;
> -        PLIST_ENTRY     Entry;
> -
> -        Entry = RemoveHeadList(&List);
> -        if (Entry == &List)
> -            break;
> -
> -        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> -        __LookasideFree(&Pdo->RequestList, Request);
> -        --SrbExt->Count;
> -    }
> -    return STATUS_NO_MEMORY;
> +    PdoCancelRequestList(Pdo, &List);
> +    return FALSE;
>  }
> 
> 
> //=========================================================
> ====================
> @@ -1329,10 +1320,9 @@ __PdoUnpauseDataPath(
> 
>  static FORCEINLINE BOOLEAN
>  PdoPrepareFresh(
> -    __in PXENVBD_PDO             Pdo
> +    IN  PXENVBD_PDO         Pdo
>      )
>  {
> -    NTSTATUS        Status;
>      PXENVBD_SRBEXT  SrbExt;
>      PLIST_ENTRY     Entry;
> 
> @@ -1345,23 +1335,21 @@ PdoPrepareFresh(
>      switch (Cdb_OperationEx(SrbExt->Srb)) {
>      case SCSIOP_READ:
>      case SCSIOP_WRITE:
> -        Status = PrepareReadWrite(Pdo, SrbExt->Srb);
> +        if (PrepareReadWrite(Pdo, SrbExt->Srb))
> +            return TRUE;    // prepared this SRB
>          break;
>      case SCSIOP_SYNCHRONIZE_CACHE:
> -        Status = PrepareSyncCache(Pdo, SrbExt->Srb);
> +        if (PrepareSyncCache(Pdo, SrbExt->Srb))
> +            return TRUE;    // prepared this SRB
>          break;
>      case SCSIOP_UNMAP:
> -        Status = PrepareUnmap(Pdo, SrbExt->Srb);
> +        if (PrepareUnmap(Pdo, SrbExt->Srb))
> +            return TRUE;    // prepared this SRB
>          break;
>      default:
>          ASSERT(FALSE);
> -        Status = STATUS_NOT_SUPPORTED;
>          break;
>      }
> -
> -    if (NT_SUCCESS(Status))
> -        return TRUE;    // prepared this SRB
> -
>      QueueUnPop(&Pdo->FreshSrbs, &SrbExt->Entry);
>      return FALSE;       // prepare failed
>  }
> --
> 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

_______________________________________________
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 Oct 30 14:02:00 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 14:02:00 +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 1ZsAFk-00008M-AY; Fri, 30 Oct 2015 14:02:00 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=738f7cb72=Paul.Durrant@citrix.com>)
	id 1ZsAFi-00008H-Qp
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 14:01:59 +0000
Received: from [85.158.137.68] by server-16.bemta-3.messagelabs.com id
	6B/54-03763-55873365; Fri, 30 Oct 2015 14:01:57 +0000
X-Env-Sender: prvs=738f7cb72=Paul.Durrant@citrix.com
X-Msg-Ref: server-6.tower-31.messagelabs.com!1446213709!8898431!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12633 invoked from network); 30 Oct 2015 14:01:49 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-6.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2015 14:01:49 -0000
X-IronPort-AV: E=Sophos;i="5.20,218,1444694400"; 
   d="scan'208";a="6566175"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 6/8] Prepare calls only need to return
	success/failure, not an error code
Thread-Index: AQHREKjmnx+w7S1ECkOLZxhc0/6HHp6EFaZw
Date: Fri, 30 Oct 2015 14:01:23 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6411FA@AMSPEX01CL01.citrite.net>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
	<1445944546-21500-7-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1445944546-21500-7-git-send-email-owen.smith@citrix.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
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 6/8] Prepare calls only need to
	return	success/failure, not an error 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>
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 Owen Smith
> Sent: 27 October 2015 11:16
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 6/8] Prepare calls only need to return
> success/failure, not an error code
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xenvbd/pdo.c | 260 ++++++++++++++++++++++++++----------------------
> -------
>  1 file changed, 124 insertions(+), 136 deletions(-)
> 
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index 4e88302..5023a93 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -869,7 +869,7 @@ RequestCopyOutput(
>      }
>  }
> 
> -static NTSTATUS
> +static BOOLEAN
>  PrepareSegment(
>      IN  PXENVBD_PDO             Pdo,
>      IN  PXENVBD_SEGMENT         Segment,
> @@ -880,7 +880,7 @@ PrepareSegment(
>      )
>  {
>      PFN_NUMBER      Pfn;
> -    NTSTATUS        Status = STATUS_UNSUCCESSFUL;
> +    NTSTATUS        Status;
>      PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
>      const ULONG     SectorSize = PdoSectorSize(Pdo);
>      const ULONG     SectorsPerPage = __SectorsPerPage(SectorSize);
> @@ -908,13 +908,13 @@ PrepareSegment(
>          // map SGList to Virtual Address. Populates Segment->Buffer and
> Segment->Length
>          if (!MapSegmentBuffer(Pdo, Segment, SGList, SectorSize,
> *SectorsNow)) {
>              ++Pdo->FailedMaps;
> -            goto fail;
> +            goto fail1;
>          }
> 
>          // get a buffer
>          if (!BufferGet(Segment, &Segment->BufferId, &Pfn)) {
>              ++Pdo->FailedBounces;
> -            goto fail;
> +            goto fail2;
>          }
> 
>          // copy contents in
> @@ -927,16 +927,18 @@ PrepareSegment(
>      Status = GranterGet(Granter, Pfn, ReadOnly, &Segment->Grant);
>      if (!NT_SUCCESS(Status)) {
>          ++Pdo->FailedGrants;
> -        goto fail;
> +        goto fail3;
>      }
> 
> -    return STATUS_SUCCESS;
> +    return TRUE;
> 
> -fail:
> -    return Status;
> +fail3:
> +fail2:
> +fail1:
> +    return FALSE;
>  }
> 
> -static NTSTATUS
> +static BOOLEAN
>  PrepareBlkifReadWrite(
>      IN  PXENVBD_PDO             Pdo,
>      IN  PXENVBD_REQUEST         Request,
> @@ -947,7 +949,6 @@ PrepareBlkifReadWrite(
>      OUT PULONG                  SectorsDone
>      )
>  {
> -    NTSTATUS        Status;
>      UCHAR           Operation;
>      BOOLEAN         ReadOnly;
>      ULONG           Index;
> @@ -965,20 +966,18 @@ PrepareBlkifReadWrite(
>          ULONG           SectorsNow;
> 
>          Segment = __LookasideAlloc(&Pdo->SegmentList);
> -        Status = STATUS_NO_MEMORY;
>          if (Segment == NULL)
>              goto fail1;
> 
>          InsertTailList(&Request->Segments, &Segment->Entry);
>          ++Request->NrSegments;
> 
> -        Status = PrepareSegment(Pdo,
> -                                Segment,
> -                                SGList,
> -                                ReadOnly,
> -                                SectorsLeft,
> -                                &SectorsNow);
> -        if (!NT_SUCCESS(Status))
> +        if (!PrepareSegment(Pdo,
> +                            Segment,
> +                            SGList,
> +                            ReadOnly,
> +                            SectorsLeft,
> +                            &SectorsNow))
>              goto fail2;
> 
>          *SectorsDone += SectorsNow;
> @@ -987,14 +986,14 @@ PrepareBlkifReadWrite(
>      ASSERT3U(Request->NrSegments, >, 0);
>      ASSERT3U(Request->NrSegments, <=, MaxSegments);
> 
> -    return STATUS_SUCCESS;
> +    return TRUE;
> 
>  fail2:
>  fail1:
> -    return Status;
> +    return FALSE;
>  }
> 
> -static NTSTATUS
> +static BOOLEAN
>  PrepareBlkifIndirect(
>      IN  PXENVBD_PDO             Pdo,
>      IN  PXENVBD_REQUEST         Request
> @@ -1010,8 +1009,6 @@ PrepareBlkifIndirect(
>              NrSegments < Request->NrSegments;
>                  ++Index) {
>          Request->Pages[Index] = __LookasideAlloc(&Pdo->IndirectList);
> -
> -        status = STATUS_NO_MEMORY;
>          if (Request->Pages[Index] == NULL)
>              goto fail1;
> 
> @@ -1025,11 +1022,11 @@ PrepareBlkifIndirect(
>          NrSegments += XENVBD_MAX_SEGMENTS_PER_PAGE;
>      }
> 
> -    return STATUS_SUCCESS;
> +    return TRUE;
> 
>  fail2:
>  fail1:
> -    return status;
> +    return FALSE;
>  }
> 
>  static FORCEINLINE ULONG
> @@ -1050,130 +1047,148 @@ UseIndirect(
>      return MaxIndirectSegs;
>  }
> 
> +static FORCEINLINE ULONG
> +PdoQueueRequestList(
> +    IN  PXENVBD_PDO     Pdo,
> +    IN  PLIST_ENTRY     List
> +    )
> +{
> +    ULONG               Count = 0;
> +    for (;;) {
> +        PXENVBD_REQUEST Request;
> +        PLIST_ENTRY     Entry;
> +
> +        Entry = RemoveHeadList(List);
> +        if (Entry == List)
> +            break;
> +
> +        ++Count;
> +        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> +        __PdoIncBlkifOpCount(Pdo, Request);
> +        QueueAppend(&Pdo->PreparedReqs, &Request->Entry);
> +    }
> +    return Count;
> +}
> +
> +static FORCEINLINE VOID
> +PdoCancelRequestList(
> +    IN  PXENVBD_PDO     Pdo,
> +    IN  PLIST_ENTRY     List
> +    )
> +{
> +    for (;;) {
> +        PXENVBD_REQUEST Request;
> +        PLIST_ENTRY     Entry;
> +
> +        Entry = RemoveHeadList(List);
> +        if (Entry == List)
> +            break;
> +
> +        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> +        __LookasideFree(&Pdo->RequestList, Request);
> +    }
> +}
> +
>  __checkReturn
> -static NTSTATUS
> +static BOOLEAN
>  PrepareReadWrite(
>      __in PXENVBD_PDO             Pdo,
>      __in PSCSI_REQUEST_BLOCK     Srb
>      )
>  {
> -    NTSTATUS        Status;
> -    LIST_ENTRY      ReqList;
> -    XENVBD_SG_LIST  SGList;
>      PXENVBD_SRBEXT  SrbExt = GetSrbExt(Srb);
>      ULONG64         SectorStart = Cdb_LogicalBlock(Srb);
>      ULONG           SectorsLeft = Cdb_TransferBlock(Srb);
> +    LIST_ENTRY      List;
> +    XENVBD_SG_LIST  SGList;
> 
> -    InitializeListHead(&ReqList);
> -    RtlZeroMemory(&SGList, sizeof(SGList));
> -    SGList.SGList = StorPortGetScatterGatherList(PdoGetFdo(Pdo), Srb);
> -
> +    InitializeListHead(&List);
>      SrbExt->Count = 0;
> -    // mark the SRB as pending, completion will check for pending to detect
> failures
>      Srb->SrbStatus = SRB_STATUS_PENDING;
> 
> +    RtlZeroMemory(&SGList, sizeof(SGList));
> +    SGList.SGList = StorPortGetScatterGatherList(PdoGetFdo(Pdo), Srb);
> +
>      while (SectorsLeft > 0) {
>          ULONG           MaxSegments;
>          ULONG           SectorsDone = 0;
> -        PXENVBD_REQUEST Request = __LookasideAlloc(&Pdo->RequestList);
> +        PXENVBD_REQUEST Request;
> 
> -        Status = STATUS_NO_MEMORY;
> +        Request = __LookasideAlloc(&Pdo->RequestList);
>          if (Request == NULL)
> -            goto fail;
> +            goto fail1;
> +        InsertTailList(&List, &Request->Entry);
> 
>          Request->Srb    = Srb;
>          Request->Id     = PdoGetTag(Pdo);
>          InitializeListHead(&Request->Segments);
> -        InsertTailList(&ReqList, &Request->Entry);
> 
>          MaxSegments = UseIndirect(Pdo, SectorsLeft);
> 
> -        Status = PrepareBlkifReadWrite(Pdo,
> -                                       Request,
> -                                       &SGList,
> -                                       MaxSegments,
> -                                       SectorStart,
> -                                       SectorsLeft,
> -                                       &SectorsDone);
> -        if (!NT_SUCCESS(Status))
> -            goto fail;
> +        if (!PrepareBlkifReadWrite(Pdo,
> +                                   Request,
> +                                   &SGList,
> +                                   MaxSegments,
> +                                   SectorStart,
> +                                   SectorsLeft,
> +                                   &SectorsDone))
> +            goto fail2;
> 
>          if (MaxSegments > BLKIF_MAX_SEGMENTS_PER_REQUEST) {
> -            Status = PrepareBlkifIndirect(Pdo,
> -                                          Request);
> -            if (!NT_SUCCESS(Status))
> -                goto fail;
> +            if (!PrepareBlkifIndirect(Pdo, Request))
> +                goto fail3;
>          }
> 
>          SectorsLeft -= SectorsDone;
>          SectorStart += SectorsDone;
>      }
> 
> -    // completed preparing SRB, move requests to pending queue
> -    for (;;) {
> -        PXENVBD_REQUEST Request;
> -        PLIST_ENTRY     Entry;
> -
> -        Entry = RemoveHeadList(&ReqList);
> -        if (Entry == &ReqList)
> -            break;
> -
> -        ++SrbExt->Count;
> -        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> -
> -        __PdoIncBlkifOpCount(Pdo, Request);
> -        QueueAppend(&Pdo->PreparedReqs, Entry);
> -    }
> -    return STATUS_SUCCESS;
> -
> -fail:
> -    for (;;) {
> -        PXENVBD_REQUEST Request;
> -        PLIST_ENTRY     Entry;
> -
> -        Entry = RemoveHeadList(&ReqList);
> -        if (Entry == &ReqList)
> -            break;
> -
> -        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> +    SrbExt->Count = PdoQueueRequestList(Pdo, &List);
> +    return TRUE;
> 
> -        RequestCleanup(Pdo, Request);
> -        __LookasideFree(&Pdo->RequestList, Request);
> -    }
> -    ASSERT3S(SrbExt->Count, ==, 0);
> -    ASSERT(!NT_SUCCESS(Status));
> -    return Status;
> +fail3:
> +fail2:
> +fail1:
> +    PdoCancelRequestList(Pdo, &List);
> +    return FALSE;
>  }
> 
>  __checkReturn
> -static NTSTATUS
> +static BOOLEAN
>  PrepareSyncCache(
>      __in PXENVBD_PDO             Pdo,
>      __in PSCSI_REQUEST_BLOCK     Srb
>      )
>  {
> -    PXENVBD_SRBEXT  SrbExt = GetSrbExt(Srb);
> -    PXENVBD_REQUEST Request = __LookasideAlloc(&Pdo->RequestList);
> -    if (Request == NULL)
> -        return STATUS_UNSUCCESSFUL;
> +    PXENVBD_SRBEXT      SrbExt = GetSrbExt(Srb);
> +    PXENVBD_REQUEST     Request;
> +    LIST_ENTRY          List;
> 
> -    SrbExt->Count = 1;
> -    // mark the SRB as pending, completion will check for pending to detect
> failures
> +    InitializeListHead(&List);
> +    SrbExt->Count = 0;
>      Srb->SrbStatus = SRB_STATUS_PENDING;
> 
> +    Request = __LookasideAlloc(&Pdo->RequestList);
> +    if (Request == NULL)
> +        goto fail1;
> +    InsertTailList(&List, &Request->Entry);
> +
>      Request->Srb        = Srb;
>      Request->Id         = PdoGetTag(Pdo);
>      Request->Operation  = BLKIF_OP_WRITE_BARRIER;
>      Request->FirstSector = Cdb_LogicalBlock(Srb);
>      InitializeListHead(&Request->Segments);
> 
> -    __PdoIncBlkifOpCount(Pdo, Request);
> -    QueueAppend(&Pdo->PreparedReqs, &Request->Entry);
> -    return STATUS_SUCCESS;
> +    SrbExt->Count = PdoQueueRequestList(Pdo, &List);
> +    return TRUE;
> +
> +fail1:
> +    PdoCancelRequestList(Pdo, &List);
> +    return FALSE;
>  }
> 
>  __checkReturn
> -static NTSTATUS
> +static BOOLEAN
>  PrepareUnmap(
>      __in PXENVBD_PDO             Pdo,
>      __in PSCSI_REQUEST_BLOCK     Srb
> @@ -1192,11 +1207,11 @@ PrepareUnmap(
> 
>      for (Index = 0; Index < Count; ++Index) {
>          PUNMAP_BLOCK_DESCRIPTOR Descr = &Unmap->Descriptors[Index];
> -        PXENVBD_REQUEST         Request = __LookasideAlloc(&Pdo-
> >RequestList);
> +        PXENVBD_REQUEST         Request;
> +
> +        Request = __LookasideAlloc(&Pdo->RequestList);
>          if (Request == NULL)
>              goto fail1;
> -
> -        ++SrbExt->Count;
>          InsertTailList(&List, &Request->Entry);
> 
>          Request->Srb            = Srb;
> @@ -1208,36 +1223,12 @@ PrepareUnmap(
>          InitializeListHead(&Request->Segments);
>      }
> 
> -    for (;;) {
> -        PXENVBD_REQUEST Request;
> -        PLIST_ENTRY     Entry;
> -
> -        Entry = RemoveHeadList(&List);
> -        if (Entry == &List)
> -            break;
> -
> -        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> -        __PdoIncBlkifOpCount(Pdo, Request);
> -        QueueAppend(&Pdo->PreparedReqs, &Request->Entry);
> -    }
> -
> -    return STATUS_SUCCESS;
> -
> +    SrbExt->Count = PdoQueueRequestList(Pdo, &List);
> +    return TRUE;
> 
>  fail1:
> -    for (;;) {
> -        PXENVBD_REQUEST Request;
> -        PLIST_ENTRY     Entry;
> -
> -        Entry = RemoveHeadList(&List);
> -        if (Entry == &List)
> -            break;
> -
> -        Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> -        __LookasideFree(&Pdo->RequestList, Request);
> -        --SrbExt->Count;
> -    }
> -    return STATUS_NO_MEMORY;
> +    PdoCancelRequestList(Pdo, &List);
> +    return FALSE;
>  }
> 
> 
> //=========================================================
> ====================
> @@ -1329,10 +1320,9 @@ __PdoUnpauseDataPath(
> 
>  static FORCEINLINE BOOLEAN
>  PdoPrepareFresh(
> -    __in PXENVBD_PDO             Pdo
> +    IN  PXENVBD_PDO         Pdo
>      )
>  {
> -    NTSTATUS        Status;
>      PXENVBD_SRBEXT  SrbExt;
>      PLIST_ENTRY     Entry;
> 
> @@ -1345,23 +1335,21 @@ PdoPrepareFresh(
>      switch (Cdb_OperationEx(SrbExt->Srb)) {
>      case SCSIOP_READ:
>      case SCSIOP_WRITE:
> -        Status = PrepareReadWrite(Pdo, SrbExt->Srb);
> +        if (PrepareReadWrite(Pdo, SrbExt->Srb))
> +            return TRUE;    // prepared this SRB
>          break;
>      case SCSIOP_SYNCHRONIZE_CACHE:
> -        Status = PrepareSyncCache(Pdo, SrbExt->Srb);
> +        if (PrepareSyncCache(Pdo, SrbExt->Srb))
> +            return TRUE;    // prepared this SRB
>          break;
>      case SCSIOP_UNMAP:
> -        Status = PrepareUnmap(Pdo, SrbExt->Srb);
> +        if (PrepareUnmap(Pdo, SrbExt->Srb))
> +            return TRUE;    // prepared this SRB
>          break;
>      default:
>          ASSERT(FALSE);
> -        Status = STATUS_NOT_SUPPORTED;
>          break;
>      }
> -
> -    if (NT_SUCCESS(Status))
> -        return TRUE;    // prepared this SRB
> -
>      QueueUnPop(&Pdo->FreshSrbs, &SrbExt->Entry);
>      return FALSE;       // prepare failed
>  }
> --
> 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

_______________________________________________
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 Oct 30 14:13:44 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 14:13: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 1ZsAR6-0000pk-5i; Fri, 30 Oct 2015 14:13:44 +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 1ZsAR4-0000pa-JF
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 14:13:42 +0000
Received: from [193.109.254.147] by server-10.bemta-14.messagelabs.com id
	03/02-01143-51B73365; Fri, 30 Oct 2015 14:13:41 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-16.tower-27.messagelabs.com!1446214419!30643204!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 14587 invoked from network); 30 Oct 2015 14:13:39 -0000
Received: from mail-wi0-f174.google.com (HELO mail-wi0-f174.google.com)
	(209.85.212.174)
	by server-16.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2015 14:13:39 -0000
Received: by wicll6 with SMTP id ll6so11551249wic.0
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 30 Oct 2015 07:13:39 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=m2r_biz.20150623.gappssmtp.com; s=20150623;
	h=subject:to:references:cc:from:message-id:date:user-agent
	:mime-version:in-reply-to:content-type:content-transfer-encoding;
	bh=rNy9X2grGTeggzPKI6faS77qLjF78Qa4OPRLhGHRIm4=;
	b=coKAelyIIF2KIon0Js/4uPQ57Rz5lXraMbX/tmvUGDzTnvm67LCsesHk0yhWKCzJ5t
	xAAs9j0+8AWdGtMJznJUuD/sorxJ3lOv6OlUqRiGZN7zhUzh3EJIzdQlBnITU8Zjh9JA
	wHwpHMwqq5x3f7ADePEVLkO8Stc9S7PeGQHRun/j1m5VZZwc3hVJGWEtbgYkKYXJFTmY
	s+a2MyFeFopNVXN4MHS6c/QgR91L/ykqCVzWBkOhYTzFZBimi2GBNTz3raqErbjvykG7
	jDSZCOj/ShfsF+6Jd7Yaqr0MVuNssBg0m5Ak+yRRbbf3BqR+HQAJBbBR6mVyydxIyet7
	/Hfg==
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:cc:from:message-id:date
	:user-agent:mime-version:in-reply-to:content-type
	:content-transfer-encoding;
	bh=rNy9X2grGTeggzPKI6faS77qLjF78Qa4OPRLhGHRIm4=;
	b=UPyDocjmxFkgaLWm3JPLCe2+4a/H7XNVMiqVdeOiROQhmtN+6j7Av+sfOVjXaJFtbh
	5Yy8nAWxPM0FBK/c4LAx6vb52Sy8I275m1Pbi28WkwcRhA5FKRpW9CklvB7oVxzUeePU
	/aEvplq6WVvX75l9w4va8NHzefU56JqRRYhFh4fjOnZOktuvTnk/tbB9XZlVikdGMFRI
	3YWuk5yuE/bIhMxUJPmio54FTnuYvA72zuqxonJiGtItVmvfdDp1H+SO2cMqG3Ti2fpO
	eGCYJaEpC+TpBH9SOFXbpfVYVGrTX4GpcyTgpAuiM+Y5o97qRCdGvYyRg8E+nyiSqmNs
	pRhg==
X-Gm-Message-State: ALoCoQks15woEURjIJNUDi4qUtNlHVjeREcW2iWMh+2dcpbVxKlZuepeVs2pitU/qLgnZ1VbXWD3
X-Received: by 10.194.47.134 with SMTP id d6mr8730080wjn.27.1446214418853;
	Fri, 30 Oct 2015 07:13:38 -0700 (PDT)
Received: from [192.168.178.34]
	(host12-146-dynamic.4-87-r.retail.telecomitalia.it. [87.4.146.12])
	by smtp.googlemail.com with ESMTPSA id
	h198sm3113685wmd.9.2015.10.30.07.13.37
	(version=TLSv1/SSLv3 cipher=OTHER);
	Fri, 30 Oct 2015 07:13:38 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>, =?UTF-8?B?w4lsacOhcyBUYW3DoXM=?=
	<et@etit.hu>
References: <562F93F5.9070505@etit.hu>
	<CABoYbGryR=rupt2DUROLeaCoYJqxVBC0VMpSiM1bjH4H2p-KZg@mail.gmail.com>
	<56308C66.1030806@etit.hu>
	<CAFLBxZZSO_re+Wt4_b1pnmgS33hXJS_SRhnvse9QW-NRpSTQ1A@mail.gmail.com>
	<563291B1.9080800@etit.hu>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F63DAEF@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <56337B10.2020002@m2r.biz>
Date: Fri, 30 Oct 2015 15:13:36 +0100
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F63DAEF@AMSPEX01CL01.citrite.net>
Content-Length: 5111
Cc: "xen-users@lists.xen.org" <xen-users@lists.xen.org>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] [Xen-users] Removing old glpv windows drivers to
 install new -> inaccessible boot device
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: base64
Content-Type: text/plain; charset="utf-8"; Format="flowed"
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

CgpJbCAzMC8xMC8yMDE1IDEwOjU0LCBQYXVsIER1cnJhbnQgaGEgc2NyaXR0bzoKPj4gLS0tLS1P
cmlnaW5hbCBNZXNzYWdlLS0tLS0KPj4gRnJvbTogd2luLXB2LWRldmVsLWJvdW5jZXNAbGlzdHMu
eGVucHJvamVjdC5vcmcgW21haWx0bzp3aW4tcHYtZGV2ZWwtCj4+IGJvdW5jZXNAbGlzdHMueGVu
cHJvamVjdC5vcmddIE9uIEJlaGFsZiBPZiDDiWxpw6FzIFRhbcOhcwo+PiBTZW50OiAyOSBPY3Rv
YmVyIDIwMTUgMjE6MzgKPj4gQ2M6IHhlbi11c2Vyc0BsaXN0cy54ZW4ub3JnOyB3aW4tcHYtZGV2
ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKPj4gU3ViamVjdDogUmU6IFt3aW4tcHYtZGV2ZWxdIFtY
ZW4tdXNlcnNdIFJlbW92aW5nIG9sZCBnbHB2IHdpbmRvd3MgZHJpdmVycwo+PiB0byBpbnN0YWxs
IG5ldyAtPiBpbmFjY2Vzc2libGUgYm9vdCBkZXZpY2UKPj4KPj4gSGkgYWxsLiBUaGFuayB5b3Ug
Zm9yIHRoZSB0aXBzLgo+Pgo+PiBIZXJlIGlzIHdoYXQgbmVlZGVkIHRvIGJlIGRvbmUuCj4+Cj4+
IC0gQm9vdCBpbiBzYWZlIG1vZGUuCj4+IC0gdXNlIHVuaW5zdGFsbC5iYXQgdG8gcmVtb3ZlIG9s
ZCBkcml2ZXJzLgo+PiAtIHVzZSBjY2xlYW5lciBvciBzaW1pbGFyIGFwcGxpY2F0aW9uIHRvIHJl
bW92ZSBvbGQgZHJpdmVyIGluc3RhbGwgZW50cmllcy4KPj4gLSBzY2FuIHRocm91Z2ggdGhlIGZp
bGUgc3lzdGVtIGVuZCBkZWxldGUgeGVuKgo+PiAtIGJjZGVkaXQgLXNldCBURVNUU0lHTklORyBP
Tgo+PiAtIGluc3RhbGwgcGZ4IGZpbGVzIHRvIGxvY2FsIGNvbXB1dGVyIGNlcnQgc3RvcmUuCj4+
IC0gcmVib290IGludG8gc2FmZSBtb2RlCj4+IC0gaW5zdGFsbCBuZXcgZHJpdmVycyAoeGVuYnVz
LCB4ZW52aWYsIGV0YykgdXNpbmcgZHBpbnN0LmV4ZSAoYWRtaW4gbW9kZSkKPj4gLSByZWJvb3Qg
dG8gbm9ybWFsIG1vZGUgKHRoZXJlIHdpbGwgYmUgbm8gbmV0d29yaywgbm8geGVuIGRldmljZXMg
Y2FuIGJlCj4+IHNlZW4sIGV0YyBmb3Igc29tZSByZWFzb24pCj4+IC0gZ28gdG8gaGFyZHdhcmUs
IGNoZWNrIHVua25vd24gUENJIGRldmljZSBhbmQgbWFudWFsbHkgaW5zdGFsbCB4ZW5idXMKPj4g
Zm9yIHRoYXQuCj4+IC0gYWZ0ZXIgdGhpcywgYWxsIG90aGVyIGRyaXZlcnMgYXBwZWFyIHN1ZGRl
bmx5Lgo+PiAtIHJlYm9vdCwgZG9uZS4KPj4KPj4gSXQgd291bGQgYmUgbmljZSB0byByZW1vdmUg
dGhlIHRlc3RzaWduaW5nIHRob3VnaCwgYnV0IGF0IGxlc3QgaXQgaXMKPj4gd29ya2luZyBub3cu
Cj4gVG8gZ2V0IHJpZCBvZiB0aGUgbmVlZCBmb3IgdGVzdHNpZ25pbmcgaXQncyBuZWNlc3Nhcnkg
Zm9yIGRyaXZlcnMgdG8gYmUgJ3JlYWxlYXNlIHNpZ25lZCcgYW5kIGluIHRoZSBjYXNlIG9mIFdp
bmRvd3MgMTAgdGhpcyBtZWFucyB0aGF0IHRoZXkgaGF2ZSB0byBiZSBzaWduZWQgZGlyZWN0bHkg
YnkgTWljcm9zb2Z0LiBUbyBhY2hpZXZlIGFsbCB0aGlzIGNlcnRpZmljYXRlcyBtdXN0IGJlIHB1
cmNoYXNlZCBhbmQgZmVlcyBtdXN0IGJlIHBhaWQgdG8gTWljcm9zb2Z0IHNvIGJ1ZGdldCBpcyBy
ZXF1aXJlZCBmcm9tIHNvbWV3aGVyZS4KPgo+ICAgIFBhdWwKCkFib3V0IGJ1eSB0aGUgY2VydGlm
aWNhdGVzIGFuZCBhbnkgdGhpbmdzIG5lZWRlZCBjYW4geW91IHN0YXJ0IGEgCmNyb3dkZnVuZGlu
Zz8gKGluIHNpdGUgbGlrZSBraWNrc3RhcnRlcikKU28gYW55b25lIHdobyB3YW50cyBjYW4gY29u
dHJpYnV0ZSxJIHdpbGwgY29udHJpYnV0ZSwgbW9zdCBsaWtlbHkgYWxzbyAKdGhlIGNvbXBhbnkg
d2hlcmUgSSB3b3JrIGFuZCBJIHN1cHBvc2Ugb3RoZXIgcGVvcGxlIHdvdWxkIGhlbHAgdG8gCmhh
dmVvZmZpY2lhbCBzaWduZWQgZHJpdmVycy4KClRoYW5rcyBmb3IgYW55IHJlcGx5IGFuZCBzb3Jy
eSBmb3IgbXkgYmFkIGVuZ2xpc2guCgo+Cj4+IDIwMTUtMTAtMjkgMTA6Mzgga2VsdGV6w6lzc2Vs
LCBHZW9yZ2UgRHVubGFwIMOtcnRhOgo+Pj4gT24gV2VkLCBPY3QgMjgsIDIwMTUgYXQgODo1MCBB
TSwgw4lsacOhcyBUYW3DoXMgPGV0QGV0aXQuaHU+IHdyb3RlOgo+Pj4+IEhpLiBZZXMsIEkgY29u
ZmlybSwgdGhhdCBib290aW5nIGludG8gc2FmZSBtb2RlIGlzIHBvc3NpYmxlLiBJIHR1cm5lZCBv
bgo+Pj4+IHRlc3RzaWduaW5nIHdpdGggYmNkZWRpdCwgYW5kIHRyaWVkIGluc3RhbGxpbmcgdGhl
IGRyaXZlcnMgYWdhaW4uCj4+Pj4KPj4+PiBUaGUgaXNudGFsbCB3ZW50IGZpbmUsIEkgY291bGQg
cmVib290LiBVbmZvcnR1bmF0ZWx5IHNpbmNlIHRoZW4gKGl0IGlzCj4+Pj4gbW9yZSB0aGVuIDgg
aG91cnMgbm93KSBJJ20gZmFjaW5nIHRoZSBhdHRhY2hlZCBzY3JlZW4uIFRoZSBhbmltYXRpb24g
aXMKPj4+PiBqdXN0IHJvbGxpbmcsIHJvbGxpbmcgcm9sbGluZyBhbmQgbm90aGluZyBoYXBwZW5z
LiBDUFUgdGlja3MgYXJlIHVzZWQsCj4+Pj4gc28gSSBhc3N1bWUgc29tZXRoaW5nIGlzIGhhcHBl
bmluZywgYnV0IGl0IHNlZW1lcyBwcmV0dHkgbXVjaCBzdHVjay4KPj4+Pgo+Pj4+IEFueSBpZGVh
cz8KPj4+IEkgKnRoaW5rKiB0aGUgWGVuU2VydmVyIFBWIGRyaXZlcnMgYXJlIHVzaW5nIG1pbmlw
b3J0OyBpbiB3aGljaCBjYXNlCj4+PiB0aGlzIEtCIGFydGljbGUgbWlnaHQgYmUgb2YgdXNlOgo+
Pj4KPj4+IGh0dHBzOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2VuLXVzL2tiLzI3OTUzOTcKPj4+
Cj4+PiBQYXVsIER1cnJhbnQgY2FuIGNvcnJlY3QgbWUgaWYgSSdtIHdyb25nIGFib3V0IG1pbmlw
b3J0IChhbmQgbWF5IGJlCj4+PiBhYmxlIHRvIHBvaW50IHlvdSB0byBhIG1vcmUgdXNlZnVsIGZp
eCBpZiBzbykuCj4+Pgo+Pj4gICAtR2VvcmdlCj4+Pgo+PiAtLQo+Pgo+Pgo+PiDDiWxpw6FzIFRh
bcOhcwo+PiBUaG9tYXMgRWxpYXMKPj4KPj4gRVRJVFtud3Byb10gS0ZULCDDnGd5dmV6ZXTFkS1I
w6Fsw7N6YXRiaXp0b25zw6FnaSBzcGVjaWFsaXN0YQo+PiBFVElUW253cHJvXSBMdGQsIEdlbmVy
YWwgTWFuYWdlci1OZXR3b3JrIHNlY3VyaXR5IHNwZWNpYWxpc3QKPj4KPj4gVGVsLiBIVTogKzM2
LzMwLTQ5Ny0xNjI2Cj4+IFRlbC4gREU6ICs0OS8xNjAtNjUxLTg3MjMKPj4gT3BlblBHUCBwdWJr
ZXk6IGh0dHA6Ly9ldGl0Lmh1L2RvYy9ldC1wdWIuYXNjCj4+Cj4+IE9rbGV2ZWxlcyBtw6lybsO2
ay1pbmZvcm1hdGlrdXMgKE1TQykKPj4gTWFzdGVyIG9mIFNjaWVuY2UgaW4gSW5mb3JtYXRpb24g
VGVjaG5vbG9neSAoTVNDKQo+Pgo+PiBLYXBjc29sYXQ6IGh0dHA6Ly9ldGl0Lmh1L2luZGV4LnBo
cC9odS9rYXBjc29sYXQKPj4gSm9naSBueWlsYXRrb3phdDogaHR0cDovL2V0aXQuaHUvZGlzY2xh
aW1lci1lbWFpbC1odS50eHQKPj4gQ29udGFjdDogaHR0cDovL2V0aXQuaHUvaW5kZXgucGhwL2Vu
L2NvbnRhY3QKPj4gRGlzY2xhaW1lcjogaHR0cDovL2V0aXQuaHUvZGlzY2xhaW1lci1lbWFpbC1l
bi50eHQKPiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+
IHdpbi1wdi1kZXZlbCBtYWlsaW5nIGxpc3QKPiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVj
dC5vcmcKPiBodHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3Rp
bmZvL3dpbi1wdi1kZXZlbAoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fCndpbi1wdi1kZXZlbCBtYWlsaW5nIGxpc3QKd2luLXB2LWRldmVsQGxpc3RzLnhl
bnByb2plY3Qub3JnCmh0dHA6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmluL21haWxtYW4v
bGlzdGluZm8vd2luLXB2LWRldmVs

From win-pv-devel-bounces@lists.xenproject.org Fri Oct 30 14:13:44 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 14:13: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 1ZsAR6-0000pk-5i; Fri, 30 Oct 2015 14:13:44 +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 1ZsAR4-0000pa-JF
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 14:13:42 +0000
Received: from [193.109.254.147] by server-10.bemta-14.messagelabs.com id
	03/02-01143-51B73365; Fri, 30 Oct 2015 14:13:41 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-16.tower-27.messagelabs.com!1446214419!30643204!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 14587 invoked from network); 30 Oct 2015 14:13:39 -0000
Received: from mail-wi0-f174.google.com (HELO mail-wi0-f174.google.com)
	(209.85.212.174)
	by server-16.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2015 14:13:39 -0000
Received: by wicll6 with SMTP id ll6so11551249wic.0
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 30 Oct 2015 07:13:39 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=m2r_biz.20150623.gappssmtp.com; s=20150623;
	h=subject:to:references:cc:from:message-id:date:user-agent
	:mime-version:in-reply-to:content-type:content-transfer-encoding;
	bh=rNy9X2grGTeggzPKI6faS77qLjF78Qa4OPRLhGHRIm4=;
	b=coKAelyIIF2KIon0Js/4uPQ57Rz5lXraMbX/tmvUGDzTnvm67LCsesHk0yhWKCzJ5t
	xAAs9j0+8AWdGtMJznJUuD/sorxJ3lOv6OlUqRiGZN7zhUzh3EJIzdQlBnITU8Zjh9JA
	wHwpHMwqq5x3f7ADePEVLkO8Stc9S7PeGQHRun/j1m5VZZwc3hVJGWEtbgYkKYXJFTmY
	s+a2MyFeFopNVXN4MHS6c/QgR91L/ykqCVzWBkOhYTzFZBimi2GBNTz3raqErbjvykG7
	jDSZCOj/ShfsF+6Jd7Yaqr0MVuNssBg0m5Ak+yRRbbf3BqR+HQAJBbBR6mVyydxIyet7
	/Hfg==
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:cc:from:message-id:date
	:user-agent:mime-version:in-reply-to:content-type
	:content-transfer-encoding;
	bh=rNy9X2grGTeggzPKI6faS77qLjF78Qa4OPRLhGHRIm4=;
	b=UPyDocjmxFkgaLWm3JPLCe2+4a/H7XNVMiqVdeOiROQhmtN+6j7Av+sfOVjXaJFtbh
	5Yy8nAWxPM0FBK/c4LAx6vb52Sy8I275m1Pbi28WkwcRhA5FKRpW9CklvB7oVxzUeePU
	/aEvplq6WVvX75l9w4va8NHzefU56JqRRYhFh4fjOnZOktuvTnk/tbB9XZlVikdGMFRI
	3YWuk5yuE/bIhMxUJPmio54FTnuYvA72zuqxonJiGtItVmvfdDp1H+SO2cMqG3Ti2fpO
	eGCYJaEpC+TpBH9SOFXbpfVYVGrTX4GpcyTgpAuiM+Y5o97qRCdGvYyRg8E+nyiSqmNs
	pRhg==
X-Gm-Message-State: ALoCoQks15woEURjIJNUDi4qUtNlHVjeREcW2iWMh+2dcpbVxKlZuepeVs2pitU/qLgnZ1VbXWD3
X-Received: by 10.194.47.134 with SMTP id d6mr8730080wjn.27.1446214418853;
	Fri, 30 Oct 2015 07:13:38 -0700 (PDT)
Received: from [192.168.178.34]
	(host12-146-dynamic.4-87-r.retail.telecomitalia.it. [87.4.146.12])
	by smtp.googlemail.com with ESMTPSA id
	h198sm3113685wmd.9.2015.10.30.07.13.37
	(version=TLSv1/SSLv3 cipher=OTHER);
	Fri, 30 Oct 2015 07:13:38 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>, =?UTF-8?B?w4lsacOhcyBUYW3DoXM=?=
	<et@etit.hu>
References: <562F93F5.9070505@etit.hu>
	<CABoYbGryR=rupt2DUROLeaCoYJqxVBC0VMpSiM1bjH4H2p-KZg@mail.gmail.com>
	<56308C66.1030806@etit.hu>
	<CAFLBxZZSO_re+Wt4_b1pnmgS33hXJS_SRhnvse9QW-NRpSTQ1A@mail.gmail.com>
	<563291B1.9080800@etit.hu>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F63DAEF@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <56337B10.2020002@m2r.biz>
Date: Fri, 30 Oct 2015 15:13:36 +0100
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F63DAEF@AMSPEX01CL01.citrite.net>
Content-Length: 5111
Cc: "xen-users@lists.xen.org" <xen-users@lists.xen.org>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] [Xen-users] Removing old glpv windows drivers to
 install new -> inaccessible boot device
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: base64
Content-Type: text/plain; charset="utf-8"; Format="flowed"
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

CgpJbCAzMC8xMC8yMDE1IDEwOjU0LCBQYXVsIER1cnJhbnQgaGEgc2NyaXR0bzoKPj4gLS0tLS1P
cmlnaW5hbCBNZXNzYWdlLS0tLS0KPj4gRnJvbTogd2luLXB2LWRldmVsLWJvdW5jZXNAbGlzdHMu
eGVucHJvamVjdC5vcmcgW21haWx0bzp3aW4tcHYtZGV2ZWwtCj4+IGJvdW5jZXNAbGlzdHMueGVu
cHJvamVjdC5vcmddIE9uIEJlaGFsZiBPZiDDiWxpw6FzIFRhbcOhcwo+PiBTZW50OiAyOSBPY3Rv
YmVyIDIwMTUgMjE6MzgKPj4gQ2M6IHhlbi11c2Vyc0BsaXN0cy54ZW4ub3JnOyB3aW4tcHYtZGV2
ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKPj4gU3ViamVjdDogUmU6IFt3aW4tcHYtZGV2ZWxdIFtY
ZW4tdXNlcnNdIFJlbW92aW5nIG9sZCBnbHB2IHdpbmRvd3MgZHJpdmVycwo+PiB0byBpbnN0YWxs
IG5ldyAtPiBpbmFjY2Vzc2libGUgYm9vdCBkZXZpY2UKPj4KPj4gSGkgYWxsLiBUaGFuayB5b3Ug
Zm9yIHRoZSB0aXBzLgo+Pgo+PiBIZXJlIGlzIHdoYXQgbmVlZGVkIHRvIGJlIGRvbmUuCj4+Cj4+
IC0gQm9vdCBpbiBzYWZlIG1vZGUuCj4+IC0gdXNlIHVuaW5zdGFsbC5iYXQgdG8gcmVtb3ZlIG9s
ZCBkcml2ZXJzLgo+PiAtIHVzZSBjY2xlYW5lciBvciBzaW1pbGFyIGFwcGxpY2F0aW9uIHRvIHJl
bW92ZSBvbGQgZHJpdmVyIGluc3RhbGwgZW50cmllcy4KPj4gLSBzY2FuIHRocm91Z2ggdGhlIGZp
bGUgc3lzdGVtIGVuZCBkZWxldGUgeGVuKgo+PiAtIGJjZGVkaXQgLXNldCBURVNUU0lHTklORyBP
Tgo+PiAtIGluc3RhbGwgcGZ4IGZpbGVzIHRvIGxvY2FsIGNvbXB1dGVyIGNlcnQgc3RvcmUuCj4+
IC0gcmVib290IGludG8gc2FmZSBtb2RlCj4+IC0gaW5zdGFsbCBuZXcgZHJpdmVycyAoeGVuYnVz
LCB4ZW52aWYsIGV0YykgdXNpbmcgZHBpbnN0LmV4ZSAoYWRtaW4gbW9kZSkKPj4gLSByZWJvb3Qg
dG8gbm9ybWFsIG1vZGUgKHRoZXJlIHdpbGwgYmUgbm8gbmV0d29yaywgbm8geGVuIGRldmljZXMg
Y2FuIGJlCj4+IHNlZW4sIGV0YyBmb3Igc29tZSByZWFzb24pCj4+IC0gZ28gdG8gaGFyZHdhcmUs
IGNoZWNrIHVua25vd24gUENJIGRldmljZSBhbmQgbWFudWFsbHkgaW5zdGFsbCB4ZW5idXMKPj4g
Zm9yIHRoYXQuCj4+IC0gYWZ0ZXIgdGhpcywgYWxsIG90aGVyIGRyaXZlcnMgYXBwZWFyIHN1ZGRl
bmx5Lgo+PiAtIHJlYm9vdCwgZG9uZS4KPj4KPj4gSXQgd291bGQgYmUgbmljZSB0byByZW1vdmUg
dGhlIHRlc3RzaWduaW5nIHRob3VnaCwgYnV0IGF0IGxlc3QgaXQgaXMKPj4gd29ya2luZyBub3cu
Cj4gVG8gZ2V0IHJpZCBvZiB0aGUgbmVlZCBmb3IgdGVzdHNpZ25pbmcgaXQncyBuZWNlc3Nhcnkg
Zm9yIGRyaXZlcnMgdG8gYmUgJ3JlYWxlYXNlIHNpZ25lZCcgYW5kIGluIHRoZSBjYXNlIG9mIFdp
bmRvd3MgMTAgdGhpcyBtZWFucyB0aGF0IHRoZXkgaGF2ZSB0byBiZSBzaWduZWQgZGlyZWN0bHkg
YnkgTWljcm9zb2Z0LiBUbyBhY2hpZXZlIGFsbCB0aGlzIGNlcnRpZmljYXRlcyBtdXN0IGJlIHB1
cmNoYXNlZCBhbmQgZmVlcyBtdXN0IGJlIHBhaWQgdG8gTWljcm9zb2Z0IHNvIGJ1ZGdldCBpcyBy
ZXF1aXJlZCBmcm9tIHNvbWV3aGVyZS4KPgo+ICAgIFBhdWwKCkFib3V0IGJ1eSB0aGUgY2VydGlm
aWNhdGVzIGFuZCBhbnkgdGhpbmdzIG5lZWRlZCBjYW4geW91IHN0YXJ0IGEgCmNyb3dkZnVuZGlu
Zz8gKGluIHNpdGUgbGlrZSBraWNrc3RhcnRlcikKU28gYW55b25lIHdobyB3YW50cyBjYW4gY29u
dHJpYnV0ZSxJIHdpbGwgY29udHJpYnV0ZSwgbW9zdCBsaWtlbHkgYWxzbyAKdGhlIGNvbXBhbnkg
d2hlcmUgSSB3b3JrIGFuZCBJIHN1cHBvc2Ugb3RoZXIgcGVvcGxlIHdvdWxkIGhlbHAgdG8gCmhh
dmVvZmZpY2lhbCBzaWduZWQgZHJpdmVycy4KClRoYW5rcyBmb3IgYW55IHJlcGx5IGFuZCBzb3Jy
eSBmb3IgbXkgYmFkIGVuZ2xpc2guCgo+Cj4+IDIwMTUtMTAtMjkgMTA6Mzgga2VsdGV6w6lzc2Vs
LCBHZW9yZ2UgRHVubGFwIMOtcnRhOgo+Pj4gT24gV2VkLCBPY3QgMjgsIDIwMTUgYXQgODo1MCBB
TSwgw4lsacOhcyBUYW3DoXMgPGV0QGV0aXQuaHU+IHdyb3RlOgo+Pj4+IEhpLiBZZXMsIEkgY29u
ZmlybSwgdGhhdCBib290aW5nIGludG8gc2FmZSBtb2RlIGlzIHBvc3NpYmxlLiBJIHR1cm5lZCBv
bgo+Pj4+IHRlc3RzaWduaW5nIHdpdGggYmNkZWRpdCwgYW5kIHRyaWVkIGluc3RhbGxpbmcgdGhl
IGRyaXZlcnMgYWdhaW4uCj4+Pj4KPj4+PiBUaGUgaXNudGFsbCB3ZW50IGZpbmUsIEkgY291bGQg
cmVib290LiBVbmZvcnR1bmF0ZWx5IHNpbmNlIHRoZW4gKGl0IGlzCj4+Pj4gbW9yZSB0aGVuIDgg
aG91cnMgbm93KSBJJ20gZmFjaW5nIHRoZSBhdHRhY2hlZCBzY3JlZW4uIFRoZSBhbmltYXRpb24g
aXMKPj4+PiBqdXN0IHJvbGxpbmcsIHJvbGxpbmcgcm9sbGluZyBhbmQgbm90aGluZyBoYXBwZW5z
LiBDUFUgdGlja3MgYXJlIHVzZWQsCj4+Pj4gc28gSSBhc3N1bWUgc29tZXRoaW5nIGlzIGhhcHBl
bmluZywgYnV0IGl0IHNlZW1lcyBwcmV0dHkgbXVjaCBzdHVjay4KPj4+Pgo+Pj4+IEFueSBpZGVh
cz8KPj4+IEkgKnRoaW5rKiB0aGUgWGVuU2VydmVyIFBWIGRyaXZlcnMgYXJlIHVzaW5nIG1pbmlw
b3J0OyBpbiB3aGljaCBjYXNlCj4+PiB0aGlzIEtCIGFydGljbGUgbWlnaHQgYmUgb2YgdXNlOgo+
Pj4KPj4+IGh0dHBzOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2VuLXVzL2tiLzI3OTUzOTcKPj4+
Cj4+PiBQYXVsIER1cnJhbnQgY2FuIGNvcnJlY3QgbWUgaWYgSSdtIHdyb25nIGFib3V0IG1pbmlw
b3J0IChhbmQgbWF5IGJlCj4+PiBhYmxlIHRvIHBvaW50IHlvdSB0byBhIG1vcmUgdXNlZnVsIGZp
eCBpZiBzbykuCj4+Pgo+Pj4gICAtR2VvcmdlCj4+Pgo+PiAtLQo+Pgo+Pgo+PiDDiWxpw6FzIFRh
bcOhcwo+PiBUaG9tYXMgRWxpYXMKPj4KPj4gRVRJVFtud3Byb10gS0ZULCDDnGd5dmV6ZXTFkS1I
w6Fsw7N6YXRiaXp0b25zw6FnaSBzcGVjaWFsaXN0YQo+PiBFVElUW253cHJvXSBMdGQsIEdlbmVy
YWwgTWFuYWdlci1OZXR3b3JrIHNlY3VyaXR5IHNwZWNpYWxpc3QKPj4KPj4gVGVsLiBIVTogKzM2
LzMwLTQ5Ny0xNjI2Cj4+IFRlbC4gREU6ICs0OS8xNjAtNjUxLTg3MjMKPj4gT3BlblBHUCBwdWJr
ZXk6IGh0dHA6Ly9ldGl0Lmh1L2RvYy9ldC1wdWIuYXNjCj4+Cj4+IE9rbGV2ZWxlcyBtw6lybsO2
ay1pbmZvcm1hdGlrdXMgKE1TQykKPj4gTWFzdGVyIG9mIFNjaWVuY2UgaW4gSW5mb3JtYXRpb24g
VGVjaG5vbG9neSAoTVNDKQo+Pgo+PiBLYXBjc29sYXQ6IGh0dHA6Ly9ldGl0Lmh1L2luZGV4LnBo
cC9odS9rYXBjc29sYXQKPj4gSm9naSBueWlsYXRrb3phdDogaHR0cDovL2V0aXQuaHUvZGlzY2xh
aW1lci1lbWFpbC1odS50eHQKPj4gQ29udGFjdDogaHR0cDovL2V0aXQuaHUvaW5kZXgucGhwL2Vu
L2NvbnRhY3QKPj4gRGlzY2xhaW1lcjogaHR0cDovL2V0aXQuaHUvZGlzY2xhaW1lci1lbWFpbC1l
bi50eHQKPiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+
IHdpbi1wdi1kZXZlbCBtYWlsaW5nIGxpc3QKPiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVj
dC5vcmcKPiBodHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3Rp
bmZvL3dpbi1wdi1kZXZlbAoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fCndpbi1wdi1kZXZlbCBtYWlsaW5nIGxpc3QKd2luLXB2LWRldmVsQGxpc3RzLnhl
bnByb2plY3Qub3JnCmh0dHA6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmluL21haWxtYW4v
bGlzdGluZm8vd2luLXB2LWRldmVs

From win-pv-devel-bounces@lists.xenproject.org Fri Oct 30 14:14:22 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 14:14: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 1ZsARi-0000qg-9r; Fri, 30 Oct 2015 14:14:22 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=738f7cb72=Paul.Durrant@citrix.com>)
	id 1ZsARg-0000qb-Oq
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 14:14:20 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	52/CF-10678-C3B73365; Fri, 30 Oct 2015 14:14:20 +0000
X-Env-Sender: prvs=738f7cb72=Paul.Durrant@citrix.com
X-Msg-Ref: server-15.tower-31.messagelabs.com!1446214458!58259229!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22785 invoked from network); 30 Oct 2015 14:14:19 -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;
	30 Oct 2015 14:14:19 -0000
X-IronPort-AV: E=Sophos;i="5.20,218,1444694400"; 
   d="scan'208";a="6567619"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 7/8] Add Get/Put for request,	segment
	and indirect(pages)
Thread-Index: AQHREKjzE5tgnWSaWU62ZEivDSZTzZ6EGTtw
Date: Fri, 30 Oct 2015 14:14:15 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F64125E@AMSPEX01CL01.citrite.net>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
	<1445944546-21500-8-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1445944546-21500-8-git-send-email-owen.smith@citrix.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
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 7/8] Add Get/Put for request,
 segment and indirect(pages)
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 Owen Smith
> Sent: 27 October 2015 11:16
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 7/8] Add Get/Put for request, segment and
> indirect(pages)
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xenvbd/pdo.c | 211 +++++++++++++++++++++++++++++++++-----------
> -----------
>  1 file changed, 126 insertions(+), 85 deletions(-)
> 
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index 5023a93..e8d94cb 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -567,17 +567,127 @@ PdoSectorSize(
>  }
> 
> 
> //=========================================================
> ====================
> +static PVOID
> +PdoGetIndirect(
> +    IN  PXENVBD_PDO             Pdo
> +    )
> +{
> +    PVOID                       Indirect;
> 
> -static FORCEINLINE ULONG
> -PdoGetTag(
> +    Indirect = __LookasideAlloc(&Pdo->IndirectList);
> +    if (Indirect == NULL)
> +        goto fail1;
> +
> +    RtlZeroMemory(Indirect, PAGE_SIZE);
> +    return Indirect;
> +
> +fail1:
> +    return NULL;
> +}
> +
> +static VOID
> +PdoPutIndirect(
> +    IN  PXENVBD_PDO             Pdo,
> +    IN  PVOID                   Indirect
> +    )
> +{
> +    RtlZeroMemory(Indirect, PAGE_SIZE);
> +    __LookasideFree(&Pdo->IndirectList, Indirect);
> +}
> +
> +static PXENVBD_SEGMENT
> +PdoGetSegment(
> +    IN  PXENVBD_PDO             Pdo
> +    )
> +{
> +    PXENVBD_SEGMENT             Segment;
> +
> +    Segment = __LookasideAlloc(&Pdo->SegmentList);
> +    if (Segment == NULL)
> +        goto fail1;
> +
> +    RtlZeroMemory(Segment, sizeof(XENVBD_SEGMENT));
> +    return Segment;
> +
> +fail1:
> +    return NULL;
> +}
> +
> +static VOID
> +PdoPutSegment(
> +    IN  PXENVBD_PDO             Pdo,
> +    IN  PXENVBD_SEGMENT         Segment
> +    )
> +{
> +    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
> +
> +    if (Segment->Grant)
> +        GranterPut(Granter, Segment->Grant);
> +
> +    if (Segment->BufferId)
> +        BufferPut(Segment->BufferId);
> +
> +    if (Segment->Buffer)
> +        MmUnmapLockedPages(Segment->Buffer, &Segment->Mdl);
> +
> +    RtlZeroMemory(Segment, sizeof(XENVBD_SEGMENT));
> +    __LookasideFree(&Pdo->SegmentList, Segment);
> +}
> +
> +static PXENVBD_REQUEST
> +PdoGetRequest(
>      IN  PXENVBD_PDO             Pdo
>      )
>  {
> -    return (ULONG)InterlockedIncrement((PLONG)&Pdo->NextTag);
> +    PXENVBD_REQUEST             Request;
> +
> +    Request = __LookasideAlloc(&Pdo->RequestList);
> +    if (Request == NULL)
> +        goto fail1;
> +
> +    RtlZeroMemory(Request, sizeof(XENVBD_REQUEST));
> +    Request->Id = (ULONG)InterlockedIncrement((PLONG)&Pdo->NextTag);
> +    InitializeListHead(&Request->Segments);
> +
> +    return Request;
> +
> +fail1:
> +    return NULL;
> +}
> +
> +static VOID
> +PdoPutRequest(
> +    IN  PXENVBD_PDO             Pdo,
> +    IN  PXENVBD_REQUEST         Request
> +    )
> +{
> +    ULONG           Index;
> +    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
> +
> +    for (;;) {
> +        PLIST_ENTRY     Entry;
> +        PXENVBD_SEGMENT Segment;
> +
> +        Entry = RemoveHeadList(&Request->Segments);
> +        if (Entry == &Request->Segments)
> +            break;
> +        Segment = CONTAINING_RECORD(Entry, XENVBD_SEGMENT, Entry);
> +        PdoPutSegment(Pdo, Segment);
> +    }
> +
> +    for (Index = 0; Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST;
> ++Index) {
> +        if (Request->Grants[Index])
> +            GranterPut(Granter, Request->Grants[Index]);
> +        if (Request->Pages[Index])
> +            PdoPutIndirect(Pdo, Request->Pages[Index]);
> +    }
> +
> +    RtlZeroMemory(Request, sizeof(XENVBD_REQUEST));
> +    __LookasideFree(&Pdo->RequestList, Request);
>  }
> 
>  static FORCEINLINE PXENVBD_REQUEST
> -PdoPutTag(
> +PdoRequestFromTag(
>      IN  PXENVBD_PDO             Pdo,
>      IN  ULONG                   Tag
>      )
> @@ -793,63 +903,6 @@ fail:
>  }
> 
>  static FORCEINLINE VOID
> -UnmapSegmentBuffer(
> -    IN  PXENVBD_SEGMENT         Segment
> -    )
> -{
> -    MmUnmapLockedPages(Segment->Buffer, &Segment->Mdl);
> -    RtlZeroMemory(&Segment->Mdl, sizeof(Segment->Mdl));
> -    RtlZeroMemory(Segment->Pfn, sizeof(Segment->Pfn));
> -    Segment->Buffer = NULL;
> -    Segment->Length = 0;
> -}
> -
> -static FORCEINLINE VOID
> -RequestCleanup(
> -    IN  PXENVBD_PDO             Pdo,
> -    IN  PXENVBD_REQUEST         Request
> -    )
> -{
> -    ULONG           Index;
> -    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
> -
> -    for (;;) {
> -        PLIST_ENTRY     Entry;
> -        PXENVBD_SEGMENT Segment;
> -
> -        Entry = RemoveHeadList(&Request->Segments);
> -        if (Entry == &Request->Segments)
> -            break;
> -
> -        Segment = CONTAINING_RECORD(Entry, XENVBD_SEGMENT, Entry);
> -        --Request->NrSegments;
> -
> -        if (Segment->Grant)
> -            GranterPut(Granter, Segment->Grant);
> -        Segment->Grant = NULL;
> -
> -        if (Segment->BufferId)
> -            BufferPut(Segment->BufferId);
> -        Segment->BufferId = NULL;
> -
> -        if (Segment->Buffer)
> -            UnmapSegmentBuffer(Segment);
> -
> -        __LookasideFree(&Pdo->SegmentList, Segment);
> -    }
> -
> -    for (Index = 0; Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST;
> ++Index) {
> -        if (Request->Grants[Index])
> -            GranterPut(Granter, Request->Grants[Index]);
> -        Request->Grants[Index] = NULL;
> -
> -        if (Request->Pages[Index])
> -            __LookasideFree(&Pdo->IndirectList, Request->Pages[Index]);
> -        Request->Pages[Index] = NULL;
> -    }
> -}
> -
> -static FORCEINLINE VOID
>  RequestCopyOutput(
>      __in PXENVBD_REQUEST         Request
>      )
> @@ -965,7 +1018,7 @@ PrepareBlkifReadWrite(
>          PXENVBD_SEGMENT Segment;
>          ULONG           SectorsNow;
> 
> -        Segment = __LookasideAlloc(&Pdo->SegmentList);
> +        Segment = PdoGetSegment(Pdo);
>          if (Segment == NULL)
>              goto fail1;
> 
> @@ -1008,7 +1061,7 @@ PrepareBlkifIndirect(
>              Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
>              NrSegments < Request->NrSegments;
>                  ++Index) {
> -        Request->Pages[Index] = __LookasideAlloc(&Pdo->IndirectList);
> +        Request->Pages[Index] = PdoGetIndirect(Pdo);
>          if (Request->Pages[Index] == NULL)
>              goto fail1;
> 
> @@ -1085,7 +1138,7 @@ PdoCancelRequestList(
>              break;
> 
>          Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> -        __LookasideFree(&Pdo->RequestList, Request);
> +        PdoPutRequest(Pdo, Request);
>      }
>  }
> 
> @@ -1114,15 +1167,12 @@ PrepareReadWrite(
>          ULONG           SectorsDone = 0;
>          PXENVBD_REQUEST Request;
> 
> -        Request = __LookasideAlloc(&Pdo->RequestList);
> +        Request = PdoGetRequest(Pdo);
>          if (Request == NULL)
>              goto fail1;
>          InsertTailList(&List, &Request->Entry);
> 
>          Request->Srb    = Srb;
> -        Request->Id     = PdoGetTag(Pdo);
> -        InitializeListHead(&Request->Segments);
> -
>          MaxSegments = UseIndirect(Pdo, SectorsLeft);
> 
>          if (!PrepareBlkifReadWrite(Pdo,
> @@ -1168,16 +1218,14 @@ PrepareSyncCache(
>      SrbExt->Count = 0;
>      Srb->SrbStatus = SRB_STATUS_PENDING;
> 
> -    Request = __LookasideAlloc(&Pdo->RequestList);
> +    Request = PdoGetRequest(Pdo);
>      if (Request == NULL)
>          goto fail1;
>      InsertTailList(&List, &Request->Entry);
> 
>      Request->Srb        = Srb;
> -    Request->Id         = PdoGetTag(Pdo);
>      Request->Operation  = BLKIF_OP_WRITE_BARRIER;
>      Request->FirstSector = Cdb_LogicalBlock(Srb);
> -    InitializeListHead(&Request->Segments);
> 
>      SrbExt->Count = PdoQueueRequestList(Pdo, &List);
>      return TRUE;
> @@ -1209,18 +1257,16 @@ PrepareUnmap(
>          PUNMAP_BLOCK_DESCRIPTOR Descr = &Unmap->Descriptors[Index];
>          PXENVBD_REQUEST         Request;
> 
> -        Request = __LookasideAlloc(&Pdo->RequestList);
> +        Request = PdoGetRequest(Pdo);
>          if (Request == NULL)
>              goto fail1;
>          InsertTailList(&List, &Request->Entry);
> 
>          Request->Srb            = Srb;
> -        Request->Id             = PdoGetTag(Pdo);
>          Request->Operation      = BLKIF_OP_DISCARD;
>          Request->FirstSector    = _byteswap_uint64(*(PULONG64)Descr-
> >StartingLba);
>          Request->NrSectors      = _byteswap_ulong(*(PULONG)Descr-
> >LbaCount);
>          Request->Flags          = 0;
> -        InitializeListHead(&Request->Segments);
>      }
> 
>      SrbExt->Count = PdoQueueRequestList(Pdo, &List);
> @@ -1296,8 +1342,7 @@ __PdoPauseDataPath(
>          Verbose("Target[%d] : PreparedReq 0x%p -> FAILED\n",
> PdoGetTargetId(Pdo), Request);
> 
>          SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
> -        RequestCleanup(Pdo, Request);
> -        __LookasideFree(&Pdo->RequestList, Request);
> +        PdoPutRequest(Pdo, Request);
> 
>          if (InterlockedDecrement(&SrbExt->Count) == 0) {
>              SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
> @@ -1460,7 +1505,7 @@ PdoCompleteResponse(
>      PSCSI_REQUEST_BLOCK Srb;
>      PXENVBD_SRBEXT      SrbExt;
> 
> -    Request = PdoPutTag(Pdo, Tag);
> +    Request = PdoRequestFromTag(Pdo, Tag);
>      if (Request == NULL)
>          return;
> 
> @@ -1489,8 +1534,7 @@ PdoCompleteResponse(
>          break;
>      }
> 
> -    RequestCleanup(Pdo, Request);
> -    __LookasideFree(&Pdo->RequestList, Request);
> +    PdoPutRequest(Pdo, Request);
> 
>      // complete srb
>      if (InterlockedDecrement(&SrbExt->Count) == 0) {
> @@ -1529,8 +1573,7 @@ PdoPreResume(
>          SrbExt = GetSrbExt(Request->Srb);
> 
>          BlockRingAbort(BlockRing, Request);
> -        RequestCleanup(Pdo, Request);
> -        __LookasideFree(&Pdo->RequestList, Request);
> +        PdoPutRequest(Pdo, Request);
> 
>          if (InterlockedDecrement(&SrbExt->Count) == 0) {
>              InsertTailList(&List, &SrbExt->Entry);
> @@ -1547,8 +1590,7 @@ PdoPreResume(
>          Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
>          SrbExt = GetSrbExt(Request->Srb);
> 
> -        RequestCleanup(Pdo, Request);
> -        __LookasideFree(&Pdo->RequestList, Request);
> +        PdoPutRequest(Pdo, Request);
> 
>          if (InterlockedDecrement(&SrbExt->Count) == 0) {
>              InsertTailList(&List, &SrbExt->Entry);
> @@ -2155,8 +2197,7 @@ __PdoCleanupSubmittedReqs(
> 
>          Verbose("Target[%d] : SubmittedReq 0x%p -> FAILED\n",
> PdoGetTargetId(Pdo), Request);
> 
> -        RequestCleanup(Pdo, Request);
> -        __LookasideFree(&Pdo->RequestList, Request);
> +        PdoPutRequest(Pdo, Request);
> 
>          if (InterlockedDecrement(&SrbExt->Count) == 0) {
>              SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
> --
> 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

_______________________________________________
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 Oct 30 14:14:22 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 14:14: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 1ZsARi-0000qg-9r; Fri, 30 Oct 2015 14:14:22 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=738f7cb72=Paul.Durrant@citrix.com>)
	id 1ZsARg-0000qb-Oq
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 14:14:20 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	52/CF-10678-C3B73365; Fri, 30 Oct 2015 14:14:20 +0000
X-Env-Sender: prvs=738f7cb72=Paul.Durrant@citrix.com
X-Msg-Ref: server-15.tower-31.messagelabs.com!1446214458!58259229!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22785 invoked from network); 30 Oct 2015 14:14:19 -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;
	30 Oct 2015 14:14:19 -0000
X-IronPort-AV: E=Sophos;i="5.20,218,1444694400"; 
   d="scan'208";a="6567619"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 7/8] Add Get/Put for request,	segment
	and indirect(pages)
Thread-Index: AQHREKjzE5tgnWSaWU62ZEivDSZTzZ6EGTtw
Date: Fri, 30 Oct 2015 14:14:15 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F64125E@AMSPEX01CL01.citrite.net>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
	<1445944546-21500-8-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1445944546-21500-8-git-send-email-owen.smith@citrix.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
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 7/8] Add Get/Put for request,
 segment and indirect(pages)
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 Owen Smith
> Sent: 27 October 2015 11:16
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 7/8] Add Get/Put for request, segment and
> indirect(pages)
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xenvbd/pdo.c | 211 +++++++++++++++++++++++++++++++++-----------
> -----------
>  1 file changed, 126 insertions(+), 85 deletions(-)
> 
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index 5023a93..e8d94cb 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -567,17 +567,127 @@ PdoSectorSize(
>  }
> 
> 
> //=========================================================
> ====================
> +static PVOID
> +PdoGetIndirect(
> +    IN  PXENVBD_PDO             Pdo
> +    )
> +{
> +    PVOID                       Indirect;
> 
> -static FORCEINLINE ULONG
> -PdoGetTag(
> +    Indirect = __LookasideAlloc(&Pdo->IndirectList);
> +    if (Indirect == NULL)
> +        goto fail1;
> +
> +    RtlZeroMemory(Indirect, PAGE_SIZE);
> +    return Indirect;
> +
> +fail1:
> +    return NULL;
> +}
> +
> +static VOID
> +PdoPutIndirect(
> +    IN  PXENVBD_PDO             Pdo,
> +    IN  PVOID                   Indirect
> +    )
> +{
> +    RtlZeroMemory(Indirect, PAGE_SIZE);
> +    __LookasideFree(&Pdo->IndirectList, Indirect);
> +}
> +
> +static PXENVBD_SEGMENT
> +PdoGetSegment(
> +    IN  PXENVBD_PDO             Pdo
> +    )
> +{
> +    PXENVBD_SEGMENT             Segment;
> +
> +    Segment = __LookasideAlloc(&Pdo->SegmentList);
> +    if (Segment == NULL)
> +        goto fail1;
> +
> +    RtlZeroMemory(Segment, sizeof(XENVBD_SEGMENT));
> +    return Segment;
> +
> +fail1:
> +    return NULL;
> +}
> +
> +static VOID
> +PdoPutSegment(
> +    IN  PXENVBD_PDO             Pdo,
> +    IN  PXENVBD_SEGMENT         Segment
> +    )
> +{
> +    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
> +
> +    if (Segment->Grant)
> +        GranterPut(Granter, Segment->Grant);
> +
> +    if (Segment->BufferId)
> +        BufferPut(Segment->BufferId);
> +
> +    if (Segment->Buffer)
> +        MmUnmapLockedPages(Segment->Buffer, &Segment->Mdl);
> +
> +    RtlZeroMemory(Segment, sizeof(XENVBD_SEGMENT));
> +    __LookasideFree(&Pdo->SegmentList, Segment);
> +}
> +
> +static PXENVBD_REQUEST
> +PdoGetRequest(
>      IN  PXENVBD_PDO             Pdo
>      )
>  {
> -    return (ULONG)InterlockedIncrement((PLONG)&Pdo->NextTag);
> +    PXENVBD_REQUEST             Request;
> +
> +    Request = __LookasideAlloc(&Pdo->RequestList);
> +    if (Request == NULL)
> +        goto fail1;
> +
> +    RtlZeroMemory(Request, sizeof(XENVBD_REQUEST));
> +    Request->Id = (ULONG)InterlockedIncrement((PLONG)&Pdo->NextTag);
> +    InitializeListHead(&Request->Segments);
> +
> +    return Request;
> +
> +fail1:
> +    return NULL;
> +}
> +
> +static VOID
> +PdoPutRequest(
> +    IN  PXENVBD_PDO             Pdo,
> +    IN  PXENVBD_REQUEST         Request
> +    )
> +{
> +    ULONG           Index;
> +    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
> +
> +    for (;;) {
> +        PLIST_ENTRY     Entry;
> +        PXENVBD_SEGMENT Segment;
> +
> +        Entry = RemoveHeadList(&Request->Segments);
> +        if (Entry == &Request->Segments)
> +            break;
> +        Segment = CONTAINING_RECORD(Entry, XENVBD_SEGMENT, Entry);
> +        PdoPutSegment(Pdo, Segment);
> +    }
> +
> +    for (Index = 0; Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST;
> ++Index) {
> +        if (Request->Grants[Index])
> +            GranterPut(Granter, Request->Grants[Index]);
> +        if (Request->Pages[Index])
> +            PdoPutIndirect(Pdo, Request->Pages[Index]);
> +    }
> +
> +    RtlZeroMemory(Request, sizeof(XENVBD_REQUEST));
> +    __LookasideFree(&Pdo->RequestList, Request);
>  }
> 
>  static FORCEINLINE PXENVBD_REQUEST
> -PdoPutTag(
> +PdoRequestFromTag(
>      IN  PXENVBD_PDO             Pdo,
>      IN  ULONG                   Tag
>      )
> @@ -793,63 +903,6 @@ fail:
>  }
> 
>  static FORCEINLINE VOID
> -UnmapSegmentBuffer(
> -    IN  PXENVBD_SEGMENT         Segment
> -    )
> -{
> -    MmUnmapLockedPages(Segment->Buffer, &Segment->Mdl);
> -    RtlZeroMemory(&Segment->Mdl, sizeof(Segment->Mdl));
> -    RtlZeroMemory(Segment->Pfn, sizeof(Segment->Pfn));
> -    Segment->Buffer = NULL;
> -    Segment->Length = 0;
> -}
> -
> -static FORCEINLINE VOID
> -RequestCleanup(
> -    IN  PXENVBD_PDO             Pdo,
> -    IN  PXENVBD_REQUEST         Request
> -    )
> -{
> -    ULONG           Index;
> -    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
> -
> -    for (;;) {
> -        PLIST_ENTRY     Entry;
> -        PXENVBD_SEGMENT Segment;
> -
> -        Entry = RemoveHeadList(&Request->Segments);
> -        if (Entry == &Request->Segments)
> -            break;
> -
> -        Segment = CONTAINING_RECORD(Entry, XENVBD_SEGMENT, Entry);
> -        --Request->NrSegments;
> -
> -        if (Segment->Grant)
> -            GranterPut(Granter, Segment->Grant);
> -        Segment->Grant = NULL;
> -
> -        if (Segment->BufferId)
> -            BufferPut(Segment->BufferId);
> -        Segment->BufferId = NULL;
> -
> -        if (Segment->Buffer)
> -            UnmapSegmentBuffer(Segment);
> -
> -        __LookasideFree(&Pdo->SegmentList, Segment);
> -    }
> -
> -    for (Index = 0; Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST;
> ++Index) {
> -        if (Request->Grants[Index])
> -            GranterPut(Granter, Request->Grants[Index]);
> -        Request->Grants[Index] = NULL;
> -
> -        if (Request->Pages[Index])
> -            __LookasideFree(&Pdo->IndirectList, Request->Pages[Index]);
> -        Request->Pages[Index] = NULL;
> -    }
> -}
> -
> -static FORCEINLINE VOID
>  RequestCopyOutput(
>      __in PXENVBD_REQUEST         Request
>      )
> @@ -965,7 +1018,7 @@ PrepareBlkifReadWrite(
>          PXENVBD_SEGMENT Segment;
>          ULONG           SectorsNow;
> 
> -        Segment = __LookasideAlloc(&Pdo->SegmentList);
> +        Segment = PdoGetSegment(Pdo);
>          if (Segment == NULL)
>              goto fail1;
> 
> @@ -1008,7 +1061,7 @@ PrepareBlkifIndirect(
>              Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
>              NrSegments < Request->NrSegments;
>                  ++Index) {
> -        Request->Pages[Index] = __LookasideAlloc(&Pdo->IndirectList);
> +        Request->Pages[Index] = PdoGetIndirect(Pdo);
>          if (Request->Pages[Index] == NULL)
>              goto fail1;
> 
> @@ -1085,7 +1138,7 @@ PdoCancelRequestList(
>              break;
> 
>          Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> -        __LookasideFree(&Pdo->RequestList, Request);
> +        PdoPutRequest(Pdo, Request);
>      }
>  }
> 
> @@ -1114,15 +1167,12 @@ PrepareReadWrite(
>          ULONG           SectorsDone = 0;
>          PXENVBD_REQUEST Request;
> 
> -        Request = __LookasideAlloc(&Pdo->RequestList);
> +        Request = PdoGetRequest(Pdo);
>          if (Request == NULL)
>              goto fail1;
>          InsertTailList(&List, &Request->Entry);
> 
>          Request->Srb    = Srb;
> -        Request->Id     = PdoGetTag(Pdo);
> -        InitializeListHead(&Request->Segments);
> -
>          MaxSegments = UseIndirect(Pdo, SectorsLeft);
> 
>          if (!PrepareBlkifReadWrite(Pdo,
> @@ -1168,16 +1218,14 @@ PrepareSyncCache(
>      SrbExt->Count = 0;
>      Srb->SrbStatus = SRB_STATUS_PENDING;
> 
> -    Request = __LookasideAlloc(&Pdo->RequestList);
> +    Request = PdoGetRequest(Pdo);
>      if (Request == NULL)
>          goto fail1;
>      InsertTailList(&List, &Request->Entry);
> 
>      Request->Srb        = Srb;
> -    Request->Id         = PdoGetTag(Pdo);
>      Request->Operation  = BLKIF_OP_WRITE_BARRIER;
>      Request->FirstSector = Cdb_LogicalBlock(Srb);
> -    InitializeListHead(&Request->Segments);
> 
>      SrbExt->Count = PdoQueueRequestList(Pdo, &List);
>      return TRUE;
> @@ -1209,18 +1257,16 @@ PrepareUnmap(
>          PUNMAP_BLOCK_DESCRIPTOR Descr = &Unmap->Descriptors[Index];
>          PXENVBD_REQUEST         Request;
> 
> -        Request = __LookasideAlloc(&Pdo->RequestList);
> +        Request = PdoGetRequest(Pdo);
>          if (Request == NULL)
>              goto fail1;
>          InsertTailList(&List, &Request->Entry);
> 
>          Request->Srb            = Srb;
> -        Request->Id             = PdoGetTag(Pdo);
>          Request->Operation      = BLKIF_OP_DISCARD;
>          Request->FirstSector    = _byteswap_uint64(*(PULONG64)Descr-
> >StartingLba);
>          Request->NrSectors      = _byteswap_ulong(*(PULONG)Descr-
> >LbaCount);
>          Request->Flags          = 0;
> -        InitializeListHead(&Request->Segments);
>      }
> 
>      SrbExt->Count = PdoQueueRequestList(Pdo, &List);
> @@ -1296,8 +1342,7 @@ __PdoPauseDataPath(
>          Verbose("Target[%d] : PreparedReq 0x%p -> FAILED\n",
> PdoGetTargetId(Pdo), Request);
> 
>          SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
> -        RequestCleanup(Pdo, Request);
> -        __LookasideFree(&Pdo->RequestList, Request);
> +        PdoPutRequest(Pdo, Request);
> 
>          if (InterlockedDecrement(&SrbExt->Count) == 0) {
>              SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
> @@ -1460,7 +1505,7 @@ PdoCompleteResponse(
>      PSCSI_REQUEST_BLOCK Srb;
>      PXENVBD_SRBEXT      SrbExt;
> 
> -    Request = PdoPutTag(Pdo, Tag);
> +    Request = PdoRequestFromTag(Pdo, Tag);
>      if (Request == NULL)
>          return;
> 
> @@ -1489,8 +1534,7 @@ PdoCompleteResponse(
>          break;
>      }
> 
> -    RequestCleanup(Pdo, Request);
> -    __LookasideFree(&Pdo->RequestList, Request);
> +    PdoPutRequest(Pdo, Request);
> 
>      // complete srb
>      if (InterlockedDecrement(&SrbExt->Count) == 0) {
> @@ -1529,8 +1573,7 @@ PdoPreResume(
>          SrbExt = GetSrbExt(Request->Srb);
> 
>          BlockRingAbort(BlockRing, Request);
> -        RequestCleanup(Pdo, Request);
> -        __LookasideFree(&Pdo->RequestList, Request);
> +        PdoPutRequest(Pdo, Request);
> 
>          if (InterlockedDecrement(&SrbExt->Count) == 0) {
>              InsertTailList(&List, &SrbExt->Entry);
> @@ -1547,8 +1590,7 @@ PdoPreResume(
>          Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
>          SrbExt = GetSrbExt(Request->Srb);
> 
> -        RequestCleanup(Pdo, Request);
> -        __LookasideFree(&Pdo->RequestList, Request);
> +        PdoPutRequest(Pdo, Request);
> 
>          if (InterlockedDecrement(&SrbExt->Count) == 0) {
>              InsertTailList(&List, &SrbExt->Entry);
> @@ -2155,8 +2197,7 @@ __PdoCleanupSubmittedReqs(
> 
>          Verbose("Target[%d] : SubmittedReq 0x%p -> FAILED\n",
> PdoGetTargetId(Pdo), Request);
> 
> -        RequestCleanup(Pdo, Request);
> -        __LookasideFree(&Pdo->RequestList, Request);
> +        PdoPutRequest(Pdo, Request);
> 
>          if (InterlockedDecrement(&SrbExt->Count) == 0) {
>              SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
> --
> 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

_______________________________________________
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 Oct 30 14:17:50 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 14:17: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 1ZsAV2-0000wb-Ii; Fri, 30 Oct 2015 14:17:48 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=738f7cb72=Paul.Durrant@citrix.com>)
	id 1ZsAV0-0000wW-Ag
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 14:17:46 +0000
Received: from [193.109.254.147] by server-10.bemta-14.messagelabs.com id
	2A/A9-01143-90C73365; Fri, 30 Oct 2015 14:17:45 +0000
X-Env-Sender: prvs=738f7cb72=Paul.Durrant@citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1446214664!26180387!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30475 invoked from network); 30 Oct 2015 14:17:44 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2015 14:17:44 -0000
X-IronPort-AV: E=Sophos;i="5.20,218,1444694400"; 
   d="scan'208";a="6567985"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 8/8] Rework indirect context structure
Thread-Index: AQHREKjvGCVEgOi+XEymfqMd+lzaf56EGjmA
Date: Fri, 30 Oct 2015 14:17:43 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6412A2@AMSPEX01CL01.citrite.net>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
	<1445944546-21500-9-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1445944546-21500-9-git-send-email-owen.smith@citrix.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
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 8/8] Rework indirect context structure
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 Owen Smith
> Sent: 27 October 2015 11:16
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 8/8] Rework indirect context structure
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xenvbd/blockring.c | 48 ++++++++++++++++-----------------
>  src/xenvbd/pdo.c       | 72 ++++++++++++++++++++++++++++++++----------
> --------
>  src/xenvbd/srbext.h    | 13 ++++++---
>  3 files changed, 79 insertions(+), 54 deletions(-)
> 
> diff --git a/src/xenvbd/blockring.c b/src/xenvbd/blockring.c
> index 28f1393..6ca9cb2 100644
> --- a/src/xenvbd/blockring.c
> +++ b/src/xenvbd/blockring.c
> @@ -152,9 +152,10 @@ __BlockRingInsert(
>      case BLKIF_OP_WRITE:
>          if (Request->NrSegments > BLKIF_MAX_SEGMENTS_PER_REQUEST) {
>              // Indirect
> -            ULONG                       PageIndex;
> -            ULONG                       SegmentIndex;
> -            PLIST_ENTRY                 Entry;
> +            ULONG                       PageIdx;
> +            ULONG                       SegIdx;
> +            PLIST_ENTRY                 PageEntry;
> +            PLIST_ENTRY                 SegEntry;
>              blkif_request_indirect_t*   req_indirect;
> 
>              req_indirect = (blkif_request_indirect_t*)req;
> @@ -165,29 +166,28 @@ __BlockRingInsert(
>              req_indirect->sector_number     = Request->FirstSector;
>              req_indirect->handle            = (USHORT)BlockRing->DeviceId;
> 
> -            for (PageIndex = 0, SegmentIndex = 0, Entry = Request-
> >Segments.Flink;
> -                    PageIndex < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
> -                    Entry != &Request->Segments;
> -                        Entry = Entry->Flink) {
> -                PBLKIF_SEGMENT  Indirect = Request->Pages[PageIndex];
> -                PXENVBD_SEGMENT Segment = CONTAINING_RECORD(Entry,
> XENVBD_SEGMENT, Entry);
> -
> -                Indirect[SegmentIndex].GrantRef = GranterReference(Granter,
> Segment->Grant);
> -                Indirect[SegmentIndex].First    = Segment->FirstSector;
> -                Indirect[SegmentIndex].Last     = Segment->LastSector;
> -
> -                ++SegmentIndex;
> -                if (SegmentIndex >= XENVBD_MAX_SEGMENTS_PER_PAGE) {
> -                    ++PageIndex;
> -                    SegmentIndex = 0;
> +            for (PageIdx = 0,
> +                 PageEntry = Request->Indirects.Flink,
> +                 SegEntry = Request->Segments.Flink;
> +                    PageIdx < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
> +                    PageEntry != &Request->Indirects &&
> +                    SegEntry != &Request->Segments;
> +                        ++PageIdx, PageEntry = PageEntry->Flink) {
> +                PXENVBD_INDIRECT Page = CONTAINING_RECORD(PageEntry,
> XENVBD_INDIRECT, Entry);
> +
> +                req_indirect->indirect_grefs[PageIdx] =
> GranterReference(Granter, Page->Grant);
> +
> +                for (SegIdx = 0;
> +                        SegIdx < XENVBD_MAX_SEGMENTS_PER_PAGE &&
> +                        SegEntry != &Request->Segments;
> +                            ++SegIdx, SegEntry = SegEntry->Flink) {
> +                    PXENVBD_SEGMENT Segment =
> CONTAINING_RECORD(SegEntry, XENVBD_SEGMENT, Entry);
> +
> +                    Page->Page[SegIdx].GrantRef = GranterReference(Granter,
> Segment->Grant);
> +                    Page->Page[SegIdx].First    = Segment->FirstSector;
> +                    Page->Page[SegIdx].Last     = Segment->LastSector;
>                  }
>              }
> -            for (PageIndex = 0;
> -                    PageIndex < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
> -                    Request->Grants[PageIndex] != NULL;
> -                        ++PageIndex) {
> -                req_indirect->indirect_grefs[PageIndex] =
> GranterReference(Granter, Request->Grants[PageIndex]);
> -            }
>          } else {
>              // Direct
>              ULONG           Index;
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index e8d94cb..3c429b2 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -567,20 +567,38 @@ PdoSectorSize(
>  }
> 
> 
> //=========================================================
> ====================
> -static PVOID
> +static PXENVBD_INDIRECT
>  PdoGetIndirect(
>      IN  PXENVBD_PDO             Pdo
>      )
>  {
> -    PVOID                       Indirect;
> +    PXENVBD_INDIRECT    Indirect;
> +    NTSTATUS            status;
> +    PXENVBD_GRANTER     Granter = FrontendGetGranter(Pdo->Frontend);
> 
>      Indirect = __LookasideAlloc(&Pdo->IndirectList);
>      if (Indirect == NULL)
>          goto fail1;
> 
> -    RtlZeroMemory(Indirect, PAGE_SIZE);
> +    RtlZeroMemory(Indirect, sizeof(XENVBD_INDIRECT));
> +
> +    Indirect->Page = __AllocPages(PAGE_SIZE, &Indirect->Mdl);
> +    if (Indirect->Page == NULL)
> +        goto fail2;
> +
> +    status = GranterGet(Granter,
> +                        MmGetMdlPfnArray(Indirect->Mdl)[0],
> +                        TRUE,
> +                        &Indirect->Grant);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
>      return Indirect;
> 
> +fail3:
> +    __FreePages(Indirect->Page, Indirect->Mdl);
> +fail2:
> +    __LookasideFree(&Pdo->IndirectList, Indirect);
>  fail1:
>      return NULL;
>  }
> @@ -588,10 +606,17 @@ fail1:
>  static VOID
>  PdoPutIndirect(
>      IN  PXENVBD_PDO             Pdo,
> -    IN  PVOID                   Indirect
> +    IN  PXENVBD_INDIRECT        Indirect
>      )
>  {
> -    RtlZeroMemory(Indirect, PAGE_SIZE);
> +    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
> +
> +    if (Indirect->Grant)
> +        GranterPut(Granter, Indirect->Grant);
> +    if (Indirect->Page)
> +        __FreePages(Indirect->Page, Indirect->Mdl);
> +
> +    RtlZeroMemory(Indirect, sizeof(XENVBD_INDIRECT));
>      __LookasideFree(&Pdo->IndirectList, Indirect);
>  }
> 
> @@ -648,6 +673,7 @@ PdoGetRequest(
>      RtlZeroMemory(Request, sizeof(XENVBD_REQUEST));
>      Request->Id = (ULONG)InterlockedIncrement((PLONG)&Pdo->NextTag);
>      InitializeListHead(&Request->Segments);
> +    InitializeListHead(&Request->Indirects);
> 
>      return Request;
> 
> @@ -661,11 +687,9 @@ PdoPutRequest(
>      IN  PXENVBD_REQUEST         Request
>      )
>  {
> -    ULONG           Index;
> -    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
> +    PLIST_ENTRY     Entry;
> 
>      for (;;) {
> -        PLIST_ENTRY     Entry;
>          PXENVBD_SEGMENT Segment;
> 
>          Entry = RemoveHeadList(&Request->Segments);
> @@ -675,11 +699,14 @@ PdoPutRequest(
>          PdoPutSegment(Pdo, Segment);
>      }
> 
> -    for (Index = 0; Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST;
> ++Index) {
> -        if (Request->Grants[Index])
> -            GranterPut(Granter, Request->Grants[Index]);
> -        if (Request->Pages[Index])
> -            PdoPutIndirect(Pdo, Request->Pages[Index]);
> +    for (;;) {
> +        PXENVBD_INDIRECT    Indirect;
> +
> +        Entry = RemoveHeadList(&Request->Indirects);
> +        if (Entry == &Request->Indirects)
> +            break;
> +        Indirect = CONTAINING_RECORD(Entry, XENVBD_INDIRECT, Entry);
> +        PdoPutIndirect(Pdo, Indirect);
>      }
> 
>      RtlZeroMemory(Request, sizeof(XENVBD_REQUEST));
> @@ -1052,32 +1079,25 @@ PrepareBlkifIndirect(
>      IN  PXENVBD_REQUEST         Request
>      )
>  {
> -    NTSTATUS        status;
>      ULONG           Index;
>      ULONG           NrSegments = 0;
> -    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
> 
>      for (Index = 0;
>              Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
>              NrSegments < Request->NrSegments;
>                  ++Index) {
> -        Request->Pages[Index] = PdoGetIndirect(Pdo);
> -        if (Request->Pages[Index] == NULL)
> -            goto fail1;
> +        PXENVBD_INDIRECT    Indirect;
> 
> -        status = GranterGet(Granter,
> -                            __Virt2Pfn(Request->Pages[Index]),
> -                            TRUE,
> -                            &Request->Grants[Index]);
> -        if (!NT_SUCCESS(status))
> -            goto fail2;
> +        Indirect = PdoGetIndirect(Pdo);
> +        if (Indirect == NULL)
> +            goto fail1;
> +        InsertTailList(&Request->Indirects, &Indirect->Entry);
> 
>          NrSegments += XENVBD_MAX_SEGMENTS_PER_PAGE;
>      }
> 
>      return TRUE;
> 
> -fail2:
>  fail1:
>      return FALSE;
>  }
> @@ -2583,7 +2603,7 @@ PdoCreate(
> 
>      __LookasideInit(&Pdo->RequestList, sizeof(XENVBD_REQUEST),
> REQUEST_POOL_TAG);
>      __LookasideInit(&Pdo->SegmentList, sizeof(XENVBD_SEGMENT),
> SEGMENT_POOL_TAG);
> -    __LookasideInit(&Pdo->IndirectList, PAGE_SIZE, INDIRECT_POOL_TAG);
> +    __LookasideInit(&Pdo->IndirectList, sizeof(XENVBD_INDIRECT),
> INDIRECT_POOL_TAG);
> 
>      Status = PdoD3ToD0(Pdo);
>      if (!NT_SUCCESS(Status))
> diff --git a/src/xenvbd/srbext.h b/src/xenvbd/srbext.h
> index 6550b72..6b41475 100644
> --- a/src/xenvbd/srbext.h
> +++ b/src/xenvbd/srbext.h
> @@ -48,6 +48,14 @@ typedef struct _BLKIF_SEGMENT {
> 
>  #define XENVBD_MAX_SEGMENTS_PER_PAGE    (PAGE_SIZE /
> sizeof(BLKIF_SEGMENT))
> 
> +// Internal indirect context
> +typedef struct _XENVBD_INDIRECT {
> +    LIST_ENTRY              Entry;
> +    PBLKIF_SEGMENT          Page;
> +    PVOID                   Grant;
> +    PMDL                    Mdl;
> +} XENVBD_INDIRECT, *PXENVBD_INDIRECT;
> +
>  // Internal segment context
>  typedef struct _XENVBD_SEGMENT {
>      LIST_ENTRY              Entry;
> @@ -74,10 +82,7 @@ typedef struct _XENVBD_REQUEST {
> 
>      ULONG64                 FirstSector;
>      ULONG64                 NrSectors;  // BLKIF_OP_DISCARD only
> -
> -    // BLKIF_OP_{READ/WRITE} with NrSegments > 11 only
> -    PVOID                   Pages[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST];
> -    PVOID                   Grants[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST];
> +    LIST_ENTRY              Indirects;  // BLKIF_OP_{READ/WRITE} with
> NrSegments > 11 only
>  } XENVBD_REQUEST, *PXENVBD_REQUEST;
> 
>  // SRBExtension - context for SRBs
> --
> 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

_______________________________________________
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 Oct 30 14:17:50 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 14:17: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 1ZsAV2-0000wb-Ii; Fri, 30 Oct 2015 14:17:48 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=738f7cb72=Paul.Durrant@citrix.com>)
	id 1ZsAV0-0000wW-Ag
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 14:17:46 +0000
Received: from [193.109.254.147] by server-10.bemta-14.messagelabs.com id
	2A/A9-01143-90C73365; Fri, 30 Oct 2015 14:17:45 +0000
X-Env-Sender: prvs=738f7cb72=Paul.Durrant@citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1446214664!26180387!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30475 invoked from network); 30 Oct 2015 14:17:44 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2015 14:17:44 -0000
X-IronPort-AV: E=Sophos;i="5.20,218,1444694400"; 
   d="scan'208";a="6567985"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 8/8] Rework indirect context structure
Thread-Index: AQHREKjvGCVEgOi+XEymfqMd+lzaf56EGjmA
Date: Fri, 30 Oct 2015 14:17:43 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6412A2@AMSPEX01CL01.citrite.net>
References: <1445944546-21500-1-git-send-email-owen.smith@citrix.com>
	<1445944546-21500-9-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1445944546-21500-9-git-send-email-owen.smith@citrix.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
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 8/8] Rework indirect context structure
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 Owen Smith
> Sent: 27 October 2015 11:16
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 8/8] Rework indirect context structure
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xenvbd/blockring.c | 48 ++++++++++++++++-----------------
>  src/xenvbd/pdo.c       | 72 ++++++++++++++++++++++++++++++++----------
> --------
>  src/xenvbd/srbext.h    | 13 ++++++---
>  3 files changed, 79 insertions(+), 54 deletions(-)
> 
> diff --git a/src/xenvbd/blockring.c b/src/xenvbd/blockring.c
> index 28f1393..6ca9cb2 100644
> --- a/src/xenvbd/blockring.c
> +++ b/src/xenvbd/blockring.c
> @@ -152,9 +152,10 @@ __BlockRingInsert(
>      case BLKIF_OP_WRITE:
>          if (Request->NrSegments > BLKIF_MAX_SEGMENTS_PER_REQUEST) {
>              // Indirect
> -            ULONG                       PageIndex;
> -            ULONG                       SegmentIndex;
> -            PLIST_ENTRY                 Entry;
> +            ULONG                       PageIdx;
> +            ULONG                       SegIdx;
> +            PLIST_ENTRY                 PageEntry;
> +            PLIST_ENTRY                 SegEntry;
>              blkif_request_indirect_t*   req_indirect;
> 
>              req_indirect = (blkif_request_indirect_t*)req;
> @@ -165,29 +166,28 @@ __BlockRingInsert(
>              req_indirect->sector_number     = Request->FirstSector;
>              req_indirect->handle            = (USHORT)BlockRing->DeviceId;
> 
> -            for (PageIndex = 0, SegmentIndex = 0, Entry = Request-
> >Segments.Flink;
> -                    PageIndex < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
> -                    Entry != &Request->Segments;
> -                        Entry = Entry->Flink) {
> -                PBLKIF_SEGMENT  Indirect = Request->Pages[PageIndex];
> -                PXENVBD_SEGMENT Segment = CONTAINING_RECORD(Entry,
> XENVBD_SEGMENT, Entry);
> -
> -                Indirect[SegmentIndex].GrantRef = GranterReference(Granter,
> Segment->Grant);
> -                Indirect[SegmentIndex].First    = Segment->FirstSector;
> -                Indirect[SegmentIndex].Last     = Segment->LastSector;
> -
> -                ++SegmentIndex;
> -                if (SegmentIndex >= XENVBD_MAX_SEGMENTS_PER_PAGE) {
> -                    ++PageIndex;
> -                    SegmentIndex = 0;
> +            for (PageIdx = 0,
> +                 PageEntry = Request->Indirects.Flink,
> +                 SegEntry = Request->Segments.Flink;
> +                    PageIdx < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
> +                    PageEntry != &Request->Indirects &&
> +                    SegEntry != &Request->Segments;
> +                        ++PageIdx, PageEntry = PageEntry->Flink) {
> +                PXENVBD_INDIRECT Page = CONTAINING_RECORD(PageEntry,
> XENVBD_INDIRECT, Entry);
> +
> +                req_indirect->indirect_grefs[PageIdx] =
> GranterReference(Granter, Page->Grant);
> +
> +                for (SegIdx = 0;
> +                        SegIdx < XENVBD_MAX_SEGMENTS_PER_PAGE &&
> +                        SegEntry != &Request->Segments;
> +                            ++SegIdx, SegEntry = SegEntry->Flink) {
> +                    PXENVBD_SEGMENT Segment =
> CONTAINING_RECORD(SegEntry, XENVBD_SEGMENT, Entry);
> +
> +                    Page->Page[SegIdx].GrantRef = GranterReference(Granter,
> Segment->Grant);
> +                    Page->Page[SegIdx].First    = Segment->FirstSector;
> +                    Page->Page[SegIdx].Last     = Segment->LastSector;
>                  }
>              }
> -            for (PageIndex = 0;
> -                    PageIndex < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
> -                    Request->Grants[PageIndex] != NULL;
> -                        ++PageIndex) {
> -                req_indirect->indirect_grefs[PageIndex] =
> GranterReference(Granter, Request->Grants[PageIndex]);
> -            }
>          } else {
>              // Direct
>              ULONG           Index;
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index e8d94cb..3c429b2 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -567,20 +567,38 @@ PdoSectorSize(
>  }
> 
> 
> //=========================================================
> ====================
> -static PVOID
> +static PXENVBD_INDIRECT
>  PdoGetIndirect(
>      IN  PXENVBD_PDO             Pdo
>      )
>  {
> -    PVOID                       Indirect;
> +    PXENVBD_INDIRECT    Indirect;
> +    NTSTATUS            status;
> +    PXENVBD_GRANTER     Granter = FrontendGetGranter(Pdo->Frontend);
> 
>      Indirect = __LookasideAlloc(&Pdo->IndirectList);
>      if (Indirect == NULL)
>          goto fail1;
> 
> -    RtlZeroMemory(Indirect, PAGE_SIZE);
> +    RtlZeroMemory(Indirect, sizeof(XENVBD_INDIRECT));
> +
> +    Indirect->Page = __AllocPages(PAGE_SIZE, &Indirect->Mdl);
> +    if (Indirect->Page == NULL)
> +        goto fail2;
> +
> +    status = GranterGet(Granter,
> +                        MmGetMdlPfnArray(Indirect->Mdl)[0],
> +                        TRUE,
> +                        &Indirect->Grant);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
>      return Indirect;
> 
> +fail3:
> +    __FreePages(Indirect->Page, Indirect->Mdl);
> +fail2:
> +    __LookasideFree(&Pdo->IndirectList, Indirect);
>  fail1:
>      return NULL;
>  }
> @@ -588,10 +606,17 @@ fail1:
>  static VOID
>  PdoPutIndirect(
>      IN  PXENVBD_PDO             Pdo,
> -    IN  PVOID                   Indirect
> +    IN  PXENVBD_INDIRECT        Indirect
>      )
>  {
> -    RtlZeroMemory(Indirect, PAGE_SIZE);
> +    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
> +
> +    if (Indirect->Grant)
> +        GranterPut(Granter, Indirect->Grant);
> +    if (Indirect->Page)
> +        __FreePages(Indirect->Page, Indirect->Mdl);
> +
> +    RtlZeroMemory(Indirect, sizeof(XENVBD_INDIRECT));
>      __LookasideFree(&Pdo->IndirectList, Indirect);
>  }
> 
> @@ -648,6 +673,7 @@ PdoGetRequest(
>      RtlZeroMemory(Request, sizeof(XENVBD_REQUEST));
>      Request->Id = (ULONG)InterlockedIncrement((PLONG)&Pdo->NextTag);
>      InitializeListHead(&Request->Segments);
> +    InitializeListHead(&Request->Indirects);
> 
>      return Request;
> 
> @@ -661,11 +687,9 @@ PdoPutRequest(
>      IN  PXENVBD_REQUEST         Request
>      )
>  {
> -    ULONG           Index;
> -    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
> +    PLIST_ENTRY     Entry;
> 
>      for (;;) {
> -        PLIST_ENTRY     Entry;
>          PXENVBD_SEGMENT Segment;
> 
>          Entry = RemoveHeadList(&Request->Segments);
> @@ -675,11 +699,14 @@ PdoPutRequest(
>          PdoPutSegment(Pdo, Segment);
>      }
> 
> -    for (Index = 0; Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST;
> ++Index) {
> -        if (Request->Grants[Index])
> -            GranterPut(Granter, Request->Grants[Index]);
> -        if (Request->Pages[Index])
> -            PdoPutIndirect(Pdo, Request->Pages[Index]);
> +    for (;;) {
> +        PXENVBD_INDIRECT    Indirect;
> +
> +        Entry = RemoveHeadList(&Request->Indirects);
> +        if (Entry == &Request->Indirects)
> +            break;
> +        Indirect = CONTAINING_RECORD(Entry, XENVBD_INDIRECT, Entry);
> +        PdoPutIndirect(Pdo, Indirect);
>      }
> 
>      RtlZeroMemory(Request, sizeof(XENVBD_REQUEST));
> @@ -1052,32 +1079,25 @@ PrepareBlkifIndirect(
>      IN  PXENVBD_REQUEST         Request
>      )
>  {
> -    NTSTATUS        status;
>      ULONG           Index;
>      ULONG           NrSegments = 0;
> -    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
> 
>      for (Index = 0;
>              Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
>              NrSegments < Request->NrSegments;
>                  ++Index) {
> -        Request->Pages[Index] = PdoGetIndirect(Pdo);
> -        if (Request->Pages[Index] == NULL)
> -            goto fail1;
> +        PXENVBD_INDIRECT    Indirect;
> 
> -        status = GranterGet(Granter,
> -                            __Virt2Pfn(Request->Pages[Index]),
> -                            TRUE,
> -                            &Request->Grants[Index]);
> -        if (!NT_SUCCESS(status))
> -            goto fail2;
> +        Indirect = PdoGetIndirect(Pdo);
> +        if (Indirect == NULL)
> +            goto fail1;
> +        InsertTailList(&Request->Indirects, &Indirect->Entry);
> 
>          NrSegments += XENVBD_MAX_SEGMENTS_PER_PAGE;
>      }
> 
>      return TRUE;
> 
> -fail2:
>  fail1:
>      return FALSE;
>  }
> @@ -2583,7 +2603,7 @@ PdoCreate(
> 
>      __LookasideInit(&Pdo->RequestList, sizeof(XENVBD_REQUEST),
> REQUEST_POOL_TAG);
>      __LookasideInit(&Pdo->SegmentList, sizeof(XENVBD_SEGMENT),
> SEGMENT_POOL_TAG);
> -    __LookasideInit(&Pdo->IndirectList, PAGE_SIZE, INDIRECT_POOL_TAG);
> +    __LookasideInit(&Pdo->IndirectList, sizeof(XENVBD_INDIRECT),
> INDIRECT_POOL_TAG);
> 
>      Status = PdoD3ToD0(Pdo);
>      if (!NT_SUCCESS(Status))
> diff --git a/src/xenvbd/srbext.h b/src/xenvbd/srbext.h
> index 6550b72..6b41475 100644
> --- a/src/xenvbd/srbext.h
> +++ b/src/xenvbd/srbext.h
> @@ -48,6 +48,14 @@ typedef struct _BLKIF_SEGMENT {
> 
>  #define XENVBD_MAX_SEGMENTS_PER_PAGE    (PAGE_SIZE /
> sizeof(BLKIF_SEGMENT))
> 
> +// Internal indirect context
> +typedef struct _XENVBD_INDIRECT {
> +    LIST_ENTRY              Entry;
> +    PBLKIF_SEGMENT          Page;
> +    PVOID                   Grant;
> +    PMDL                    Mdl;
> +} XENVBD_INDIRECT, *PXENVBD_INDIRECT;
> +
>  // Internal segment context
>  typedef struct _XENVBD_SEGMENT {
>      LIST_ENTRY              Entry;
> @@ -74,10 +82,7 @@ typedef struct _XENVBD_REQUEST {
> 
>      ULONG64                 FirstSector;
>      ULONG64                 NrSectors;  // BLKIF_OP_DISCARD only
> -
> -    // BLKIF_OP_{READ/WRITE} with NrSegments > 11 only
> -    PVOID                   Pages[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST];
> -    PVOID                   Grants[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST];
> +    LIST_ENTRY              Indirects;  // BLKIF_OP_{READ/WRITE} with
> NrSegments > 11 only
>  } XENVBD_REQUEST, *PXENVBD_REQUEST;
> 
>  // SRBExtension - context for SRBs
> --
> 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

_______________________________________________
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 Oct 30 17:39:49 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 17:39:49 +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 1ZsDeW-0006Jx-2m; Fri, 30 Oct 2015 17:39:48 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=73812f44e=owen.smith@citrix.com>)
	id 1ZsDeU-0006Jl-NM
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 17:39:46 +0000
Received: from [85.158.137.68] by server-7.bemta-3.messagelabs.com id
	1D/33-16965-26BA3365; Fri, 30 Oct 2015 17:39:46 +0000
X-Env-Sender: prvs=73812f44e=owen.smith@citrix.com
X-Msg-Ref: server-8.tower-31.messagelabs.com!1446226784!58451922!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 26127 invoked from network); 30 Oct 2015 17:39:45 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-8.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2015 17:39:45 -0000
X-IronPort-AV: E=Sophos;i="5.20,219,1444694400"; d="scan'208";a="314660670"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Fri, 30 Oct 2015 17:39:23 +0000
Message-ID: <1446226763-29200-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 v2] Define NT_PROCESSOR_GROUPS for VS2012
	project
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

Previous patch missed the obvious compatability macros provided
and used by xenbus.
Also fixes a few badly formed ASSERTions

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xeniface/driver.c            | 2 ++
 src/xeniface/fdo.c               | 1 +
 src/xeniface/ioctl_evtchn.c      | 6 ++++--
 src/xeniface/ioctls.c            | 4 +++-
 vs2012/xeniface/xeniface.vcxproj | 4 ++--
 5 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/src/xeniface/driver.c b/src/xeniface/driver.c
index f4e8240..a843d00 100644
--- a/src/xeniface/driver.c
+++ b/src/xeniface/driver.c
@@ -30,6 +30,7 @@
  */
 
 #include <ntifs.h>
+#include <procgrp.h>
 #include <version.h>
 
 #include "fdo.h"
@@ -149,6 +150,7 @@ DriverEntry(
     ASSERT3P(DriverObject, ==, NULL);
 
     ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
+    WdmlibProcgrpInitialize();
 
     Trace("====>\n");
 
diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index 71ffbe2..fdb3edf 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -31,6 +31,7 @@
 
 
 #include <ntifs.h>
+#include <procgrp.h>
 #include <wdmguid.h>
 #include <ntstrsafe.h>
 #include <stdlib.h>
diff --git a/src/xeniface/ioctl_evtchn.c b/src/xeniface/ioctl_evtchn.c
index 93f1931..3b8ecb5 100644
--- a/src/xeniface/ioctl_evtchn.c
+++ b/src/xeniface/ioctl_evtchn.c
@@ -29,6 +29,8 @@
  * SUCH DAMAGE.
  */
 
+#include <ntifs.h>
+#include <procgrp.h>
 #include "driver.h"
 #include "ioctls.h"
 #include "xeniface_ioctls.h"
@@ -51,7 +53,7 @@ EvtchnNotificationDpc(
     UNREFERENCED_PARAMETER(_Context);
     UNREFERENCED_PARAMETER(Argument2);
 
-    ASSERT(Context);
+    ASSERT(Context != NULL);
 
 #if DBG
     XenIfaceDebugPrint(INFO, "Channel %p, LocalPort %d, Cpu %lu\n",
@@ -80,7 +82,7 @@ EvtchnInterruptHandler(
     ULONG ProcIndex;
 
     UNREFERENCED_PARAMETER(Interrupt);
-    ASSERT(Context);
+    ASSERT(Context != NULL);
 
     KeGetCurrentProcessorNumberEx(&ProcNumber);
     ProcIndex = KeGetProcessorIndexFromNumber(&ProcNumber);
diff --git a/src/xeniface/ioctls.c b/src/xeniface/ioctls.c
index b306a45..b93fd56 100644
--- a/src/xeniface/ioctls.c
+++ b/src/xeniface/ioctls.c
@@ -30,6 +30,8 @@
  * SUCH DAMAGE.
  */
 
+#include <ntifs.h>
+#include <procgrp.h>
 #include "driver.h"
 #include "ioctls.h"
 #include "xeniface_ioctls.h"
@@ -97,7 +99,7 @@ XenIfaceCleanup(
     KIRQL Irql;
     LIST_ENTRY ToFree;
 
-    XenIfaceDebugPrint(TRACE, "FO %p, IRQL %d, Cpu %lu\n", FileObject, KeGetCurrentIrql(), KeGetCurrentProcessorNumber());
+    //XenIfaceDebugPrint(TRACE, "FO %p, IRQL %d, Cpu %lu\n", FileObject, KeGetCurrentIrql(), KeGetCurrentProcessorNumber());
 
     // store watches
     KeAcquireSpinLock(&Fdo->StoreWatchLock, &Irql);
diff --git a/vs2012/xeniface/xeniface.vcxproj b/vs2012/xeniface/xeniface.vcxproj
index fadc1d1..c57e2a2 100644
--- a/vs2012/xeniface/xeniface.vcxproj
+++ b/vs2012/xeniface/xeniface.vcxproj
@@ -32,7 +32,7 @@
 	
     <ItemDefinitionGroup>       
 		<ClCompile>
-			<PreprocessorDefinitions>__MODULE__="XENIFACE";POOL_NX_OPTIN=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+			<PreprocessorDefinitions>__MODULE__="XENIFACE";POOL_NX_OPTIN=1;NT_PROCESSOR_GROUPS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 			<WarningLevel>EnableAllWarnings</WarningLevel>
 			<DisableSpecificWarnings>4711;4548;4820;4668;4255;6001;6054;%(DisableSpecificWarnings)</DisableSpecificWarnings>
 			<MultiProcessorCompilation>true</MultiProcessorCompilation>
@@ -40,7 +40,7 @@
 		</ClCompile>
 		<Link>
 			<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
-			<AdditionalDependencies>$(DDK_LIB_PATH)\ntstrsafe.lib;%(AdditionalDependencies)</AdditionalDependencies>
+			<AdditionalDependencies>$(DDK_LIB_PATH)\ntstrsafe.lib;$(DDK_LIB_PATH)\procgrp.lib;%(AdditionalDependencies)</AdditionalDependencies>
 			<EnableCOMDATFolding>false</EnableCOMDATFolding>
 		</Link>
 		<Inf>
-- 
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 Fri Oct 30 17:39:49 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 30 Oct 2015 17:39:49 +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 1ZsDeW-0006Jx-2m; Fri, 30 Oct 2015 17:39:48 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=73812f44e=owen.smith@citrix.com>)
	id 1ZsDeU-0006Jl-NM
	for win-pv-devel@lists.xenproject.org; Fri, 30 Oct 2015 17:39:46 +0000
Received: from [85.158.137.68] by server-7.bemta-3.messagelabs.com id
	1D/33-16965-26BA3365; Fri, 30 Oct 2015 17:39:46 +0000
X-Env-Sender: prvs=73812f44e=owen.smith@citrix.com
X-Msg-Ref: server-8.tower-31.messagelabs.com!1446226784!58451922!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 26127 invoked from network); 30 Oct 2015 17:39:45 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-8.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2015 17:39:45 -0000
X-IronPort-AV: E=Sophos;i="5.20,219,1444694400"; d="scan'208";a="314660670"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Fri, 30 Oct 2015 17:39:23 +0000
Message-ID: <1446226763-29200-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 v2] Define NT_PROCESSOR_GROUPS for VS2012
	project
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

Previous patch missed the obvious compatability macros provided
and used by xenbus.
Also fixes a few badly formed ASSERTions

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xeniface/driver.c            | 2 ++
 src/xeniface/fdo.c               | 1 +
 src/xeniface/ioctl_evtchn.c      | 6 ++++--
 src/xeniface/ioctls.c            | 4 +++-
 vs2012/xeniface/xeniface.vcxproj | 4 ++--
 5 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/src/xeniface/driver.c b/src/xeniface/driver.c
index f4e8240..a843d00 100644
--- a/src/xeniface/driver.c
+++ b/src/xeniface/driver.c
@@ -30,6 +30,7 @@
  */
 
 #include <ntifs.h>
+#include <procgrp.h>
 #include <version.h>
 
 #include "fdo.h"
@@ -149,6 +150,7 @@ DriverEntry(
     ASSERT3P(DriverObject, ==, NULL);
 
     ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
+    WdmlibProcgrpInitialize();
 
     Trace("====>\n");
 
diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index 71ffbe2..fdb3edf 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -31,6 +31,7 @@
 
 
 #include <ntifs.h>
+#include <procgrp.h>
 #include <wdmguid.h>
 #include <ntstrsafe.h>
 #include <stdlib.h>
diff --git a/src/xeniface/ioctl_evtchn.c b/src/xeniface/ioctl_evtchn.c
index 93f1931..3b8ecb5 100644
--- a/src/xeniface/ioctl_evtchn.c
+++ b/src/xeniface/ioctl_evtchn.c
@@ -29,6 +29,8 @@
  * SUCH DAMAGE.
  */
 
+#include <ntifs.h>
+#include <procgrp.h>
 #include "driver.h"
 #include "ioctls.h"
 #include "xeniface_ioctls.h"
@@ -51,7 +53,7 @@ EvtchnNotificationDpc(
     UNREFERENCED_PARAMETER(_Context);
     UNREFERENCED_PARAMETER(Argument2);
 
-    ASSERT(Context);
+    ASSERT(Context != NULL);
 
 #if DBG
     XenIfaceDebugPrint(INFO, "Channel %p, LocalPort %d, Cpu %lu\n",
@@ -80,7 +82,7 @@ EvtchnInterruptHandler(
     ULONG ProcIndex;
 
     UNREFERENCED_PARAMETER(Interrupt);
-    ASSERT(Context);
+    ASSERT(Context != NULL);
 
     KeGetCurrentProcessorNumberEx(&ProcNumber);
     ProcIndex = KeGetProcessorIndexFromNumber(&ProcNumber);
diff --git a/src/xeniface/ioctls.c b/src/xeniface/ioctls.c
index b306a45..b93fd56 100644
--- a/src/xeniface/ioctls.c
+++ b/src/xeniface/ioctls.c
@@ -30,6 +30,8 @@
  * SUCH DAMAGE.
  */
 
+#include <ntifs.h>
+#include <procgrp.h>
 #include "driver.h"
 #include "ioctls.h"
 #include "xeniface_ioctls.h"
@@ -97,7 +99,7 @@ XenIfaceCleanup(
     KIRQL Irql;
     LIST_ENTRY ToFree;
 
-    XenIfaceDebugPrint(TRACE, "FO %p, IRQL %d, Cpu %lu\n", FileObject, KeGetCurrentIrql(), KeGetCurrentProcessorNumber());
+    //XenIfaceDebugPrint(TRACE, "FO %p, IRQL %d, Cpu %lu\n", FileObject, KeGetCurrentIrql(), KeGetCurrentProcessorNumber());
 
     // store watches
     KeAcquireSpinLock(&Fdo->StoreWatchLock, &Irql);
diff --git a/vs2012/xeniface/xeniface.vcxproj b/vs2012/xeniface/xeniface.vcxproj
index fadc1d1..c57e2a2 100644
--- a/vs2012/xeniface/xeniface.vcxproj
+++ b/vs2012/xeniface/xeniface.vcxproj
@@ -32,7 +32,7 @@
 	
     <ItemDefinitionGroup>       
 		<ClCompile>
-			<PreprocessorDefinitions>__MODULE__="XENIFACE";POOL_NX_OPTIN=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+			<PreprocessorDefinitions>__MODULE__="XENIFACE";POOL_NX_OPTIN=1;NT_PROCESSOR_GROUPS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 			<WarningLevel>EnableAllWarnings</WarningLevel>
 			<DisableSpecificWarnings>4711;4548;4820;4668;4255;6001;6054;%(DisableSpecificWarnings)</DisableSpecificWarnings>
 			<MultiProcessorCompilation>true</MultiProcessorCompilation>
@@ -40,7 +40,7 @@
 		</ClCompile>
 		<Link>
 			<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
-			<AdditionalDependencies>$(DDK_LIB_PATH)\ntstrsafe.lib;%(AdditionalDependencies)</AdditionalDependencies>
+			<AdditionalDependencies>$(DDK_LIB_PATH)\ntstrsafe.lib;$(DDK_LIB_PATH)\procgrp.lib;%(AdditionalDependencies)</AdditionalDependencies>
 			<EnableCOMDATFolding>false</EnableCOMDATFolding>
 		</Link>
 		<Inf>
-- 
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 Sat Oct 31 09:01:15 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Sat, 31 Oct 2015 09:01: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 1ZsS2D-0004IA-N7; Sat, 31 Oct 2015 09:01:13 +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 1ZsS2C-0004I0-C9
	for win-pv-devel@lists.xenproject.org; Sat, 31 Oct 2015 09:01:12 +0000
Received: from [193.109.254.147] by server-3.bemta-14.messagelabs.com id
	71/40-25435-75384365; Sat, 31 Oct 2015 09:01:11 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-16.tower-27.messagelabs.com!1446282070!30805987!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 31448 invoked from network); 31 Oct 2015 09:01:10 -0000
Received: from mail-wi0-f169.google.com (HELO mail-wi0-f169.google.com)
	(209.85.212.169)
	by server-16.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	31 Oct 2015 09:01:10 -0000
Received: by wicll6 with SMTP id ll6so23602199wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Sat, 31 Oct 2015 02:01:10 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=m2r_biz.20150623.gappssmtp.com; s=20150623;
	h=subject:to:references:cc:from:message-id:date:user-agent
	:mime-version:in-reply-to:content-type:content-transfer-encoding;
	bh=/uEqAh0ZFgzPd6OBtXbThnKeSXeLXwbxQsVMLxTx0vY=;
	b=SV/F2dJir68fy+wqctVjARLD9cq1yGOm/AgtvVtJ+tIzoe4QvWBmU52Hl8nBdES3Cd
	Pciu5UKdEyAx3+Iq2++xqEupVcvm2LlVwqKWm5+FYYf1h649SKOlaPJwlw1h1jUyHpSq
	/LDPo6Im9U9p4qqimzKN2O4qcozYFj9k//zNQAldeFu3W98drgl4a5k1v5wvzgKpdXe6
	bdd6FWf+pjRrQfgw/pTpunMXfVWf6soQdfWDKhFAalGnoW1Y5dgRv3tzCJQWoCS1ODY3
	BF29RC6OI1qQiRmEnmo1YYy7+Y/3wznGR/LwDzJi/eu1sWwlO4vC57iV83beNRiI7pco
	Oqow==
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:cc:from:message-id:date
	:user-agent:mime-version:in-reply-to:content-type
	:content-transfer-encoding;
	bh=/uEqAh0ZFgzPd6OBtXbThnKeSXeLXwbxQsVMLxTx0vY=;
	b=KvWyVOenc26lzGnJ+CmU10FGYdjZgWCj6CwdHuLjB91CYs1EYvOJMMozYLzKpukIW1
	FpSOYVsqGkYb/V3bXLxFaGVeMp1oemkdQukxMSa2mZdsSlbF89/bKGj35qklmeMwOF6K
	+periHweVaeb5rj7K7ep736cSruuxWxVYcPDk3iA2CFGRe06CxESTrohRq6u7wXaZ3ad
	SddFUjP/vWAlXnyjPU4ynEs3WmO71V+nsJAjU7f9s/zREpF9vc8F/QcSiv0WNtg8Zi5m
	1+/XlxGz/Avj0K9da9dxZk0B80+bx8Itr7N94AVulXZUy4yjPZ0A5QcXrebeQM6hAb4t
	VAHg==
X-Gm-Message-State: ALoCoQnWqCKrn5S75FvX6TbNYgQiZrGk8YwjKeZJFXJ7ARvByltHWrFmi5mKj/WURFgwgv1OYTOu
X-Received: by 10.194.48.113 with SMTP id k17mr12722466wjn.62.1446282070221;
	Sat, 31 Oct 2015 02:01:10 -0700 (PDT)
Received: from [192.168.11.12] ([94.166.233.80])
	by smtp.googlemail.com with ESMTPSA id
	l81sm6924254wmb.2.2015.10.31.02.01.08
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Sat, 31 Oct 2015 02:01:09 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>, =?UTF-8?B?w4lsacOhcyBUYW3DoXM=?=
	<et@etit.hu>
References: <562F93F5.9070505@etit.hu>
	<CABoYbGryR=rupt2DUROLeaCoYJqxVBC0VMpSiM1bjH4H2p-KZg@mail.gmail.com>
	<56308C66.1030806@etit.hu>
	<CAFLBxZZSO_re+Wt4_b1pnmgS33hXJS_SRhnvse9QW-NRpSTQ1A@mail.gmail.com>
	<563291B1.9080800@etit.hu>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F63DAEF@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <56348362.7050608@m2r.biz>
Date: Sat, 31 Oct 2015 10:01:22 +0100
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F63DAEF@AMSPEX01CL01.citrite.net>
Content-Length: 5172
Cc: "xen-users@lists.xen.org" <xen-users@lists.xen.org>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] [Xen-users] Removing old glpv windows drivers to
 install new -> inaccessible boot device
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: base64
Content-Type: text/plain; charset="utf-8"; Format="flowed"
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

SWwgMzAvMTAvMjAxNSAxMDo1NCwgUGF1bCBEdXJyYW50IGhhIHNjcml0dG86Cj4+IC0tLS0tT3Jp
Z2luYWwgTWVzc2FnZS0tLS0tCj4+IEZyb206IHdpbi1wdi1kZXZlbC1ib3VuY2VzQGxpc3RzLnhl
bnByb2plY3Qub3JnIFttYWlsdG86d2luLXB2LWRldmVsLQo+PiBib3VuY2VzQGxpc3RzLnhlbnBy
b2plY3Qub3JnXSBPbiBCZWhhbGYgT2Ygw4lsacOhcyBUYW3DoXMKPj4gU2VudDogMjkgT2N0b2Jl
ciAyMDE1IDIxOjM4Cj4+IENjOiB4ZW4tdXNlcnNAbGlzdHMueGVuLm9yZzsgd2luLXB2LWRldmVs
QGxpc3RzLnhlbnByb2plY3Qub3JnCj4+IFN1YmplY3Q6IFJlOiBbd2luLXB2LWRldmVsXSBbWGVu
LXVzZXJzXSBSZW1vdmluZyBvbGQgZ2xwdiB3aW5kb3dzIGRyaXZlcnMKPj4gdG8gaW5zdGFsbCBu
ZXcgLT4gaW5hY2Nlc3NpYmxlIGJvb3QgZGV2aWNlCj4+Cj4+IEhpIGFsbC4gVGhhbmsgeW91IGZv
ciB0aGUgdGlwcy4KPj4KPj4gSGVyZSBpcyB3aGF0IG5lZWRlZCB0byBiZSBkb25lLgo+Pgo+PiAt
IEJvb3QgaW4gc2FmZSBtb2RlLgo+PiAtIHVzZSB1bmluc3RhbGwuYmF0IHRvIHJlbW92ZSBvbGQg
ZHJpdmVycy4KPj4gLSB1c2UgY2NsZWFuZXIgb3Igc2ltaWxhciBhcHBsaWNhdGlvbiB0byByZW1v
dmUgb2xkIGRyaXZlciBpbnN0YWxsIGVudHJpZXMuCj4+IC0gc2NhbiB0aHJvdWdoIHRoZSBmaWxl
IHN5c3RlbSBlbmQgZGVsZXRlIHhlbioKPj4gLSBiY2RlZGl0IC1zZXQgVEVTVFNJR05JTkcgT04K
Pj4gLSBpbnN0YWxsIHBmeCBmaWxlcyB0byBsb2NhbCBjb21wdXRlciBjZXJ0IHN0b3JlLgo+PiAt
IHJlYm9vdCBpbnRvIHNhZmUgbW9kZQo+PiAtIGluc3RhbGwgbmV3IGRyaXZlcnMgKHhlbmJ1cywg
eGVudmlmLCBldGMpIHVzaW5nIGRwaW5zdC5leGUgKGFkbWluIG1vZGUpCj4+IC0gcmVib290IHRv
IG5vcm1hbCBtb2RlICh0aGVyZSB3aWxsIGJlIG5vIG5ldHdvcmssIG5vIHhlbiBkZXZpY2VzIGNh
biBiZQo+PiBzZWVuLCBldGMgZm9yIHNvbWUgcmVhc29uKQo+PiAtIGdvIHRvIGhhcmR3YXJlLCBj
aGVjayB1bmtub3duIFBDSSBkZXZpY2UgYW5kIG1hbnVhbGx5IGluc3RhbGwgeGVuYnVzCj4+IGZv
ciB0aGF0Lgo+PiAtIGFmdGVyIHRoaXMsIGFsbCBvdGhlciBkcml2ZXJzIGFwcGVhciBzdWRkZW5s
eS4KPj4gLSByZWJvb3QsIGRvbmUuCj4+Cj4+IEl0IHdvdWxkIGJlIG5pY2UgdG8gcmVtb3ZlIHRo
ZSB0ZXN0c2lnbmluZyB0aG91Z2gsIGJ1dCBhdCBsZXN0IGl0IGlzCj4+IHdvcmtpbmcgbm93Lgo+
IFRvIGdldCByaWQgb2YgdGhlIG5lZWQgZm9yIHRlc3RzaWduaW5nIGl0J3MgbmVjZXNzYXJ5IGZv
ciBkcml2ZXJzIHRvIGJlICdyZWFsZWFzZSBzaWduZWQnIGFuZCBpbiB0aGUgY2FzZSBvZiBXaW5k
b3dzIDEwIHRoaXMgbWVhbnMgdGhhdCB0aGV5IGhhdmUgdG8gYmUgc2lnbmVkIGRpcmVjdGx5IGJ5
IE1pY3Jvc29mdC4gVG8gYWNoaWV2ZSBhbGwgdGhpcyBjZXJ0aWZpY2F0ZXMgbXVzdCBiZSBwdXJj
aGFzZWQgYW5kIGZlZXMgbXVzdCBiZSBwYWlkIHRvIE1pY3Jvc29mdCBzbyBidWRnZXQgaXMgcmVx
dWlyZWQgZnJvbSBzb21ld2hlcmUuCj4KPiAgICBQYXVsCgpBYm91dCBidXlpbmcgdGhlIGNlcnRp
ZmljYXRlcyBhbmQgYW55IHRoaW5ncyByZWxhdGVkIHN0YXJ0aW5nIGEgCmNyb3dkZnVuZGluZyB3
b3VsZCBiZSByZWFsbHkgd2VsY29tZSwgaXNuJ3QgaXQ/IChpbiBzaXRlIGxpa2Uga2lja3N0YXJ0
ZXIpClNvIGFueW9uZSB3aG8gd2FudHMgY2FuIGNvbnRyaWJ1dGUgLSBJIHdpbGwgY29udHJpYnV0
ZSAtIG1vc3QgbGlrZWx5IAphbHNvIHRoZSBjb21wYW55IHdoZXJlIEknbSB3b3JraW5nIGFuZCBJ
IHN1cHBvc2Ugb3RoZXIgcGVvcGxlIHdvdWxkIGhlbHAgCnRvIGhhdmUgb2ZmaWNpYWwgc2lnbmVk
IGRyaXZlcnMgdG9vLgoKVGhhbmtzIGZvciBhbnkgcmVwbHkgYW5kIHNvcnJ5IGZvciBteSBiYWQg
ZW5nbGlzaC4KCj4KPj4gMjAxNS0xMC0yOSAxMDozOCBrZWx0ZXrDqXNzZWwsIEdlb3JnZSBEdW5s
YXAgw61ydGE6Cj4+PiBPbiBXZWQsIE9jdCAyOCwgMjAxNSBhdCA4OjUwIEFNLCDDiWxpw6FzIFRh
bcOhcyA8ZXRAZXRpdC5odT4gd3JvdGU6Cj4+Pj4gSGkuIFllcywgSSBjb25maXJtLCB0aGF0IGJv
b3RpbmcgaW50byBzYWZlIG1vZGUgaXMgcG9zc2libGUuIEkgdHVybmVkIG9uCj4+Pj4gdGVzdHNp
Z25pbmcgd2l0aCBiY2RlZGl0LCBhbmQgdHJpZWQgaW5zdGFsbGluZyB0aGUgZHJpdmVycyBhZ2Fp
bi4KPj4+Pgo+Pj4+IFRoZSBpc250YWxsIHdlbnQgZmluZSwgSSBjb3VsZCByZWJvb3QuIFVuZm9y
dHVuYXRlbHkgc2luY2UgdGhlbiAoaXQgaXMKPj4+PiBtb3JlIHRoZW4gOCBob3VycyBub3cpIEkn
bSBmYWNpbmcgdGhlIGF0dGFjaGVkIHNjcmVlbi4gVGhlIGFuaW1hdGlvbiBpcwo+Pj4+IGp1c3Qg
cm9sbGluZywgcm9sbGluZyByb2xsaW5nIGFuZCBub3RoaW5nIGhhcHBlbnMuIENQVSB0aWNrcyBh
cmUgdXNlZCwKPj4+PiBzbyBJIGFzc3VtZSBzb21ldGhpbmcgaXMgaGFwcGVuaW5nLCBidXQgaXQg
c2VlbWVzIHByZXR0eSBtdWNoIHN0dWNrLgo+Pj4+Cj4+Pj4gQW55IGlkZWFzPwo+Pj4gSSAqdGhp
bmsqIHRoZSBYZW5TZXJ2ZXIgUFYgZHJpdmVycyBhcmUgdXNpbmcgbWluaXBvcnQ7IGluIHdoaWNo
IGNhc2UKPj4+IHRoaXMgS0IgYXJ0aWNsZSBtaWdodCBiZSBvZiB1c2U6Cj4+Pgo+Pj4gaHR0cHM6
Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vZW4tdXMva2IvMjc5NTM5Nwo+Pj4KPj4+IFBhdWwgRHVy
cmFudCBjYW4gY29ycmVjdCBtZSBpZiBJJ20gd3JvbmcgYWJvdXQgbWluaXBvcnQgKGFuZCBtYXkg
YmUKPj4+IGFibGUgdG8gcG9pbnQgeW91IHRvIGEgbW9yZSB1c2VmdWwgZml4IGlmIHNvKS4KPj4+
Cj4+PiAgIC1HZW9yZ2UKPj4+Cj4+IC0tCj4+Cj4+Cj4+IMOJbGnDoXMgVGFtw6FzCj4+IFRob21h
cyBFbGlhcwo+Pgo+PiBFVElUW253cHJvXSBLRlQsIMOcZ3l2ZXpldMWRLUjDoWzDs3phdGJpenRv
bnPDoWdpIHNwZWNpYWxpc3RhCj4+IEVUSVRbbndwcm9dIEx0ZCwgR2VuZXJhbCBNYW5hZ2VyLU5l
dHdvcmsgc2VjdXJpdHkgc3BlY2lhbGlzdAo+Pgo+PiBUZWwuIEhVOiArMzYvMzAtNDk3LTE2MjYK
Pj4gVGVsLiBERTogKzQ5LzE2MC02NTEtODcyMwo+PiBPcGVuUEdQIHB1YmtleTogaHR0cDovL2V0
aXQuaHUvZG9jL2V0LXB1Yi5hc2MKPj4KPj4gT2tsZXZlbGVzIG3DqXJuw7ZrLWluZm9ybWF0aWt1
cyAoTVNDKQo+PiBNYXN0ZXIgb2YgU2NpZW5jZSBpbiBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IChN
U0MpCj4+Cj4+IEthcGNzb2xhdDogaHR0cDovL2V0aXQuaHUvaW5kZXgucGhwL2h1L2thcGNzb2xh
dAo+PiBKb2dpIG55aWxhdGtvemF0OiBodHRwOi8vZXRpdC5odS9kaXNjbGFpbWVyLWVtYWlsLWh1
LnR4dAo+PiBDb250YWN0OiBodHRwOi8vZXRpdC5odS9pbmRleC5waHAvZW4vY29udGFjdAo+PiBE
aXNjbGFpbWVyOiBodHRwOi8vZXRpdC5odS9kaXNjbGFpbWVyLWVtYWlsLWVuLnR4dAo+IF9fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4gd2luLXB2LWRldmVs
IG1haWxpbmcgbGlzdAo+IHdpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwo+IGh0dHA6
Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmluL21haWxtYW4vbGlzdGluZm8vd2luLXB2LWRl
dmVsCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18Kd2lu
LXB2LWRldmVsIG1haWxpbmcgbGlzdAp3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcK
aHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4vbWFpbG1hbi9saXN0aW5mby93aW4t
cHYtZGV2ZWw=

From win-pv-devel-bounces@lists.xenproject.org Sat Oct 31 09:01:15 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Sat, 31 Oct 2015 09:01: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 1ZsS2D-0004IA-N7; Sat, 31 Oct 2015 09:01:13 +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 1ZsS2C-0004I0-C9
	for win-pv-devel@lists.xenproject.org; Sat, 31 Oct 2015 09:01:12 +0000
Received: from [193.109.254.147] by server-3.bemta-14.messagelabs.com id
	71/40-25435-75384365; Sat, 31 Oct 2015 09:01:11 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-16.tower-27.messagelabs.com!1446282070!30805987!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 31448 invoked from network); 31 Oct 2015 09:01:10 -0000
Received: from mail-wi0-f169.google.com (HELO mail-wi0-f169.google.com)
	(209.85.212.169)
	by server-16.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	31 Oct 2015 09:01:10 -0000
Received: by wicll6 with SMTP id ll6so23602199wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Sat, 31 Oct 2015 02:01:10 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=m2r_biz.20150623.gappssmtp.com; s=20150623;
	h=subject:to:references:cc:from:message-id:date:user-agent
	:mime-version:in-reply-to:content-type:content-transfer-encoding;
	bh=/uEqAh0ZFgzPd6OBtXbThnKeSXeLXwbxQsVMLxTx0vY=;
	b=SV/F2dJir68fy+wqctVjARLD9cq1yGOm/AgtvVtJ+tIzoe4QvWBmU52Hl8nBdES3Cd
	Pciu5UKdEyAx3+Iq2++xqEupVcvm2LlVwqKWm5+FYYf1h649SKOlaPJwlw1h1jUyHpSq
	/LDPo6Im9U9p4qqimzKN2O4qcozYFj9k//zNQAldeFu3W98drgl4a5k1v5wvzgKpdXe6
	bdd6FWf+pjRrQfgw/pTpunMXfVWf6soQdfWDKhFAalGnoW1Y5dgRv3tzCJQWoCS1ODY3
	BF29RC6OI1qQiRmEnmo1YYy7+Y/3wznGR/LwDzJi/eu1sWwlO4vC57iV83beNRiI7pco
	Oqow==
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:cc:from:message-id:date
	:user-agent:mime-version:in-reply-to:content-type
	:content-transfer-encoding;
	bh=/uEqAh0ZFgzPd6OBtXbThnKeSXeLXwbxQsVMLxTx0vY=;
	b=KvWyVOenc26lzGnJ+CmU10FGYdjZgWCj6CwdHuLjB91CYs1EYvOJMMozYLzKpukIW1
	FpSOYVsqGkYb/V3bXLxFaGVeMp1oemkdQukxMSa2mZdsSlbF89/bKGj35qklmeMwOF6K
	+periHweVaeb5rj7K7ep736cSruuxWxVYcPDk3iA2CFGRe06CxESTrohRq6u7wXaZ3ad
	SddFUjP/vWAlXnyjPU4ynEs3WmO71V+nsJAjU7f9s/zREpF9vc8F/QcSiv0WNtg8Zi5m
	1+/XlxGz/Avj0K9da9dxZk0B80+bx8Itr7N94AVulXZUy4yjPZ0A5QcXrebeQM6hAb4t
	VAHg==
X-Gm-Message-State: ALoCoQnWqCKrn5S75FvX6TbNYgQiZrGk8YwjKeZJFXJ7ARvByltHWrFmi5mKj/WURFgwgv1OYTOu
X-Received: by 10.194.48.113 with SMTP id k17mr12722466wjn.62.1446282070221;
	Sat, 31 Oct 2015 02:01:10 -0700 (PDT)
Received: from [192.168.11.12] ([94.166.233.80])
	by smtp.googlemail.com with ESMTPSA id
	l81sm6924254wmb.2.2015.10.31.02.01.08
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Sat, 31 Oct 2015 02:01:09 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>, =?UTF-8?B?w4lsacOhcyBUYW3DoXM=?=
	<et@etit.hu>
References: <562F93F5.9070505@etit.hu>
	<CABoYbGryR=rupt2DUROLeaCoYJqxVBC0VMpSiM1bjH4H2p-KZg@mail.gmail.com>
	<56308C66.1030806@etit.hu>
	<CAFLBxZZSO_re+Wt4_b1pnmgS33hXJS_SRhnvse9QW-NRpSTQ1A@mail.gmail.com>
	<563291B1.9080800@etit.hu>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F63DAEF@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <56348362.7050608@m2r.biz>
Date: Sat, 31 Oct 2015 10:01:22 +0100
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.3.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F63DAEF@AMSPEX01CL01.citrite.net>
Content-Length: 5172
Cc: "xen-users@lists.xen.org" <xen-users@lists.xen.org>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] [Xen-users] Removing old glpv windows drivers to
 install new -> inaccessible boot device
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: base64
Content-Type: text/plain; charset="utf-8"; Format="flowed"
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

SWwgMzAvMTAvMjAxNSAxMDo1NCwgUGF1bCBEdXJyYW50IGhhIHNjcml0dG86Cj4+IC0tLS0tT3Jp
Z2luYWwgTWVzc2FnZS0tLS0tCj4+IEZyb206IHdpbi1wdi1kZXZlbC1ib3VuY2VzQGxpc3RzLnhl
bnByb2plY3Qub3JnIFttYWlsdG86d2luLXB2LWRldmVsLQo+PiBib3VuY2VzQGxpc3RzLnhlbnBy
b2plY3Qub3JnXSBPbiBCZWhhbGYgT2Ygw4lsacOhcyBUYW3DoXMKPj4gU2VudDogMjkgT2N0b2Jl
ciAyMDE1IDIxOjM4Cj4+IENjOiB4ZW4tdXNlcnNAbGlzdHMueGVuLm9yZzsgd2luLXB2LWRldmVs
QGxpc3RzLnhlbnByb2plY3Qub3JnCj4+IFN1YmplY3Q6IFJlOiBbd2luLXB2LWRldmVsXSBbWGVu
LXVzZXJzXSBSZW1vdmluZyBvbGQgZ2xwdiB3aW5kb3dzIGRyaXZlcnMKPj4gdG8gaW5zdGFsbCBu
ZXcgLT4gaW5hY2Nlc3NpYmxlIGJvb3QgZGV2aWNlCj4+Cj4+IEhpIGFsbC4gVGhhbmsgeW91IGZv
ciB0aGUgdGlwcy4KPj4KPj4gSGVyZSBpcyB3aGF0IG5lZWRlZCB0byBiZSBkb25lLgo+Pgo+PiAt
IEJvb3QgaW4gc2FmZSBtb2RlLgo+PiAtIHVzZSB1bmluc3RhbGwuYmF0IHRvIHJlbW92ZSBvbGQg
ZHJpdmVycy4KPj4gLSB1c2UgY2NsZWFuZXIgb3Igc2ltaWxhciBhcHBsaWNhdGlvbiB0byByZW1v
dmUgb2xkIGRyaXZlciBpbnN0YWxsIGVudHJpZXMuCj4+IC0gc2NhbiB0aHJvdWdoIHRoZSBmaWxl
IHN5c3RlbSBlbmQgZGVsZXRlIHhlbioKPj4gLSBiY2RlZGl0IC1zZXQgVEVTVFNJR05JTkcgT04K
Pj4gLSBpbnN0YWxsIHBmeCBmaWxlcyB0byBsb2NhbCBjb21wdXRlciBjZXJ0IHN0b3JlLgo+PiAt
IHJlYm9vdCBpbnRvIHNhZmUgbW9kZQo+PiAtIGluc3RhbGwgbmV3IGRyaXZlcnMgKHhlbmJ1cywg
eGVudmlmLCBldGMpIHVzaW5nIGRwaW5zdC5leGUgKGFkbWluIG1vZGUpCj4+IC0gcmVib290IHRv
IG5vcm1hbCBtb2RlICh0aGVyZSB3aWxsIGJlIG5vIG5ldHdvcmssIG5vIHhlbiBkZXZpY2VzIGNh
biBiZQo+PiBzZWVuLCBldGMgZm9yIHNvbWUgcmVhc29uKQo+PiAtIGdvIHRvIGhhcmR3YXJlLCBj
aGVjayB1bmtub3duIFBDSSBkZXZpY2UgYW5kIG1hbnVhbGx5IGluc3RhbGwgeGVuYnVzCj4+IGZv
ciB0aGF0Lgo+PiAtIGFmdGVyIHRoaXMsIGFsbCBvdGhlciBkcml2ZXJzIGFwcGVhciBzdWRkZW5s
eS4KPj4gLSByZWJvb3QsIGRvbmUuCj4+Cj4+IEl0IHdvdWxkIGJlIG5pY2UgdG8gcmVtb3ZlIHRo
ZSB0ZXN0c2lnbmluZyB0aG91Z2gsIGJ1dCBhdCBsZXN0IGl0IGlzCj4+IHdvcmtpbmcgbm93Lgo+
IFRvIGdldCByaWQgb2YgdGhlIG5lZWQgZm9yIHRlc3RzaWduaW5nIGl0J3MgbmVjZXNzYXJ5IGZv
ciBkcml2ZXJzIHRvIGJlICdyZWFsZWFzZSBzaWduZWQnIGFuZCBpbiB0aGUgY2FzZSBvZiBXaW5k
b3dzIDEwIHRoaXMgbWVhbnMgdGhhdCB0aGV5IGhhdmUgdG8gYmUgc2lnbmVkIGRpcmVjdGx5IGJ5
IE1pY3Jvc29mdC4gVG8gYWNoaWV2ZSBhbGwgdGhpcyBjZXJ0aWZpY2F0ZXMgbXVzdCBiZSBwdXJj
aGFzZWQgYW5kIGZlZXMgbXVzdCBiZSBwYWlkIHRvIE1pY3Jvc29mdCBzbyBidWRnZXQgaXMgcmVx
dWlyZWQgZnJvbSBzb21ld2hlcmUuCj4KPiAgICBQYXVsCgpBYm91dCBidXlpbmcgdGhlIGNlcnRp
ZmljYXRlcyBhbmQgYW55IHRoaW5ncyByZWxhdGVkIHN0YXJ0aW5nIGEgCmNyb3dkZnVuZGluZyB3
b3VsZCBiZSByZWFsbHkgd2VsY29tZSwgaXNuJ3QgaXQ/IChpbiBzaXRlIGxpa2Uga2lja3N0YXJ0
ZXIpClNvIGFueW9uZSB3aG8gd2FudHMgY2FuIGNvbnRyaWJ1dGUgLSBJIHdpbGwgY29udHJpYnV0
ZSAtIG1vc3QgbGlrZWx5IAphbHNvIHRoZSBjb21wYW55IHdoZXJlIEknbSB3b3JraW5nIGFuZCBJ
IHN1cHBvc2Ugb3RoZXIgcGVvcGxlIHdvdWxkIGhlbHAgCnRvIGhhdmUgb2ZmaWNpYWwgc2lnbmVk
IGRyaXZlcnMgdG9vLgoKVGhhbmtzIGZvciBhbnkgcmVwbHkgYW5kIHNvcnJ5IGZvciBteSBiYWQg
ZW5nbGlzaC4KCj4KPj4gMjAxNS0xMC0yOSAxMDozOCBrZWx0ZXrDqXNzZWwsIEdlb3JnZSBEdW5s
YXAgw61ydGE6Cj4+PiBPbiBXZWQsIE9jdCAyOCwgMjAxNSBhdCA4OjUwIEFNLCDDiWxpw6FzIFRh
bcOhcyA8ZXRAZXRpdC5odT4gd3JvdGU6Cj4+Pj4gSGkuIFllcywgSSBjb25maXJtLCB0aGF0IGJv
b3RpbmcgaW50byBzYWZlIG1vZGUgaXMgcG9zc2libGUuIEkgdHVybmVkIG9uCj4+Pj4gdGVzdHNp
Z25pbmcgd2l0aCBiY2RlZGl0LCBhbmQgdHJpZWQgaW5zdGFsbGluZyB0aGUgZHJpdmVycyBhZ2Fp
bi4KPj4+Pgo+Pj4+IFRoZSBpc250YWxsIHdlbnQgZmluZSwgSSBjb3VsZCByZWJvb3QuIFVuZm9y
dHVuYXRlbHkgc2luY2UgdGhlbiAoaXQgaXMKPj4+PiBtb3JlIHRoZW4gOCBob3VycyBub3cpIEkn
bSBmYWNpbmcgdGhlIGF0dGFjaGVkIHNjcmVlbi4gVGhlIGFuaW1hdGlvbiBpcwo+Pj4+IGp1c3Qg
cm9sbGluZywgcm9sbGluZyByb2xsaW5nIGFuZCBub3RoaW5nIGhhcHBlbnMuIENQVSB0aWNrcyBh
cmUgdXNlZCwKPj4+PiBzbyBJIGFzc3VtZSBzb21ldGhpbmcgaXMgaGFwcGVuaW5nLCBidXQgaXQg
c2VlbWVzIHByZXR0eSBtdWNoIHN0dWNrLgo+Pj4+Cj4+Pj4gQW55IGlkZWFzPwo+Pj4gSSAqdGhp
bmsqIHRoZSBYZW5TZXJ2ZXIgUFYgZHJpdmVycyBhcmUgdXNpbmcgbWluaXBvcnQ7IGluIHdoaWNo
IGNhc2UKPj4+IHRoaXMgS0IgYXJ0aWNsZSBtaWdodCBiZSBvZiB1c2U6Cj4+Pgo+Pj4gaHR0cHM6
Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vZW4tdXMva2IvMjc5NTM5Nwo+Pj4KPj4+IFBhdWwgRHVy
cmFudCBjYW4gY29ycmVjdCBtZSBpZiBJJ20gd3JvbmcgYWJvdXQgbWluaXBvcnQgKGFuZCBtYXkg
YmUKPj4+IGFibGUgdG8gcG9pbnQgeW91IHRvIGEgbW9yZSB1c2VmdWwgZml4IGlmIHNvKS4KPj4+
Cj4+PiAgIC1HZW9yZ2UKPj4+Cj4+IC0tCj4+Cj4+Cj4+IMOJbGnDoXMgVGFtw6FzCj4+IFRob21h
cyBFbGlhcwo+Pgo+PiBFVElUW253cHJvXSBLRlQsIMOcZ3l2ZXpldMWRLUjDoWzDs3phdGJpenRv
bnPDoWdpIHNwZWNpYWxpc3RhCj4+IEVUSVRbbndwcm9dIEx0ZCwgR2VuZXJhbCBNYW5hZ2VyLU5l
dHdvcmsgc2VjdXJpdHkgc3BlY2lhbGlzdAo+Pgo+PiBUZWwuIEhVOiArMzYvMzAtNDk3LTE2MjYK
Pj4gVGVsLiBERTogKzQ5LzE2MC02NTEtODcyMwo+PiBPcGVuUEdQIHB1YmtleTogaHR0cDovL2V0
aXQuaHUvZG9jL2V0LXB1Yi5hc2MKPj4KPj4gT2tsZXZlbGVzIG3DqXJuw7ZrLWluZm9ybWF0aWt1
cyAoTVNDKQo+PiBNYXN0ZXIgb2YgU2NpZW5jZSBpbiBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IChN
U0MpCj4+Cj4+IEthcGNzb2xhdDogaHR0cDovL2V0aXQuaHUvaW5kZXgucGhwL2h1L2thcGNzb2xh
dAo+PiBKb2dpIG55aWxhdGtvemF0OiBodHRwOi8vZXRpdC5odS9kaXNjbGFpbWVyLWVtYWlsLWh1
LnR4dAo+PiBDb250YWN0OiBodHRwOi8vZXRpdC5odS9pbmRleC5waHAvZW4vY29udGFjdAo+PiBE
aXNjbGFpbWVyOiBodHRwOi8vZXRpdC5odS9kaXNjbGFpbWVyLWVtYWlsLWVuLnR4dAo+IF9fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4gd2luLXB2LWRldmVs
IG1haWxpbmcgbGlzdAo+IHdpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwo+IGh0dHA6
Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmluL21haWxtYW4vbGlzdGluZm8vd2luLXB2LWRl
dmVsCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18Kd2lu
LXB2LWRldmVsIG1haWxpbmcgbGlzdAp3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcK
aHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4vbWFpbG1hbi9saXN0aW5mby93aW4t
cHYtZGV2ZWw=

