--- /dev/null
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer in the documentation and/or other
+ * materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _XENFILT_EMULATED_INTERFACE_H
+#define _XENFILT_EMULATED_INTERFACE_H
+
+#define DEFINE_EMULATED_OPERATIONS \
+ EMULATED_OPERATION(VOID, \
+ Acquire, \
+ ( \
+ IN PXENFILT_EMULATED_CONTEXT Context \
+ ) \
+ ) \
+ EMULATED_OPERATION(VOID, \
+ Release, \
+ ( \
+ IN PXENFILT_EMULATED_CONTEXT Context \
+ ) \
+ ) \
+ EMULATED_OPERATION(BOOLEAN, \
+ IsDevicePresent, \
+ ( \
+ IN PXENFILT_EMULATED_CONTEXT Context, \
+ IN PCHAR DeviceID, \
+ IN PCHAR InstanceID \
+ ) \
+ ) \
+ EMULATED_OPERATION(BOOLEAN, \
+ IsDiskPresent, \
+ ( \
+ IN PXENFILT_EMULATED_CONTEXT Context, \
+ IN ULONG Controller, \
+ IN ULONG Target, \
+ IN ULONG Lun \
+ ) \
+ )
+
+typedef struct _XENFILT_EMULATED_CONTEXT XENFILT_EMULATED_CONTEXT, *PXENFILT_EMULATED_CONTEXT;
+
+#define EMULATED_OPERATION(_Type, _Name, _Arguments) \
+ _Type (*EMULATED_ ## _Name) _Arguments;
+
+typedef struct _XENFILT_EMULATED_OPERATIONS {
+ DEFINE_EMULATED_OPERATIONS
+} XENFILT_EMULATED_OPERATIONS, *PXENFILT_EMULATED_OPERATIONS;
+
+#undef EMULATED_OPERATION
+
+typedef struct _XENFILT_EMULATED_INTERFACE XENFILT_EMULATED_INTERFACE, *PXENFILT_EMULATED_INTERFACE;
+
+// {062AAC96-2BF8-4A69-AD6B-154CF051E977}
+DEFINE_GUID(GUID_EMULATED_INTERFACE,
+ 0x62aac96,
+ 0x2bf8,
+ 0x4a69,
+ 0xad,
+ 0x6b,
+ 0x15,
+ 0x4c,
+ 0xf0,
+ 0x51,
+ 0xe9,
+ 0x77);
+
+#define EMULATED_INTERFACE_VERSION 4
+
+#define EMULATED_OPERATIONS(_Interface) \
+ (PXENFILT_EMULATED_OPERATIONS *)((ULONG_PTR)(_Interface))
+
+#define EMULATED_CONTEXT(_Interface) \
+ (PXENFILT_EMULATED_CONTEXT *)((ULONG_PTR)(_Interface) + sizeof (PVOID))
+
+#define EMULATED(_Operation, _Interface, ...) \
+ (*EMULATED_OPERATIONS(_Interface))->EMULATED_ ## _Operation((*EMULATED_CONTEXT(_Interface)), __VA_ARGS__)
+
+#endif // _XENFILT_EMULATED_INTERFACE_H
+
--- /dev/null
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer in the documentation and/or other
+ * materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _UTIL_H
+#define _UTIL_H
+
+#include <ntddk.h>
+
+#include "assert.h"
+
+#define P2ROUNDUP(_x, _a) \
+ (-(-(_x) & -(_a)))
+
+static FORCEINLINE LONG
+__ffs(
+ IN unsigned long long mask
+ )
+{
+ unsigned char *array = (unsigned char *)&mask;
+ unsigned int byte;
+ unsigned int bit;
+ unsigned char val;
+
+ val = 0;
+
+ byte = 0;
+ while (byte < 8) {
+ val = array[byte];
+
+ if (val != 0)
+ break;
+
+ byte++;
+ }
+ if (byte == 8)
+ return -1;
+
+ bit = 0;
+ while (bit < 8) {
+ if (val & 0x01)
+ break;
+
+ val >>= 1;
+ bit++;
+ }
+
+ return (byte * 8) + bit;
+}
+
+#define __ffu(_mask) \
+ __ffs(~(_mask))
+
+static FORCEINLINE VOID
+__CpuId(
+ IN ULONG Leaf,
+ OUT PULONG EAX OPTIONAL,
+ OUT PULONG EBX OPTIONAL,
+ OUT PULONG ECX OPTIONAL,
+ OUT PULONG EDX OPTIONAL
+ )
+{
+ ULONG Value[4] = {0};
+
+ __cpuid(Value, Leaf);
+
+ if (EAX)
+ *EAX = Value[0];
+
+ if (EBX)
+ *EBX = Value[1];
+
+ if (ECX)
+ *ECX = Value[2];
+
+ if (EDX)
+ *EDX = Value[3];
+}
+
+static FORCEINLINE LONG
+__InterlockedAdd(
+ IN LONG *Value,
+ IN LONG Delta
+ )
+{
+ LONG New;
+ LONG Old;
+
+ do {
+ Old = *Value;
+ New = Old + Delta;
+ } while (InterlockedCompareExchange(Value, New, Old) != Old);
+
+ return New;
+}
+
+static FORCEINLINE LONG
+__InterlockedSubtract(
+ IN LONG *Value,
+ IN LONG Delta
+ )
+{
+ LONG New;
+ LONG Old;
+
+ do {
+ Old = *Value;
+ New = Old - Delta;
+ } while (InterlockedCompareExchange(Value, New, Old) != Old);
+
+ return New;
+}
+
+typedef struct _NON_PAGED_BUFFER_HEADER {
+ SIZE_T Length;
+ ULONG Tag;
+} NON_PAGED_BUFFER_HEADER, *PNON_PAGED_BUFFER_HEADER;
+
+typedef struct _NON_PAGED_BUFFER_TRAILER {
+ ULONG Tag;
+} NON_PAGED_BUFFER_TRAILER, *PNON_PAGED_BUFFER_TRAILER;
+
+static FORCEINLINE PVOID
+__AllocateNonPagedPoolWithTag(
+ IN SIZE_T Length,
+ IN ULONG Tag
+ )
+{
+ PUCHAR Buffer;
+ PNON_PAGED_BUFFER_HEADER Header;
+ PNON_PAGED_BUFFER_TRAILER Trailer;
+
+ ASSERT(Length != 0);
+
+ Buffer = ExAllocatePoolWithTag(NonPagedPool,
+ sizeof (NON_PAGED_BUFFER_HEADER) +
+ Length +
+ sizeof (NON_PAGED_BUFFER_TRAILER),
+ Tag);
+ if (Buffer == NULL)
+ goto done;
+
+ RtlZeroMemory(Buffer,
+ sizeof (NON_PAGED_BUFFER_HEADER) +
+ Length +
+ sizeof (NON_PAGED_BUFFER_TRAILER));
+
+ Header = (PNON_PAGED_BUFFER_HEADER)Buffer;
+ Header->Length = Length;
+ Header->Tag = Tag;
+
+ Buffer += sizeof (NON_PAGED_BUFFER_HEADER);
+
+ Trailer = (PNON_PAGED_BUFFER_TRAILER)(Buffer + Length);
+ Trailer->Tag = Tag;
+
+done:
+ return Buffer;
+}
+
+static FORCEINLINE VOID
+__FreePoolWithTag(
+ IN PVOID _Buffer,
+ IN ULONG Tag
+ )
+{
+ PUCHAR Buffer = _Buffer;
+ SIZE_T Length;
+ PNON_PAGED_BUFFER_HEADER Header;
+ PNON_PAGED_BUFFER_TRAILER Trailer;
+
+ ASSERT(Buffer != NULL);
+
+ Buffer -= sizeof (NON_PAGED_BUFFER_HEADER);
+
+ Header = (PNON_PAGED_BUFFER_HEADER)Buffer;
+ ASSERT3U(Tag, ==, Header->Tag);
+ Length = Header->Length;
+
+ Buffer += sizeof (NON_PAGED_BUFFER_HEADER);
+
+ Trailer = (PNON_PAGED_BUFFER_TRAILER)(Buffer + Length);
+ ASSERT3U(Tag, ==, Trailer->Tag);
+
+ Buffer -= sizeof (NON_PAGED_BUFFER_HEADER);
+
+ RtlFillMemory(Buffer,
+ sizeof (NON_PAGED_BUFFER_HEADER) +
+ Length +
+ sizeof (NON_PAGED_BUFFER_TRAILER),
+ 0xAA);
+
+ ExFreePoolWithTag(Buffer, Tag);
+}
+
+static FORCEINLINE PMDL
+__AllocatePage(
+ VOID
+ )
+{
+ PHYSICAL_ADDRESS LowAddress;
+ PHYSICAL_ADDRESS HighAddress;
+ LARGE_INTEGER SkipBytes;
+ SIZE_T TotalBytes;
+ PMDL Mdl;
+ PUCHAR MdlMappedSystemVa;
+ NTSTATUS status;
+
+ LowAddress.QuadPart = 0ull;
+ HighAddress.QuadPart = ~0ull;
+ SkipBytes.QuadPart = 0ull;
+ TotalBytes = (SIZE_T)PAGE_SIZE;
+
+ Mdl = MmAllocatePagesForMdlEx(LowAddress,
+ HighAddress,
+ SkipBytes,
+ TotalBytes,
+ MmCached,
+ 0);
+
+ status = STATUS_NO_MEMORY;
+ if (Mdl == NULL)
+ goto fail1;
+
+ ASSERT((Mdl->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_PARTIAL_HAS_BEEN_MAPPED |
+ MDL_PARTIAL |
+ MDL_PARENT_MAPPED_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL |
+ MDL_IO_SPACE)) == 0);
+
+ MdlMappedSystemVa = MmMapLockedPagesSpecifyCache(Mdl,
+ KernelMode,
+ MmCached,
+ NULL,
+ FALSE,
+ NormalPagePriority);
+
+ status = STATUS_UNSUCCESSFUL;
+ if (MdlMappedSystemVa == NULL)
+ goto fail2;
+
+ ASSERT3P(MdlMappedSystemVa, ==, Mdl->MappedSystemVa);
+
+ RtlZeroMemory(MdlMappedSystemVa, PAGE_SIZE);
+
+ return Mdl;
+
+fail2:
+ Error("fail2\n");
+
+ MmFreePagesFromMdl(Mdl);
+ ExFreePool(Mdl);
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ return NULL;
+}
+
+static FORCEINLINE VOID
+__FreePage(
+ IN PMDL Mdl
+ )
+{
+ PUCHAR MdlMappedSystemVa;
+
+ ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ MdlMappedSystemVa = Mdl->MappedSystemVa;
+
+ RtlFillMemory(MdlMappedSystemVa, PAGE_SIZE, 0xAA);
+
+ MmUnmapLockedPages(MdlMappedSystemVa, Mdl);
+
+ MmFreePagesFromMdl(Mdl);
+}
+
+static FORCEINLINE PWCHAR
+__wcstok_r(
+ IN PWCHAR Buffer,
+ IN PWCHAR Delimiter,
+ IN OUT PWCHAR *Context
+ )
+{
+ PWCHAR Token;
+ PWCHAR End;
+
+ if (Buffer != NULL)
+ *Context = Buffer;
+
+ Token = *Context;
+
+ if (Token == NULL)
+ return NULL;
+
+ while (*Token != L'\0' &&
+ wcschr(Delimiter, *Token) != NULL)
+ Token++;
+
+ if (*Token == L'\0')
+ return NULL;
+
+ End = Token + 1;
+ while (*End != L'\0' &&
+ wcschr(Delimiter, *End) == NULL)
+ End++;
+
+ if (*End != L'\0')
+ *End++ = L'\0';
+
+ *Context = End;
+
+ return Token;
+}
+
+#endif // _UTIL_H
<ItemGroup>
<ClCompile Include="../../src/common/registry.c" />
<ClCompile Include="../../src/xenfilt/driver.c" />
+ <ClCompile Include="../../src/xenfilt/emulated.c" />
<ClCompile Include="../../src/xenfilt/fdo.c" />
<ClCompile Include="../../src/xenfilt/pdo.c" />
<ClCompile Include="../../src/xenfilt/thread.c" />
+++ /dev/null
-/* Copyright (c) Citrix Systems Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms,
- * with or without modification, are permitted provided
- * that the following conditions are met:
- *
- * * Redistributions of source code must retain the above
- * copyright notice, this list of conditions and the
- * following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the
- * following disclaimer in the documentation and/or other
- * materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _COMMON_UTIL_H
-#define _COMMON_UTIL_H
-
-#include <ntddk.h>
-
-#include "assert.h"
-
-#define P2ROUNDUP(_x, _a) \
- (-(-(_x) & -(_a)))
-
-static FORCEINLINE LONG
-__ffs(
- IN unsigned long long mask
- )
-{
- unsigned char *array = (unsigned char *)&mask;
- unsigned int byte;
- unsigned int bit;
- unsigned char val;
-
- val = 0;
-
- byte = 0;
- while (byte < 8) {
- val = array[byte];
-
- if (val != 0)
- break;
-
- byte++;
- }
- if (byte == 8)
- return -1;
-
- bit = 0;
- while (bit < 8) {
- if (val & 0x01)
- break;
-
- val >>= 1;
- bit++;
- }
-
- return (byte * 8) + bit;
-}
-
-#define __ffu(_mask) \
- __ffs(~(_mask))
-
-static FORCEINLINE VOID
-__CpuId(
- IN ULONG Leaf,
- OUT PULONG EAX OPTIONAL,
- OUT PULONG EBX OPTIONAL,
- OUT PULONG ECX OPTIONAL,
- OUT PULONG EDX OPTIONAL
- )
-{
- ULONG Value[4] = {0};
-
- __cpuid(Value, Leaf);
-
- if (EAX)
- *EAX = Value[0];
-
- if (EBX)
- *EBX = Value[1];
-
- if (ECX)
- *ECX = Value[2];
-
- if (EDX)
- *EDX = Value[3];
-}
-
-static FORCEINLINE LONG
-__InterlockedAdd(
- IN LONG *Value,
- IN LONG Delta
- )
-{
- LONG New;
- LONG Old;
-
- do {
- Old = *Value;
- New = Old + Delta;
- } while (InterlockedCompareExchange(Value, New, Old) != Old);
-
- return New;
-}
-
-static FORCEINLINE LONG
-__InterlockedSubtract(
- IN LONG *Value,
- IN LONG Delta
- )
-{
- LONG New;
- LONG Old;
-
- do {
- Old = *Value;
- New = Old - Delta;
- } while (InterlockedCompareExchange(Value, New, Old) != Old);
-
- return New;
-}
-
-typedef struct _NON_PAGED_BUFFER_HEADER {
- SIZE_T Length;
- ULONG Tag;
-} NON_PAGED_BUFFER_HEADER, *PNON_PAGED_BUFFER_HEADER;
-
-typedef struct _NON_PAGED_BUFFER_TRAILER {
- ULONG Tag;
-} NON_PAGED_BUFFER_TRAILER, *PNON_PAGED_BUFFER_TRAILER;
-
-static FORCEINLINE PVOID
-__AllocateNonPagedPoolWithTag(
- IN SIZE_T Length,
- IN ULONG Tag
- )
-{
- PUCHAR Buffer;
- PNON_PAGED_BUFFER_HEADER Header;
- PNON_PAGED_BUFFER_TRAILER Trailer;
-
- ASSERT(Length != 0);
-
- Buffer = ExAllocatePoolWithTag(NonPagedPool,
- sizeof (NON_PAGED_BUFFER_HEADER) +
- Length +
- sizeof (NON_PAGED_BUFFER_TRAILER),
- Tag);
- if (Buffer == NULL)
- goto done;
-
- RtlZeroMemory(Buffer,
- sizeof (NON_PAGED_BUFFER_HEADER) +
- Length +
- sizeof (NON_PAGED_BUFFER_TRAILER));
-
- Header = (PNON_PAGED_BUFFER_HEADER)Buffer;
- Header->Length = Length;
- Header->Tag = Tag;
-
- Buffer += sizeof (NON_PAGED_BUFFER_HEADER);
-
- Trailer = (PNON_PAGED_BUFFER_TRAILER)(Buffer + Length);
- Trailer->Tag = Tag;
-
-done:
- return Buffer;
-}
-
-static FORCEINLINE VOID
-__FreePoolWithTag(
- IN PVOID _Buffer,
- IN ULONG Tag
- )
-{
- PUCHAR Buffer = _Buffer;
- SIZE_T Length;
- PNON_PAGED_BUFFER_HEADER Header;
- PNON_PAGED_BUFFER_TRAILER Trailer;
-
- ASSERT(Buffer != NULL);
-
- Buffer -= sizeof (NON_PAGED_BUFFER_HEADER);
-
- Header = (PNON_PAGED_BUFFER_HEADER)Buffer;
- ASSERT3U(Tag, ==, Header->Tag);
- Length = Header->Length;
-
- Buffer += sizeof (NON_PAGED_BUFFER_HEADER);
-
- Trailer = (PNON_PAGED_BUFFER_TRAILER)(Buffer + Length);
- ASSERT3U(Tag, ==, Trailer->Tag);
-
- Buffer -= sizeof (NON_PAGED_BUFFER_HEADER);
-
- RtlFillMemory(Buffer,
- sizeof (NON_PAGED_BUFFER_HEADER) +
- Length +
- sizeof (NON_PAGED_BUFFER_TRAILER),
- 0xAA);
-
- ExFreePoolWithTag(Buffer, Tag);
-}
-
-static FORCEINLINE PMDL
-__AllocatePage(
- VOID
- )
-{
- PHYSICAL_ADDRESS LowAddress;
- PHYSICAL_ADDRESS HighAddress;
- LARGE_INTEGER SkipBytes;
- SIZE_T TotalBytes;
- PMDL Mdl;
- PUCHAR MdlMappedSystemVa;
- NTSTATUS status;
-
- LowAddress.QuadPart = 0ull;
- HighAddress.QuadPart = ~0ull;
- SkipBytes.QuadPart = 0ull;
- TotalBytes = (SIZE_T)PAGE_SIZE;
-
- Mdl = MmAllocatePagesForMdlEx(LowAddress,
- HighAddress,
- SkipBytes,
- TotalBytes,
- MmCached,
- 0);
-
- status = STATUS_NO_MEMORY;
- if (Mdl == NULL)
- goto fail1;
-
- ASSERT((Mdl->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA |
- MDL_PARTIAL_HAS_BEEN_MAPPED |
- MDL_PARTIAL |
- MDL_PARENT_MAPPED_SYSTEM_VA |
- MDL_SOURCE_IS_NONPAGED_POOL |
- MDL_IO_SPACE)) == 0);
-
- MdlMappedSystemVa = MmMapLockedPagesSpecifyCache(Mdl,
- KernelMode,
- MmCached,
- NULL,
- FALSE,
- NormalPagePriority);
-
- status = STATUS_UNSUCCESSFUL;
- if (MdlMappedSystemVa == NULL)
- goto fail2;
-
- ASSERT3P(MdlMappedSystemVa, ==, Mdl->MappedSystemVa);
-
- RtlZeroMemory(MdlMappedSystemVa, PAGE_SIZE);
-
- return Mdl;
-
-fail2:
- Error("fail2\n");
-
- MmFreePagesFromMdl(Mdl);
- ExFreePool(Mdl);
-
-fail1:
- Error("fail1 (%08x)\n", status);
-
- return NULL;
-}
-
-static FORCEINLINE VOID
-__FreePage(
- IN PMDL Mdl
- )
-{
- PUCHAR MdlMappedSystemVa;
-
- ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
- MdlMappedSystemVa = Mdl->MappedSystemVa;
-
- RtlFillMemory(MdlMappedSystemVa, PAGE_SIZE, 0xAA);
-
- MmUnmapLockedPages(MdlMappedSystemVa, Mdl);
-
- MmFreePagesFromMdl(Mdl);
-}
-
-static FORCEINLINE PWCHAR
-__wcstok_r(
- IN PWCHAR Buffer,
- IN PWCHAR Delimiter,
- IN OUT PWCHAR *Context
- )
-{
- PWCHAR Token;
- PWCHAR End;
-
- if (Buffer != NULL)
- *Context = Buffer;
-
- Token = *Context;
-
- if (Token == NULL)
- return NULL;
-
- while (*Token != L'\0' &&
- wcschr(Delimiter, *Token) != NULL)
- Token++;
-
- if (*Token == L'\0')
- return NULL;
-
- End = Token + 1;
- while (*End != L'\0' &&
- wcschr(Delimiter, *End) == NULL)
- End++;
-
- if (*End != L'\0')
- *End++ = L'\0';
-
- *Context = End;
-
- return Token;
-}
-
-#endif // _COMMON_UTIL_H
#include <version.h>
-#define VER_PRODUCTNAME_STR "Citrix PV Tools for Virtual Machines"
+#define VER_PRODUCTNAME_STR "XEN"
#define VER_PRODUCTVERSION MAJOR_VERSION,MINOR_VERSION,MICRO_VERSION,BUILD_NUMBER
#define VER_PRODUCTVERSION_STR MAJOR_VERSION_STR "." MINOR_VERSION_STR "." MICRO_VERSION_STR "." BUILD_NUMBER_STR
#define VER_INTERNALNAME_STR "XEN.SYS"
-#define VER_FILEDESCRIPTION_STR "Citrix Xen Hypervisor Interface"
+#define VER_FILEDESCRIPTION_STR "XEN"
#define VER_FILETYPE VFT_DRV
#define VER_FILESUBTYPE VFT2_DRV_SYSTEM
AddReg = XenBus_Parameters
[XenBus_Parameters]
+HKR,"Parameters",,0x00000010
HKR,"Parameters","SupportedClasses",0x00010000,"VIF","VBD","IFACE"
HKR,"Parameters","SyntheticClasses",0x00010000,"IFACE"
{
PXENBUS_BUS_CONTEXT Context = _Context;
- return PdoTranslateAddress(Context->Pdo,
- BusAddress,
- Length,
- AddressSpace,
- TranslatedAddress);
+ return PdoTranslateBusAddress(Context->Pdo,
+ BusAddress,
+ Length,
+ AddressSpace,
+ TranslatedAddress);
}
static
static
__drv_functionClass(GET_SET_DEVICE_DATA)
ULONG
-BusSetDeviceData(
+BusSetData(
IN PVOID _Context,
IN ULONG DataType,
IN PVOID Buffer,
{
PXENBUS_BUS_CONTEXT Context = _Context;
- return PdoSetData(Context->Pdo,
- DataType,
- Buffer,
- Offset,
- Length);
+ return PdoSetBusData(Context->Pdo,
+ DataType,
+ Buffer,
+ Offset,
+ Length);
}
static
__drv_functionClass(GET_SET_DEVICE_DATA)
ULONG
-BusGetDeviceData(
+BusGetData(
IN PVOID _Context,
IN ULONG DataType,
IN PVOID Buffer,
{
PXENBUS_BUS_CONTEXT Context = _Context;
- return PdoGetData(Context->Pdo,
- DataType,
- Buffer,
- Offset,
- Length);
+ return PdoGetBusData(Context->Pdo,
+ DataType,
+ Buffer,
+ Offset,
+ Length);
}
NTSTATUS
Interface->InterfaceDereference = BusDereference;
Interface->TranslateBusAddress = BusTranslateAddress;
Interface->GetDmaAdapter = BusGetDmaAdapter;
- Interface->SetBusData = BusSetDeviceData;
- Interface->GetBusData = BusGetDeviceData;
+ Interface->SetBusData = BusSetData;
+ Interface->GetBusData = BusGetData;
Trace("<====\n");
// map register related races in Windows 2008
DeviceDescription->InterfaceType = PCIBus;
- LowerAdapter = FdoGetDmaAdapter(PdoGetFdo(Pdo),
+ LowerAdapter = PdoGetDmaAdapter(Pdo,
DeviceDescription,
NumberOfMapRegisters);
ParametersKey = __DriverGetParametersKey();
- ActiveDeviceInstance = NULL;
if (ParametersKey != NULL) {
status = RegistryQuerySzValue(ParametersKey,
"ActiveDeviceInstance",
&ActiveDeviceInstance);
- ASSERT(IMPLY(!NT_SUCCESS(status), ActiveDeviceInstance == NULL));
+ if (!NT_SUCCESS(status))
+ ActiveDeviceInstance = NULL;
} else {
ActiveDeviceInstance = NULL;
}
NumberOfMapRegisters);
}
+BOOLEAN
+FdoTranslateBusAddress(
+ IN PXENBUS_FDO Fdo,
+ IN PHYSICAL_ADDRESS BusAddress,
+ IN ULONG Length,
+ IN OUT PULONG AddressSpace,
+ OUT PPHYSICAL_ADDRESS TranslatedAddress
+ )
+{
+ PBUS_INTERFACE_STANDARD LowerBusInterface;
+
+ LowerBusInterface = &Fdo->LowerBusInterface;
+
+ return LowerBusInterface->TranslateBusAddress(LowerBusInterface->Context,
+ BusAddress,
+ Length,
+ AddressSpace,
+ TranslatedAddress);
+}
+
+ULONG
+FdoSetBusData(
+ IN PXENBUS_FDO Fdo,
+ IN ULONG DataType,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length
+ )
+{
+ PBUS_INTERFACE_STANDARD LowerBusInterface;
+
+ LowerBusInterface = &Fdo->LowerBusInterface;
+
+ return LowerBusInterface->SetBusData(LowerBusInterface->Context,
+ DataType,
+ Buffer,
+ Offset,
+ Length);
+}
+
+ULONG
+FdoGetBusData(
+ IN PXENBUS_FDO Fdo,
+ IN ULONG DataType,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length
+ )
+{
+ PBUS_INTERFACE_STANDARD LowerBusInterface;
+
+ LowerBusInterface = &Fdo->LowerBusInterface;
+
+ return LowerBusInterface->GetBusData(LowerBusInterface->Context,
+ DataType,
+ Buffer,
+ Offset,
+ Length);
+}
+
static FORCEINLINE VOID
__FdoSetVendorName(
IN PXENBUS_FDO Fdo,
status = RtlStringCbPrintfA(Dx->Name,
MAXNAMELEN,
- "%s XEN",
+ "%s XENBUS",
__FdoGetVendorName(Fdo));
ASSERT(NT_SUCCESS(status));
}
status = RegistryQuerySzValue(ParametersKey,
"SyntheticClasses",
&SyntheticClasses);
- ASSERT(IMPLY(!NT_SUCCESS(status), SyntheticClasses == NULL));
+ if (!NT_SUCCESS(status))
+ SyntheticClasses = NULL;
} else {
SyntheticClasses = NULL;
}
status = RegistryQuerySzValue(ParametersKey,
"SupportedClasses",
&SupportedClasses);
- ASSERT(IMPLY(!NT_SUCCESS(status), SyntheticClasses == NULL));
+ if (!NT_SUCCESS(status))
+ SupportedClasses = NULL;
} else {
SupportedClasses = NULL;
}
OUT PULONG NumberOfMapRegisters
);
+extern BOOLEAN
+FdoTranslateBusAddress(
+ IN PXENBUS_FDO Fdo,
+ IN PHYSICAL_ADDRESS BusAddress,
+ IN ULONG Length,
+ IN OUT PULONG AddressSpace,
+ OUT PPHYSICAL_ADDRESS TranslatedAddress
+ );
+
+extern ULONG
+FdoSetBusData(
+ IN PXENBUS_FDO Fdo,
+ IN ULONG DataType,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length
+ );
+
+extern ULONG
+FdoGetBusData(
+ IN PXENBUS_FDO Fdo,
+ IN ULONG DataType,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length
+ );
+
extern PCHAR
-FdoGetName(
+FdoGetVendorName(
IN PXENBUS_FDO Fdo
);
-PCHAR
-FdoGetVendorName(
+extern PCHAR
+FdoGetName(
IN PXENBUS_FDO Fdo
);
PXENBUS_THREAD DevicePowerThread;
PIRP DevicePowerIrp;
- CHAR Class[MAXNAMELEN];
-
PXENBUS_FDO Fdo;
BOOLEAN Missing;
const CHAR *Reason;
}
static FORCEINLINE VOID
-__PdoSetClass(
+__PdoSetName(
IN PXENBUS_PDO Pdo,
- IN PANSI_STRING Class
+ IN PANSI_STRING Name
)
{
+ PXENBUS_DX Dx = Pdo->Dx;
NTSTATUS status;
- status = RtlStringCbPrintfA(Pdo->Class,
- MAXNAMELEN,
+ status = RtlStringCbPrintfA(Dx->Name,
+ MAX_DEVICE_ID_LEN,
"%Z",
- Class);
+ Name);
ASSERT(NT_SUCCESS(status));
}
static FORCEINLINE PCHAR
-__PdoGetClass(
+__PdoGetName(
+ IN PXENBUS_PDO Pdo
+ )
+{
+ PXENBUS_DX Dx = Pdo->Dx;
+
+ return Dx->Name;
+}
+
+PCHAR
+PdoGetName(
IN PXENBUS_PDO Pdo
)
{
- return Pdo->Class;
+ return __PdoGetName(Pdo);
}
struct _REVISION_ENTRY {
Revision = 0;
for (Entry = PdoRevisionTable; Entry->Name != NULL; Entry++) {
- if (strcmp(__PdoGetClass(Pdo), Entry->Name) == 0) {
+ if (strcmp(__PdoGetName(Pdo), Entry->Name) == 0) {
Revision = Entry->Revision;
break;
}
return Revision;
}
-static FORCEINLINE VOID
-__PdoSetName(
- IN PXENBUS_PDO Pdo,
- IN PCHAR VendorName
- )
-{
- PXENBUS_DX Dx = Pdo->Dx;
- NTSTATUS status;
-
- status = RtlStringCbPrintfA(Dx->Name,
- MAX_DEVICE_ID_LEN,
- "VEN_%s&DEV_%s&REV_%08X",
- VendorName,
- __PdoGetClass(Pdo),
- __PdoGetRevision(Pdo));
- ASSERT(NT_SUCCESS(status));
-}
-
-static FORCEINLINE PCHAR
-__PdoGetName(
- IN PXENBUS_PDO Pdo
- )
-{
- PXENBUS_DX Dx = Pdo->Dx;
-
- return Dx->Name;
-}
-
-PCHAR
-PdoGetName(
- IN PXENBUS_PDO Pdo
- )
-{
- return __PdoGetName(Pdo);
-}
-
static FORCEINLINE PDEVICE_OBJECT
__PdoGetDeviceObject(
IN PXENBUS_PDO Pdo
return __PdoGetFdo(Pdo);
}
+static FORCEINLINE PCHAR
+__PdoGetVendorName(
+ IN PXENBUS_PDO Pdo
+ )
+{
+ return FdoGetVendorName(__PdoGetFdo(Pdo));
+}
+
static FORCEINLINE PXENBUS_EVTCHN_INTERFACE
__PdoGetEvtchnInterface(
IN PXENBUS_PDO Pdo
return __PdoGetSharedInfoInterface(Pdo);
}
+PDMA_ADAPTER
+PdoGetDmaAdapter(
+ IN PXENBUS_PDO Pdo,
+ IN PDEVICE_DESCRIPTION DeviceDescriptor,
+ OUT PULONG NumberOfMapRegisters
+ )
+{
+ Trace("<===>\n");
+
+ return FdoGetDmaAdapter(__PdoGetFdo(Pdo),
+ DeviceDescriptor,
+ NumberOfMapRegisters);
+}
+
BOOLEAN
-PdoTranslateAddress(
+PdoTranslateBusAddress(
IN PXENBUS_PDO Pdo,
IN PHYSICAL_ADDRESS BusAddress,
IN ULONG Length,
OUT PPHYSICAL_ADDRESS TranslatedAddress
)
{
- UNREFERENCED_PARAMETER(Pdo);
- UNREFERENCED_PARAMETER(BusAddress);
- UNREFERENCED_PARAMETER(Length);
- UNREFERENCED_PARAMETER(AddressSpace);
- UNREFERENCED_PARAMETER(TranslatedAddress);
-
Trace("<===>\n");
- return FALSE;
+ return FdoTranslateBusAddress(__PdoGetFdo(Pdo),
+ BusAddress,
+ Length,
+ AddressSpace,
+ TranslatedAddress);
}
ULONG
-PdoSetData(
+PdoSetBusData(
IN PXENBUS_PDO Pdo,
IN ULONG DataType,
IN PVOID Buffer,
IN ULONG Length
)
{
- UNREFERENCED_PARAMETER(Pdo);
- UNREFERENCED_PARAMETER(DataType);
- UNREFERENCED_PARAMETER(Buffer);
- UNREFERENCED_PARAMETER(Offset);
- UNREFERENCED_PARAMETER(Length);
-
- // This function should not be called. Shout if it is.
- Warning("<===>\n");
+ Trace("<===>\n");
- return 0;
+ return FdoSetBusData(__PdoGetFdo(Pdo),
+ DataType,
+ Buffer,
+ Offset,
+ Length);
}
ULONG
-PdoGetData(
+PdoGetBusData(
IN PXENBUS_PDO Pdo,
IN ULONG DataType,
IN PVOID Buffer,
IN ULONG Length
)
{
- UNREFERENCED_PARAMETER(Pdo);
- UNREFERENCED_PARAMETER(DataType);
- UNREFERENCED_PARAMETER(Buffer);
- UNREFERENCED_PARAMETER(Offset);
- UNREFERENCED_PARAMETER(Length);
-
- // This function should not be called. Shout if it is.
- Warning("<===>\n");
+ Trace("<===>\n");
- return 0;
+ return FdoGetBusData(__PdoGetFdo(Pdo),
+ DataType,
+ Buffer,
+ Offset,
+ Length);
}
static FORCEINLINE VOID
MAXTEXTLEN,
L"%hs %hs",
FdoGetName(__PdoGetFdo(Pdo)),
- __PdoGetClass(Pdo));
+ __PdoGetName(Pdo));
ASSERT(NT_SUCCESS(status));
Buffer += wcslen(Buffer);
status = RtlStringCbPrintfW(Buffer,
MAXTEXTLEN,
L"%hs",
- __PdoGetClass(Pdo));
+ __PdoGetName(Pdo));
ASSERT(NT_SUCCESS(status));
Buffer += wcslen(Buffer);
status = RtlStringCbPrintfW(Buffer,
MAX_DEVICE_ID_LEN,
- L"XENBUS\\%hs",
- __PdoGetName(Pdo));
+ L"XENBUS\\VEN_%hs&DEV_%hs&REV_%08X",
+ __PdoGetVendorName(Pdo),
+ __PdoGetName(Pdo),
+ __PdoGetRevision(Pdo));
ASSERT(NT_SUCCESS(status));
Buffer += wcslen(Buffer);
Length = MAX_DEVICE_ID_LEN;
status = RtlStringCbPrintfW(Buffer,
Length,
- L"XENBUS\\%hs",
- __PdoGetName(Pdo));
+ L"XENBUS\\VEN_%hs&DEV_%hs&REV_%08X",
+ __PdoGetVendorName(Pdo),
+ __PdoGetName(Pdo),
+ __PdoGetRevision(Pdo));
ASSERT(NT_SUCCESS(status));
Buffer += wcslen(Buffer);
NTSTATUS
PdoCreate(
IN PXENBUS_FDO Fdo,
- IN PANSI_STRING Class
+ IN PANSI_STRING Name
)
{
PDEVICE_OBJECT PhysicalDeviceObject;
Pdo->Dx = Dx;
- status = BusInitialize(Pdo, &Pdo->BusInterface);
+ status = ThreadCreate(PdoSystemPower, Pdo, &Pdo->SystemPowerThread);
if (!NT_SUCCESS(status))
goto fail3;
- status = ThreadCreate(PdoSystemPower, Pdo, &Pdo->SystemPowerThread);
+ status = ThreadCreate(PdoDevicePower, Pdo, &Pdo->DevicePowerThread);
if (!NT_SUCCESS(status))
goto fail4;
- status = ThreadCreate(PdoDevicePower, Pdo, &Pdo->DevicePowerThread);
+ __PdoSetName(Pdo, Name);
+
+ status = BusInitialize(Pdo, &Pdo->BusInterface);
if (!NT_SUCCESS(status))
goto fail5;
- __PdoSetClass(Pdo, Class);
- __PdoSetName(Pdo, FdoGetVendorName(Fdo));
-
Info("%p (%s)\n",
PhysicalDeviceObject,
__PdoGetName(Pdo));
fail5:
Error("fail5\n");
- ThreadAlert(Pdo->SystemPowerThread);
- ThreadJoin(Pdo->SystemPowerThread);
- Pdo->SystemPowerThread = NULL;
+ ThreadAlert(Pdo->DevicePowerThread);
+ ThreadJoin(Pdo->DevicePowerThread);
+ Pdo->DevicePowerThread = NULL;
fail4:
Error("fail4\n");
- BusTeardown(&Pdo->BusInterface);
+ ThreadAlert(Pdo->SystemPowerThread);
+ ThreadJoin(Pdo->SystemPowerThread);
+ Pdo->SystemPowerThread = NULL;
fail3:
Error("fail3\n");
Dx->Pdo = NULL;
- RtlZeroMemory(Pdo->Class, MAXNAMELEN);
+ BusTeardown(&Pdo->BusInterface);
ThreadAlert(Pdo->DevicePowerThread);
ThreadJoin(Pdo->DevicePowerThread);
ThreadJoin(Pdo->SystemPowerThread);
Pdo->SystemPowerThread = NULL;
- BusTeardown(&Pdo->BusInterface);
-
Pdo->Dx = NULL;
ASSERT(IsZeroMemory(Pdo, sizeof (XENBUS_PDO)));
IN PXENBUS_PDO Pdo
);
+extern PXENBUS_FDO
+PdoGetFdo(
+ IN PXENBUS_PDO Pdo
+ );
+
+extern PDMA_ADAPTER
+PdoGetDmaAdapter(
+ IN PXENBUS_PDO Pdo,
+ IN PDEVICE_DESCRIPTION DeviceDescriptor,
+ OUT PULONG NumberOfMapRegisters
+ );
+
extern BOOLEAN
-PdoTranslateAddress(
+PdoTranslateBusAddress(
IN PXENBUS_PDO Pdo,
IN PHYSICAL_ADDRESS BusAddress,
IN ULONG Length,
OUT PPHYSICAL_ADDRESS TranslatedAddress
);
-extern PXENBUS_FDO
-PdoGetFdo(
- IN PXENBUS_PDO Pdo
- );
-
extern ULONG
-PdoSetData(
+PdoSetBusData(
IN PXENBUS_PDO Pdo,
IN ULONG DataType,
IN PVOID Buffer,
);
extern ULONG
-PdoGetData(
+PdoGetBusData(
IN PXENBUS_PDO Pdo,
IN ULONG DataType,
IN PVOID Buffer,
#include <version.h>
-#define VER_PRODUCTNAME_STR "Citrix PV Tools for Virtual Machines"
+#define VER_PRODUCTNAME_STR "XENBUS"
#define VER_PRODUCTVERSION MAJOR_VERSION,MINOR_VERSION,MICRO_VERSION,BUILD_NUMBER
#define VER_PRODUCTVERSION_STR MAJOR_VERSION_STR "." MINOR_VERSION_STR "." MICRO_VERSION_STR "." BUILD_NUMBER_STR
#define VER_INTERNALNAME_STR "XENBUS.SYS"
-#define VER_FILEDESCRIPTION_STR "Citrix PV Bus Driver"
+#define VER_FILEDESCRIPTION_STR "XENBUS"
#define VER_FILETYPE VFT_DRV
#define VER_FILESUBTYPE VFT2_DRV_SYSTEM
#include "fdo.h"
#include "pdo.h"
#include "registry.h"
+#include "emulated.h"
#include "driver.h"
#include "dbg_print.h"
#include "assert.h"
extern PULONG InitSafeBootMode;
typedef struct _XENFILT_DRIVER {
- PDRIVER_OBJECT DriverObject;
- HANDLE ParametersKey;
+ PDRIVER_OBJECT DriverObject;
+ HANDLE ParametersKey;
+ XENFILT_EMULATED_INTERFACE EmulatedInterface;
} XENFILT_DRIVER, *PXENFILT_DRIVER;
static XENFILT_DRIVER Driver;
return __DriverGetParametersKey();
}
+static FORCEINLINE PXENFILT_EMULATED_INTERFACE
+__DriverGetEmulatedInterface(
+ VOID
+ )
+{
+ return &Driver.EmulatedInterface;
+}
+
+PXENFILT_EMULATED_INTERFACE
+DriverGetEmulatedInterface(
+ VOID
+ )
+{
+ return __DriverGetEmulatedInterface();
+}
+
DRIVER_UNLOAD DriverUnload;
VOID
if (*InitSafeBootMode > 0)
goto done;
+ EmulatedTeardown(&Driver.EmulatedInterface);
+
ParametersKey = __DriverGetParametersKey();
if (ParametersKey != NULL) {
RegistryCloseKey(ParametersKey);
if (NT_SUCCESS(status))
__DriverSetParametersKey(ParametersKey);
+ status = EmulatedInitialize(&Driver.EmulatedInterface);
+ if (!NT_SUCCESS(status))
+ goto fail3;
+
RegistryCloseKey(ServiceKey);
DriverObject->DriverExtension->AddDevice = AddDevice;
Trace("<====\n");
return STATUS_SUCCESS;
+fail3:
+ Error("fail3\n");
+
+ if (ParametersKey != NULL) {
+ RegistryCloseKey(ParametersKey);
+ __DriverSetParametersKey(NULL);
+ }
+
fail2:
Error("fail2\n");
--- /dev/null
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer in the documentation and/or other
+ * materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <ntddk.h>
+#include <ntstrsafe.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <xen.h>
+#include <util.h>
+
+#include "registry.h"
+#include "emulated.h"
+#include "dbg_print.h"
+#include "assert.h"
+
+struct _XENFILT_EMULATED_CONTEXT {
+ LONG References;
+};
+
+#define EMULATED_TAG 'LUME'
+
+static FORCEINLINE PVOID
+__EmulatedAllocate(
+ IN ULONG Length
+ )
+{
+ return __AllocateNonPagedPoolWithTag(Length, EMULATED_TAG);
+}
+
+static FORCEINLINE VOID
+__EmulatedFree(
+ IN PVOID Buffer
+ )
+{
+ __FreePoolWithTag(Buffer, EMULATED_TAG);
+}
+
+static BOOLEAN
+EmulatedIsDevicePresent(
+ IN PXENFILT_EMULATED_CONTEXT Context,
+ IN PCHAR DeviceID,
+ IN PCHAR InstanceID
+ )
+{
+ UNREFERENCED_PARAMETER(Context);
+ UNREFERENCED_PARAMETER(DeviceID);
+ UNREFERENCED_PARAMETER(InstanceID);
+
+ return TRUE;
+}
+
+static BOOLEAN
+EmulatedIsDiskPresent(
+ IN PXENFILT_EMULATED_CONTEXT Context,
+ IN ULONG Controller,
+ IN ULONG Target,
+ IN ULONG Lun
+ )
+{
+ UNREFERENCED_PARAMETER(Context);
+ UNREFERENCED_PARAMETER(Controller);
+ UNREFERENCED_PARAMETER(Target);
+ UNREFERENCED_PARAMETER(Lun);
+
+ return TRUE;
+}
+
+static VOID
+EmulatedAcquire(
+ IN PXENFILT_EMULATED_CONTEXT Context
+ )
+{
+ InterlockedIncrement(&Context->References);
+}
+
+static VOID
+EmulatedRelease(
+ IN PXENFILT_EMULATED_CONTEXT Context
+ )
+{
+ ASSERT(Context->References != 0);
+ InterlockedDecrement(&Context->References);
+}
+
+#define EMULATED_OPERATION(_Type, _Name, _Arguments) \
+ Emulated ## _Name,
+
+static XENFILT_EMULATED_OPERATIONS Operations = {
+ DEFINE_EMULATED_OPERATIONS
+};
+
+#undef EMULATED_OPERATION
+
+NTSTATUS
+EmulatedInitialize(
+ OUT PXENFILT_EMULATED_INTERFACE Interface
+ )
+{
+ PXENFILT_EMULATED_CONTEXT Context;
+ NTSTATUS status;
+
+ Trace("====>\n");
+
+ Context = __EmulatedAllocate(sizeof (XENFILT_EMULATED_CONTEXT));
+
+ status = STATUS_NO_MEMORY;
+ if (Context == NULL)
+ goto fail1;
+
+ Interface->Context = Context;
+ Interface->Operations = &Operations;
+
+ Trace("<====\n");
+
+ return STATUS_SUCCESS;
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ return status;
+}
+
+VOID
+EmulatedTeardown(
+ IN OUT PXENFILT_EMULATED_INTERFACE Interface
+ )
+{
+ PXENFILT_EMULATED_CONTEXT Context = Interface->Context;
+
+ Trace("====>\n");
+
+ ASSERT(IsZeroMemory(Context, sizeof (XENFILT_EMULATED_CONTEXT)));
+ __EmulatedFree(Context);
+
+ RtlZeroMemory(Interface, sizeof (XENFILT_EMULATED_INTERFACE));
+
+ Trace("<====\n");
+}
--- /dev/null
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer in the documentation and/or other
+ * materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _XENFILT_EMULATED_H
+#define _XENFILT_EMULATED_H
+
+#include <ntddk.h>
+#include <xen.h>
+#include <emulated_interface.h>
+
+struct _XENFILT_EMULATED_INTERFACE {
+ PXENFILT_EMULATED_OPERATIONS Operations;
+ PXENFILT_EMULATED_CONTEXT Context;
+};
+
+C_ASSERT(FIELD_OFFSET(XENFILT_EMULATED_INTERFACE, Operations) == (ULONG_PTR)EMULATED_OPERATIONS(NULL));
+C_ASSERT(FIELD_OFFSET(XENFILT_EMULATED_INTERFACE, Context) == (ULONG_PTR)EMULATED_CONTEXT(NULL));
+
+extern NTSTATUS
+EmulatedInitialize(
+ OUT PXENFILT_EMULATED_INTERFACE Interface
+ );
+
+extern VOID
+EmulatedTeardown(
+ IN OUT PXENFILT_EMULATED_INTERFACE Interface
+ );
+
+#endif // _XENFILT_EMULATED_H
#include <version.h>
-#define VER_PRODUCTNAME_STR "Citrix PV Tools for Virtual Machines"
+#define VER_PRODUCTNAME_STR "XENFILT"
#define VER_PRODUCTVERSION MAJOR_VERSION,MINOR_VERSION,MICRO_VERSION,BUILD_NUMBER
#define VER_PRODUCTVERSION_STR MAJOR_VERSION_STR "." MINOR_VERSION_STR "." MICRO_VERSION_STR "." BUILD_NUMBER_STR
#define VER_INTERNALNAME_STR "XENFILT.SYS"
-#define VER_FILEDESCRIPTION_STR "Citrix Bus Filter Driver"
+#define VER_FILEDESCRIPTION_STR "XENFILT"
#define VER_FILETYPE VFT_DRV
#define VER_FILESUBTYPE VFT2_DRV_SYSTEM