diff --git a/Driver-SoulExtraction.sln b/Driver-SoulExtraction.sln index 61b4b46..b9b18c8 100644 --- a/Driver-SoulExtraction.sln +++ b/Driver-SoulExtraction.sln @@ -4,6 +4,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 VisualStudioVersion = 17.3.32929.385 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Drv-SoulExtraction", "Driver-SoulExtraction.vcxproj", "{D0686DC0-DACB-4F53-B1EC-5B25432A7E60}" + ProjectSection(ProjectDependencies) = postProject + {CD112165-BCF9-412E-8F79-3AABDB135A13} = {CD112165-BCF9-412E-8F79-3AABDB135A13} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Lib-SoulExtraction", "Lib-SoulExtraction\Lib-SoulExtraction.vcxproj", "{CD112165-BCF9-412E-8F79-3AABDB135A13}" EndProject diff --git a/Driver-SoulExtraction.vcxproj b/Driver-SoulExtraction.vcxproj index 5a3cf42..425905d 100644 --- a/Driver-SoulExtraction.vcxproj +++ b/Driver-SoulExtraction.vcxproj @@ -103,6 +103,8 @@ false DriverEntry + $(SolutionDir)Output;%(AdditionalLibraryDirectories) + Lib-SoulExtraction_$(Configuration)_$(PlatformArchitecture).lib;%(AdditionalDependencies) @@ -120,6 +122,8 @@ false DriverEntry + $(SolutionDir)Output;%(AdditionalLibraryDirectories) + Lib-SoulExtraction_$(Configuration)_$(PlatformArchitecture).lib;%(AdditionalDependencies) diff --git a/Lib-SoulExtraction/Lib.SoulExtraction.cpp b/Lib-SoulExtraction/Lib.SoulExtraction.cpp index 19ebfc0..2bed175 100644 --- a/Lib-SoulExtraction/Lib.SoulExtraction.cpp +++ b/Lib-SoulExtraction/Lib.SoulExtraction.cpp @@ -375,6 +375,68 @@ UTF8ToUnicodeN(PWSTR uni_dest, ULONG uni_bytes_max, PULONG uni_bytes_written, PC return status; } +NTSTATUS +UTF8ToUTF16(/*IN*/ char UTF8[_MAX_PATH], /*OUT*/ wchar_t UTF16[_MAX_PATH]) +{ + NTSTATUS ns = STATUS_UNSUCCESSFUL; + ULONG utf16len; + WCHAR *buf; + + auto UTF8Len = _strlen_a(UTF8); + + ns = UTF8ToUnicodeN(nullptr, 0, &utf16len, UTF8, UTF8Len); + if (!NT_SUCCESS(ns)) + { + return ns; + } + + buf = (WCHAR *)UTF16; + ns = UTF8ToUnicodeN(buf, utf16len, &utf16len, UTF8, UTF8Len); + if (!NT_SUCCESS(ns)) + { + return ns; + } + + buf[utf16len / sizeof(WCHAR)] = 0; + + return ns; +} + +NTSTATUS +UTF16ToAscii(/*IN*/ wchar_t UTF16[_MAX_PATH], /*OUT*/ char Ascii[_MAX_PATH]) +{ + NTSTATUS ns = STATUS_UNSUCCESSFUL; + + UNICODE_STRING us; + ANSI_STRING as; + char buf[_MAX_PATH] = {0}; + SIZE_T utf16len; + + utf16len = _strlen_w(UTF16) * sizeof(wchar_t); + + as.Buffer = buf; + as.Length = (USHORT)utf16len; + as.MaximumLength = (USHORT)(as.Length + sizeof(wchar_t)); + + RtlInitUnicodeString(&us, UTF16); + + do + { + ns = RtlUnicodeStringToAnsiString(&as, &us, FALSE); + if (!NT_SUCCESS(ns)) + { + break; + } + + memcpy(Ascii, buf, as.Length); + + buf[as.Length] = 0; + + } while (0); + + return ns; +} + static bool IsMainCert( /*IN*/ struct pkcs7_message *Pkcs7, @@ -528,7 +590,7 @@ GetMainCertInfo( wchar_t utf16[_MAX_PATH + sizeof(wchar_t)]; RtlSecureZeroMemory(utf16, _MAX_PATH + sizeof(wchar_t)); - auto ns = UTF8ToUTF16(subject, subject_len, utf16, _MAX_PATH); + auto ns = UTF8ToUTF16(subject, utf16); if (NT_SUCCESS(ns)) { char ascii[_MAX_PATH + sizeof(char)]; @@ -536,7 +598,7 @@ GetMainCertInfo( RtlSecureZeroMemory(ascii, _MAX_PATH + sizeof(char)); - ns = UTF16ToAscii(utf16, utf16_len, ascii, _MAX_PATH); + ns = UTF16ToAscii(utf16, ascii); if (NT_SUCCESS(ns)) { auto ascii_len = (unsigned long)_strlen_a(ascii); diff --git a/SoulExtraction.cpp b/SoulExtraction.cpp index 516df82..2fe5eab 100644 --- a/SoulExtraction.cpp +++ b/SoulExtraction.cpp @@ -1,5 +1,7 @@ #include +#include "Lib-SoulExtraction/Lib.SoulExtraction.h" + #define dprintf(...) DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, __VA_ARGS__) void