summaryrefslogtreecommitdiff
path: root/sd
diff options
context:
space:
mode:
Diffstat (limited to 'sd')
-rw-r--r--sd/miniport/sdhc/inbox/sdhc.vcxproj4
-rw-r--r--sd/miniport/sdhc/inbox/sdhc.vcxproj.Filters8
-rw-r--r--sd/miniport/sdhc/sdhc.c116
-rw-r--r--sd/miniport/sdhc/sdhc.h17
-rw-r--r--sd/miniport/sdhc/sdhc.sln18
-rw-r--r--sd/sdiomars/mars.vcxproj4
-rw-r--r--sd/sdiomars/mars.vcxproj.Filters8
-rw-r--r--sd/sdiomars/sdiomars.sln18
8 files changed, 134 insertions, 59 deletions
diff --git a/sd/miniport/sdhc/inbox/sdhc.vcxproj b/sd/miniport/sdhc/inbox/sdhc.vcxproj
index cd4c4273..054462d4 100644
--- a/sd/miniport/sdhc/inbox/sdhc.vcxproj
+++ b/sd/miniport/sdhc/inbox/sdhc.vcxproj
@@ -19,11 +19,11 @@
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
- <ProjectGuid>{2619C7A0-9593-4B9D-B7B6-39315EB8B689}</ProjectGuid>
+ <ProjectGuid>{10452736-7C4F-4206-94F9-AD634213C9C4}</ProjectGuid>
<RootNamespace>$(MSBuildProjectName)</RootNamespace>
<Configuration Condition="'$(Configuration)' == ''">Debug</Configuration>
<Platform Condition="'$(Platform)' == ''">Win32</Platform>
- <SampleGuid>{2621B937-3FC0-4A3C-8DCD-507E2A3C8CCF}</SampleGuid>
+ <SampleGuid>{BF01AA4F-592C-4E53-A80E-E8E61BE4F7BC}</SampleGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
diff --git a/sd/miniport/sdhc/inbox/sdhc.vcxproj.Filters b/sd/miniport/sdhc/inbox/sdhc.vcxproj.Filters
index b79c2a1f..c37b6a7e 100644
--- a/sd/miniport/sdhc/inbox/sdhc.vcxproj.Filters
+++ b/sd/miniport/sdhc/inbox/sdhc.vcxproj.Filters
@@ -3,19 +3,19 @@
<ItemGroup>
<Filter Include="Source Files">
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions>
- <UniqueIdentifier>{0D7C22F4-3833-4FF6-AEC7-EB6D0AA2C27A}</UniqueIdentifier>
+ <UniqueIdentifier>{DDB410DD-88B9-435E-8F12-9B76CDBF781D}</UniqueIdentifier>
</Filter>
<Filter Include="Header Files">
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
- <UniqueIdentifier>{32B2D023-A9AF-4DF5-A1A0-6D1B8BD5DE92}</UniqueIdentifier>
+ <UniqueIdentifier>{968DB77B-5C06-4BFE-89A3-21FC86AA2045}</UniqueIdentifier>
</Filter>
<Filter Include="Resource Files">
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions>
- <UniqueIdentifier>{AC9D724E-A9F5-4CB5-86A4-5DBA92452CF4}</UniqueIdentifier>
+ <UniqueIdentifier>{61C7F1C7-4FC2-4BB2-AD6B-939B62C88F02}</UniqueIdentifier>
</Filter>
<Filter Include="Driver Files">
<Extensions>inf;inv;inx;mof;mc;</Extensions>
- <UniqueIdentifier>{4A3A774C-B573-4EC1-9364-469F243356D0}</UniqueIdentifier>
+ <UniqueIdentifier>{CE4A0734-7B47-4CE8-8A72-233C81D37C5E}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
diff --git a/sd/miniport/sdhc/sdhc.c b/sd/miniport/sdhc/sdhc.c
index 35403a30..54abe413 100644
--- a/sd/miniport/sdhc/sdhc.c
+++ b/sd/miniport/sdhc/sdhc.c
@@ -87,12 +87,14 @@ Return Value:
InitializationData.SaveContext = SdhcSaveContext;
InitializationData.RestoreContext = SdhcRestoreContext;
InitializationData.PowerControlCallback = SdhcPoFxPowerControlCallback;
+ InitializationData.Cleanup = SdhcCleanup;
//
// Provide the number of slots and their size.
//
InitializationData.PrivateExtensionSize = sizeof(SDHC_EXTENSION);
+ InitializationData.CrashdumpSupported = TRUE;
//
// Hook up the IRP dispatch routines.
@@ -222,7 +224,8 @@ SdhcSlotInitialize(
_In_ PVOID PrivateExtension,
_In_ PHYSICAL_ADDRESS PhysicalBase,
_In_ PVOID VirtualBase,
- _In_ ULONG Length
+ _In_ ULONG Length,
+ _In_ BOOLEAN CrashdumpMode
)
/*++
@@ -235,6 +238,14 @@ Arguments:
SlotExtension - SlotExtension interface between sdhost and this miniport.
+ PhysicalBase - Physical base address of the host controller register space.
+
+ VirtualBase - Mapped register space.
+
+ Length - Length of the host register set in bytes.
+
+ CrashdumpMode - whether this miniport is being used for crashdump.
+
Return value:
NTSTATUS
@@ -267,6 +278,12 @@ Return value:
(PSD_HOST_CONTROLLER_REGISTERS) VirtualBase;
//
+ // Check whether the driver is in crashdump mode.
+ //
+
+ SdhcExtension->CrashdumpMode = CrashdumpMode;
+
+ //
// Initialize host capabilities.
//
@@ -499,8 +516,11 @@ Return value:
break;
case SdSetSignalingVoltage:
- Status = SdhcSetSignaling(SdhcExtension,
- BusOperation->Parameters.SignalingVoltage);
+ Status =
+ SdhcSetSignaling(
+ SdhcExtension,
+ (BOOLEAN)(BusOperation->Parameters.SignalingVoltage ==
+ SdSignalingVoltage18));
break;
@@ -608,9 +628,9 @@ SdhcSlotInterrupt(
_In_ PVOID PrivateExtension,
_Out_ PULONG Events,
_Out_ PULONG Errors,
- _Out_ PBOOLEAN NotifyCardChange,
- _Out_ PBOOLEAN NotifySdioInterrupt,
- _Out_ PBOOLEAN NotifyTuning
+ _Out_ PBOOLEAN CardChange,
+ _Out_ PBOOLEAN SdioInterrupt,
+ _Out_ PBOOLEAN Tuning
)
/*++
@@ -654,8 +674,7 @@ Return value:
//
if (*Events & SDHC_IS_CARD_DETECT) {
- *NotifyCardChange = TRUE;
- *Events &= ~SDHC_IS_CARD_DETECT;
+ *CardChange = TRUE;
}
//
@@ -663,8 +682,7 @@ Return value:
//
if (*Events & SDHC_IS_CARD_INTERRUPT) {
- *NotifySdioInterrupt = TRUE;
- *Events &= ~SDHC_IS_CARD_INTERRUPT;
+ *SdioInterrupt = TRUE;
}
//
@@ -672,8 +690,7 @@ Return value:
//
if (*Events & SDHC_IS_TUNING_INTERRUPT) {
- *NotifyTuning = TRUE;
- *Events &= ~SDHC_IS_TUNING_INTERRUPT;
+ *Tuning = TRUE;
}
//
@@ -684,7 +701,11 @@ Return value:
//
SdhcAcknowledgeInterrupts(SdhcExtension, (USHORT) *Events);
- return (*Events != 0);
+ *Events &= ~(SDHC_IS_CARD_DETECT |
+ SDHC_IS_CARD_INTERRUPT |
+ SDHC_IS_TUNING_INTERRUPT);
+
+ return (*Events != 0) || (*CardChange) || (*SdioInterrupt) || (*Tuning);
}
NTSTATUS
@@ -1029,7 +1050,32 @@ Return value:
return STATUS_NOT_IMPLEMENTED;
}
-
+
+VOID
+SdhcCleanup(
+ _In_ PSD_MINIPORT Miniport
+ )
+
+/*++
+
+Routine Description:
+
+ Cleanup any memory allocations done during the lifetime of the driver.
+
+Arguments:
+
+ Miniport - Miniport interface for the controller.
+
+Return value:
+
+ NTSTATUS
+
+--*/
+
+{
+
+ UNREFERENCED_PARAMETER(Miniport);
+}
//-----------------------------------------------------------------------------
// Host routine implementations.
@@ -1095,7 +1141,7 @@ Return value:
do {
Retries -= 1;
if (Retries == 0) {
- return STATUS_TIMEOUT;
+ return STATUS_IO_TIMEOUT;
}
Reset = SdhcReadRegisterUchar(SdhcExtension, SDHC_RESET);
@@ -1115,6 +1161,15 @@ Return value:
SDHC_TC_MAX_DATA_TIMEOUT);
//
+ // Clear detection interrupt after reset, we will pick up the
+ // status from the present state register
+ //
+
+ SdhcWriteRegisterUshort(SdhcExtension,
+ SDHC_INTERRUPT_STATUS,
+ 0xFFFF);
+
+ //
// Initialize DMA if the controller supports it.
//
@@ -1156,7 +1211,7 @@ Return value:
STATUS_SUCCESS - The clock was successfuly set.
- STATUS_TIMEOUT - The clock did not stabilize in time.
+ STATUS_IO_TIMEOUT - The clock did not stabilize in time.
--*/
@@ -1190,7 +1245,7 @@ Return value:
do {
Retries -= 1;
if (Retries == 0) {
- return STATUS_TIMEOUT;
+ return STATUS_IO_TIMEOUT;
}
ClockControl =
@@ -1245,7 +1300,7 @@ Return value:
STATUS_INVALID_PARAMETER - The voltage profile provided was invalid.
- STATUS_TIMEOUT - The bus voltage did not stabilize in time.
+ STATUS_IO_TIMEOUT - The bus voltage did not stabilize in time.
--*/
@@ -1297,7 +1352,7 @@ Return value:
do {
Retries -= 1;
if (Retries == 0) {
- return STATUS_TIMEOUT;
+ return STATUS_IO_TIMEOUT;
}
SdhcWriteRegisterUchar(SdhcExtension, SDHC_POWER_CONTROL, PowerControl);
@@ -1319,7 +1374,7 @@ Return value:
do {
Retries -= 1;
if (Retries == 0) {
- return STATUS_TIMEOUT;
+ return STATUS_IO_TIMEOUT;
}
SdhcWriteRegisterUchar(SdhcExtension, SDHC_POWER_CONTROL, PowerControl);
@@ -1595,7 +1650,7 @@ Return value:
ClockControl = SdhcReadRegisterUshort(SdhcExtension, SDHC_CLOCK_CONTROL);
ClockControl &= ~SDHC_CC_CLOCK_ENABLE;
SdhcWriteRegisterUshort(SdhcExtension, SDHC_CLOCK_CONTROL, ClockControl);
- SdPortWait(10 * 1000);
+ SdPortWait(10000);
//
// DAT[3:0] must be all zeroes.
@@ -1624,7 +1679,7 @@ Return value:
}
SdhcWriteRegisterUshort(SdhcExtension, SDHC_HOST_CONTROL2, HostControl2);
- SdPortWait(5 * 1000);
+ SdPortWait(5000);
HostControl2 = SdhcReadRegisterUshort(SdhcExtension, SDHC_HOST_CONTROL2);
//
@@ -1647,6 +1702,8 @@ Return value:
//
ClockControl = SdhcReadRegisterUshort(SdhcExtension, SDHC_CLOCK_CONTROL);
+ ClockControl |= SDHC_CC_CLOCK_ENABLE;
+ SdhcWriteRegisterUshort(SdhcExtension, SDHC_CLOCK_CONTROL, ClockControl);
SdPortWait(10000);
//
@@ -1949,13 +2006,15 @@ Return value:
// Enable the interrupt signals from controller to OS.
//
- SdhcWriteRegisterUshort(SdhcExtension,
- SDHC_INTERRUPT_SIGNAL_ENABLE,
- InterruptEnable);
+ if (!SdhcExtension->CrashdumpMode) {
+ SdhcWriteRegisterUshort(SdhcExtension,
+ SDHC_INTERRUPT_SIGNAL_ENABLE,
+ InterruptEnable);
- SdhcWriteRegisterUshort(SdhcExtension,
- SDHC_ERROR_SIGNAL_ENABLE,
- 0xFFFF);
+ SdhcWriteRegisterUshort(SdhcExtension,
+ SDHC_ERROR_SIGNAL_ENABLE,
+ 0xFFFF);
+ }
//
// Enable the interrupt signals on the controller.
@@ -2541,6 +2600,7 @@ Return value:
return STATUS_INVALID_PARAMETER;
}
+ TransferMode = 0;
TransferMode &= ~(SDHC_TM_AUTO_CMD12_ENABLE |
SDHC_TM_AUTO_CMD23_ENABLE |
SDHC_TM_DMA_ENABLE |
diff --git a/sd/miniport/sdhc/sdhc.h b/sd/miniport/sdhc/sdhc.h
index 74d0a7c2..553a2393 100644
--- a/sd/miniport/sdhc/sdhc.h
+++ b/sd/miniport/sdhc/sdhc.h
@@ -1372,6 +1372,12 @@ typedef struct _SDHC_EXTENSION {
PSDPORT_REQUEST OutstandingRequests[SDHC_MAX_OUTSTANDING_REQUESTS];
USHORT UnhandledEvents;
+
+ //
+ // Whether this driver is used for crashdump/hibernate.
+ //
+
+ BOOLEAN CrashdumpMode;
} SDHC_EXTENSION, *PSDHC_EXTENSION;
@@ -1480,7 +1486,8 @@ VOID
SdhcSlotToggleEevnts(
_In_ PSDPORT_SLOT_EXTENSION SlotExtension,
_In_ ULONG EventMask,
- _In_ BOOLEAN Enable
+ _In_ BOOLEAN Enable,
+ _In_ BOOLEAN CrashdumpMode
);
*/
@@ -1534,6 +1541,14 @@ SdhcPoFxPowerControlCallback(
)
*/
+SDPORT_CLEANUP SdhcCleanup;
+/*
+VOID
+SdhcCleanup(
+ _In_ PSD_MINIPORT Miniport
+ )
+*/
+
//-----------------------------------------------------------------------------
// Hardware access routines.
//-----------------------------------------------------------------------------
diff --git a/sd/miniport/sdhc/sdhc.sln b/sd/miniport/sdhc/sdhc.sln
index f9b7448c..f3ea0bb2 100644
--- a/sd/miniport/sdhc/sdhc.sln
+++ b/sd/miniport/sdhc/sdhc.sln
@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0
MinimumVisualStudioVersion = 12.0
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sdhc", "inbox\sdhc.vcxproj", "{2619C7A0-9593-4B9D-B7B6-39315EB8B689}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sdhc", "inbox\sdhc.vcxproj", "{10452736-7C4F-4206-94F9-AD634213C9C4}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -13,14 +13,14 @@ Global
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {2619C7A0-9593-4B9D-B7B6-39315EB8B689}.Debug|Win32.ActiveCfg = Debug|Win32
- {2619C7A0-9593-4B9D-B7B6-39315EB8B689}.Debug|Win32.Build.0 = Debug|Win32
- {2619C7A0-9593-4B9D-B7B6-39315EB8B689}.Release|Win32.ActiveCfg = Release|Win32
- {2619C7A0-9593-4B9D-B7B6-39315EB8B689}.Release|Win32.Build.0 = Release|Win32
- {2619C7A0-9593-4B9D-B7B6-39315EB8B689}.Debug|x64.ActiveCfg = Debug|x64
- {2619C7A0-9593-4B9D-B7B6-39315EB8B689}.Debug|x64.Build.0 = Debug|x64
- {2619C7A0-9593-4B9D-B7B6-39315EB8B689}.Release|x64.ActiveCfg = Release|x64
- {2619C7A0-9593-4B9D-B7B6-39315EB8B689}.Release|x64.Build.0 = Release|x64
+ {10452736-7C4F-4206-94F9-AD634213C9C4}.Debug|Win32.ActiveCfg = Debug|Win32
+ {10452736-7C4F-4206-94F9-AD634213C9C4}.Debug|Win32.Build.0 = Debug|Win32
+ {10452736-7C4F-4206-94F9-AD634213C9C4}.Release|Win32.ActiveCfg = Release|Win32
+ {10452736-7C4F-4206-94F9-AD634213C9C4}.Release|Win32.Build.0 = Release|Win32
+ {10452736-7C4F-4206-94F9-AD634213C9C4}.Debug|x64.ActiveCfg = Debug|x64
+ {10452736-7C4F-4206-94F9-AD634213C9C4}.Debug|x64.Build.0 = Debug|x64
+ {10452736-7C4F-4206-94F9-AD634213C9C4}.Release|x64.ActiveCfg = Release|x64
+ {10452736-7C4F-4206-94F9-AD634213C9C4}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/sd/sdiomars/mars.vcxproj b/sd/sdiomars/mars.vcxproj
index f974e79c..fc11a774 100644
--- a/sd/sdiomars/mars.vcxproj
+++ b/sd/sdiomars/mars.vcxproj
@@ -19,12 +19,12 @@
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
- <ProjectGuid>{B1304510-A6A8-4646-9C48-EDDD5ABEB540}</ProjectGuid>
+ <ProjectGuid>{EC43E875-56F0-402F-A42A-52D725108F56}</ProjectGuid>
<RootNamespace>$(MSBuildProjectName)</RootNamespace>
<KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR>
<Configuration Condition="'$(Configuration)' == ''">Debug</Configuration>
<Platform Condition="'$(Platform)' == ''">Win32</Platform>
- <SampleGuid>{8C68F76C-ECAC-4889-BC6F-C1FFAB76AD9B}</SampleGuid>
+ <SampleGuid>{CF2C68BB-DD38-4252-8833-F6612F4AF2C5}</SampleGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
diff --git a/sd/sdiomars/mars.vcxproj.Filters b/sd/sdiomars/mars.vcxproj.Filters
index 267b5122..689eb659 100644
--- a/sd/sdiomars/mars.vcxproj.Filters
+++ b/sd/sdiomars/mars.vcxproj.Filters
@@ -3,19 +3,19 @@
<ItemGroup>
<Filter Include="Source Files">
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions>
- <UniqueIdentifier>{375A493C-03C2-4C20-B2F4-236061BA63EE}</UniqueIdentifier>
+ <UniqueIdentifier>{A0B01610-7348-4D47-8415-CBCFEB7024C9}</UniqueIdentifier>
</Filter>
<Filter Include="Header Files">
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
- <UniqueIdentifier>{C1A39E19-0808-487E-8B2B-34B586AA6F50}</UniqueIdentifier>
+ <UniqueIdentifier>{4861BC04-1F15-46A0-B2DE-28D21B74ECB3}</UniqueIdentifier>
</Filter>
<Filter Include="Resource Files">
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions>
- <UniqueIdentifier>{74D04A5E-CCE1-40C8-A807-963F781F4607}</UniqueIdentifier>
+ <UniqueIdentifier>{34886BF6-4425-4ABE-AED6-105D0167B275}</UniqueIdentifier>
</Filter>
<Filter Include="Driver Files">
<Extensions>inf;inv;inx;mof;mc;</Extensions>
- <UniqueIdentifier>{23C205B5-BAEA-4EC6-BF45-4D7FA8BF1E93}</UniqueIdentifier>
+ <UniqueIdentifier>{9EDC37D6-4A7F-4722-81F4-86129D5BF8CD}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
diff --git a/sd/sdiomars/sdiomars.sln b/sd/sdiomars/sdiomars.sln
index b0db009e..943d4707 100644
--- a/sd/sdiomars/sdiomars.sln
+++ b/sd/sdiomars/sdiomars.sln
@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0
MinimumVisualStudioVersion = 12.0
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mars", "mars.vcxproj", "{B1304510-A6A8-4646-9C48-EDDD5ABEB540}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mars", "mars.vcxproj", "{EC43E875-56F0-402F-A42A-52D725108F56}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -13,14 +13,14 @@ Global
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {B1304510-A6A8-4646-9C48-EDDD5ABEB540}.Debug|Win32.ActiveCfg = Debug|Win32
- {B1304510-A6A8-4646-9C48-EDDD5ABEB540}.Debug|Win32.Build.0 = Debug|Win32
- {B1304510-A6A8-4646-9C48-EDDD5ABEB540}.Release|Win32.ActiveCfg = Release|Win32
- {B1304510-A6A8-4646-9C48-EDDD5ABEB540}.Release|Win32.Build.0 = Release|Win32
- {B1304510-A6A8-4646-9C48-EDDD5ABEB540}.Debug|x64.ActiveCfg = Debug|x64
- {B1304510-A6A8-4646-9C48-EDDD5ABEB540}.Debug|x64.Build.0 = Debug|x64
- {B1304510-A6A8-4646-9C48-EDDD5ABEB540}.Release|x64.ActiveCfg = Release|x64
- {B1304510-A6A8-4646-9C48-EDDD5ABEB540}.Release|x64.Build.0 = Release|x64
+ {EC43E875-56F0-402F-A42A-52D725108F56}.Debug|Win32.ActiveCfg = Debug|Win32
+ {EC43E875-56F0-402F-A42A-52D725108F56}.Debug|Win32.Build.0 = Debug|Win32
+ {EC43E875-56F0-402F-A42A-52D725108F56}.Release|Win32.ActiveCfg = Release|Win32
+ {EC43E875-56F0-402F-A42A-52D725108F56}.Release|Win32.Build.0 = Release|Win32
+ {EC43E875-56F0-402F-A42A-52D725108F56}.Debug|x64.ActiveCfg = Debug|x64
+ {EC43E875-56F0-402F-A42A-52D725108F56}.Debug|x64.Build.0 = Debug|x64
+ {EC43E875-56F0-402F-A42A-52D725108F56}.Release|x64.ActiveCfg = Release|x64
+ {EC43E875-56F0-402F-A42A-52D725108F56}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE