88 lines
2.0 KiB
Rust
88 lines
2.0 KiB
Rust
#![no_std]
|
|
|
|
mod sppcs;
|
|
mod win32;
|
|
|
|
use core::{ffi::c_void, ptr::null_mut};
|
|
use win32::{
|
|
Guid, LocalFree, SLGetLicensingStatusInformation, SLGetProductSkuInformation, StrStrNIW,
|
|
SL_LICENSING_STATUS,
|
|
};
|
|
|
|
const GRACE: [u16; 6] = [0x47, 0x72, 0x61, 0x63, 0x65, 0x00];
|
|
const NAME: [u16; 5] = [0x4e, 0x61, 0x6d, 0x65, 0x00];
|
|
|
|
unsafe fn is_grace_period_product(hslc: *const c_void, pproductskuid: *const Guid) -> bool {
|
|
let mut p_buffer = null_mut();
|
|
let mut cb_size = 0;
|
|
|
|
if SLGetProductSkuInformation(
|
|
hslc,
|
|
pproductskuid,
|
|
NAME.as_ptr(),
|
|
null_mut(),
|
|
&mut cb_size,
|
|
&mut p_buffer,
|
|
) != 0
|
|
{
|
|
LocalFree(p_buffer.cast());
|
|
return false;
|
|
}
|
|
|
|
if !StrStrNIW(p_buffer.cast(), GRACE.as_ptr(), cb_size).is_null() {
|
|
LocalFree(p_buffer.cast());
|
|
return true;
|
|
}
|
|
|
|
LocalFree(p_buffer.cast());
|
|
false
|
|
}
|
|
|
|
#[no_mangle]
|
|
unsafe extern "system" fn SLGetLicensingStatusInformationHook(
|
|
hslc: *const c_void,
|
|
pappid: *const Guid,
|
|
pproductskuid: *const Guid,
|
|
pwszrightname: *const u16,
|
|
pnstatuscount: *mut u32,
|
|
pplicensingstatus: *mut *mut SL_LICENSING_STATUS,
|
|
) -> i32 {
|
|
let result = SLGetLicensingStatusInformation(
|
|
hslc,
|
|
pappid,
|
|
pproductskuid,
|
|
pwszrightname,
|
|
pnstatuscount,
|
|
pplicensingstatus,
|
|
);
|
|
if result != 0 {
|
|
return result;
|
|
}
|
|
for i in 0..(*pnstatuscount as usize) {
|
|
let status = (*pplicensingstatus).add(i);
|
|
if (*status).eStatus == 0 {
|
|
continue;
|
|
}
|
|
if is_grace_period_product(hslc, &(*status).SkuId) {
|
|
continue;
|
|
}
|
|
(*status).eStatus = 1;
|
|
(*status).dwGraceTime = 0;
|
|
(*status).dwTotalGraceDays = 0;
|
|
(*status).hrReason = 0;
|
|
(*status).qwValidityExpiration = 0;
|
|
}
|
|
result
|
|
}
|
|
|
|
#[no_mangle]
|
|
extern "system" fn _DllMainCRTStartup(_: *const u8, _: u32, _: *const u8) -> u32 {
|
|
1
|
|
}
|
|
|
|
#[cfg(not(test))]
|
|
#[panic_handler]
|
|
fn panic(_: &core::panic::PanicInfo) -> ! {
|
|
panic!()
|
|
}
|