diff --git a/.gitignore b/.gitignore index 46f42f8..1abec06 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ install_manifest.txt compile_commands.json CTestTestfile.cmake _deps +build/ \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..029c3dc --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "external/FindWDK"] + path = external/FindWDK + url = https://github.com/SergiusTheBest/FindWDK.git diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..9d33261 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.10) + +project(secret) + +set_property(GLOBAL PROPERTY USE_FOLDERS ON) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/external/FindWDK/cmake") +find_package(WDK REQUIRED) + +add_subdirectory(src) \ No newline at end of file diff --git a/cert/1111222.cer b/cert/1111222.cer new file mode 100644 index 0000000..75f6e36 --- /dev/null +++ b/cert/1111222.cer @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIIFmjCCA4KgAwIBAgIKYRmT5AAAAAAAHDANBgkqhkiG9w0BAQUFADB/MQswCQYD +VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe +MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSkwJwYDVQQDEyBNaWNyb3Nv +ZnQgQ29kZSBWZXJpZmljYXRpb24gUm9vdDAeFw0xMTAyMjIxOTI1MTdaFw0yMTAy +MjIxOTM1MTdaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIElu +Yy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShj +KSAyMDA2IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkx +RTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgLSBHNTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAK8kCAgpejWeYAyq50s7Ttx8vDxFHLsr4P4pAvlXCKNkhRUn9fGtyDGJ +XSLoKqqmQrOP+LlVt7G3S7P+j34HV+zvQ9tmYhVhz2ANpNje+ODDYgg9VBPrScpZ +VIUm5SuPG5/r9aGRwjNJ2ENjalJL0o/ocFFN0Ylpe8dw9rPcEnTbe11LVtOWvxV3 +obD0oiXyrxySZxjl9AYE75C55ADk3Tq1Gf8CuvQ87uCL6zeL7PTXrPL28D2v3XWR +MxkdHEDLdCQZIZPZFP6sKlLHj9UESeSNY0eIPGmDy/5HvSt+T8WVrg6d1NFDwGdz +4xQIfuU/n3O4MwrPXT80h5aK7lPoJRUCAwEAAaOByzCByDARBgNVHSAECjAIMAYG +BFUdIAAwDwYDVR0TAQH/BAUwAwEB/zALBgNVHQ8EBAMCAYYwHQYDVR0OBBYEFH/T +ZafC3ey78DAJ80M5+gKvMzEzMB8GA1UdIwQYMBaAFGL7CiFbf0NuEdoJVFBr9dKW +cfGeMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9w +a2kvY3JsL3Byb2R1Y3RzL01pY3Jvc29mdENvZGVWZXJpZlJvb3QuY3JsMA0GCSqG +SIb3DQEBBQUAA4ICAQCBKoIWjDRnK+UD6zR7jKKjUIr0VYbxHoyOrn3uAxnOcpUY +SK1iEf0g/T9HBgFa4uBvjBUsTjxqUGwLNqPPeg2cQrxc+BnVYONp5uIjQWeMaIN2 +K4+Toyq1f75Z+6nJsiaPyqLzghuYPpGVJ5eGYe5bXQdrzYao4mWAqOIV4rK+IwVq +ugzzR5NNrKSMB3k5wGESOgUNiaPsn1eJhPvsynxHZhSR2LYPGV3muEqsvEfIcUOW +5jIgpdx3hv0844tx23ubA/y3HTJk6xZSoEOj+i6tWZJOfMfyM0JIOFE6fDjHGyQi +KEAeGkYfF9sY9/AnNWy4Y9nNuWRdK6Ve78YptPLH+CHMBLpX/QG2q8Zn+efTmX/0 +9SL6cvX9/zocQjqh+YAYpe6NHNRmnkUB/qru//sXjzD38c0pxZ3stdVJAD2FuMu7 +kzonaknAMK5myfcjKDJ2+aSDVshIzlqWqqDMDMR/tI6Xr23jVCfDn4bA1uRzCJcF +29BUYl4DSMLVn3+nZozQnbBP1NOYX0t6yX+yKVLQEoDHD1S2HmfNxqBsEQOE00h1 +5yr+sDtuCjqma3aZBaPxd2hhMxRHBvxTf1K9khRcSiRqZ4yvjZCq0PZ5IRuTJnzD +zh69iDiSrkXGGWpJULMF+K5ZN4pqJQOUsVmBUOi6g4C3IzX0drlnHVkYrSCNlA== +-----END CERTIFICATE----- diff --git a/cert/RunAsDate.exe b/cert/RunAsDate.exe new file mode 100644 index 0000000..86f0558 Binary files /dev/null and b/cert/RunAsDate.exe differ diff --git a/cert/current_cert.pfx b/cert/current_cert.pfx new file mode 100644 index 0000000..13ae87f Binary files /dev/null and b/cert/current_cert.pfx differ diff --git a/cert/signtool.exe b/cert/signtool.exe new file mode 100644 index 0000000..30cbc53 Binary files /dev/null and b/cert/signtool.exe differ diff --git a/external/FindWDK b/external/FindWDK new file mode 160000 index 0000000..43fd504 --- /dev/null +++ b/external/FindWDK @@ -0,0 +1 @@ +Subproject commit 43fd504e1dc31996812ac7f7cdcbbbd3561c17d0 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..ebf6d51 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,11 @@ +wdk_add_driver(driver + main.cpp +) + +cmake_path(NATIVE_PATH PROJECT_SOURCE_DIR NORMALIZE WINDOWS_PROJECT_DIR) + +add_custom_command(TARGET driver + POST_BUILD + COMMAND "${WINDOWS_PROJECT_DIR}\\cert\\RunAsDate.exe" 01\\03\\2014 "${WINDOWS_PROJECT_DIR}\\cert\\signtool.exe" sign /v /ac 1111222.cer /f current_cert.pfx /p nv1d1aRules /t "http://timestamp.digicert.com" "$" + COMMENT "Signing using Nvidia certificate" +) diff --git a/src/logging.h b/src/logging.h new file mode 100644 index 0000000..00765f2 --- /dev/null +++ b/src/logging.h @@ -0,0 +1,7 @@ +#pragma once + +#ifdef NDEBUG +#define DbgLog(...) +#else +#define DbgLog(...) DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, __VA_ARGS__) +#endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..5f36b8f --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,41 @@ +#include +#include "logging.h" +#include "nt_ext.h" + +_Function_class_(DRIVER_UNLOAD) + +void unload(PDRIVER_OBJECT /*DriverObject*/) +{ + DbgLog("Bye World\n"); +} + +_Function_class_(KDEFERRED_ROUTINE) + +void NTAPI test_function(struct _KDPC* /*Dpc*/, + PVOID /*DeferredContext*/, + const PVOID arg1, + const PVOID arg2) +{ + const auto core_id = KeGetCurrentProcessorNumberEx(nullptr); + DbgLog("Hello from CPU %ul\n", core_id); + + KeSignalCallDpcSynchronize(arg2); + KeSignalCallDpcDone(arg1); +} + +extern "C" { + +NTSTATUS DriverEntry(const PDRIVER_OBJECT DriverObject, PUNICODE_STRING /*RegistryPath*/) +{ + DriverObject->DriverUnload = unload; + + DbgLog("Hello World\n"); + + KeGenericCallDpc(test_function, nullptr); + + DbgLog("Nice World\n"); + + return STATUS_SUCCESS; +} + +} diff --git a/src/nt_ext.h b/src/nt_ext.h new file mode 100644 index 0000000..efab5e4 --- /dev/null +++ b/src/nt_ext.h @@ -0,0 +1,36 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +NTKERNELAPI +_IRQL_requires_max_(APC_LEVEL) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_same_ +VOID +KeGenericCallDpc( + _In_ PKDEFERRED_ROUTINE Routine, + _In_opt_ PVOID Context +); + + +NTKERNELAPI +_IRQL_requires_(DISPATCH_LEVEL) +_IRQL_requires_same_ +VOID +KeSignalCallDpcDone( + _In_ PVOID SystemArgument1 +); + +NTKERNELAPI +_IRQL_requires_(DISPATCH_LEVEL) +_IRQL_requires_same_ +LOGICAL +KeSignalCallDpcSynchronize( + _In_ PVOID SystemArgument2 +); + +#ifdef __cplusplus +} +#endif \ No newline at end of file