decode CPS

This commit is contained in:
lienjukaisim 2024-07-16 08:02:22 +02:00
parent 38da1e763c
commit a15bc646e8
4 changed files with 156 additions and 8 deletions

94
clego/src/CPS.rs Normal file
View File

@ -0,0 +1,94 @@
pub fn decode_zone_memoire( ZDonneesSortie: *mut std::ffi::c_void,TTailleDonneesSortie: usize){
println!("Taille sortie SSV_LireCartePS : {}", TTailleDonneesSortie);
println!("ZDonneesSortie: {:?}", ZDonneesSortie);
// Convertir le pointeur en tranche de bytes
let bytes: &[u8] = unsafe {
std::slice::from_raw_parts(ZDonneesSortie as *const u8, TTailleDonneesSortie)
};
// Maintenant, vous pouvez accéder aux octets individuels dans `donnees`
for &octet in bytes {
println!("Octet: {}", octet);
}
let mut current_pos_general = 0;
let mut current_groupe = 0;
let mut num_champ = 0;
while current_pos_general < bytes.len() - 1 {
num_champ = 0;
current_groupe = 256 * bytes[current_pos_general] as i32 + bytes[current_pos_general + 1] as i32;
current_pos_general += 2;
let longueur_groupe: usize;
if bytes[current_pos_general] < 128 {
longueur_groupe = bytes[current_pos_general] as usize;
} else {
let nbre_octets_longueur = bytes[current_pos_general] - 128;
longueur_groupe = (0..nbre_octets_longueur)
.fold(0, |acc, i| {
current_pos_general += 1;
acc + (256_i32.pow(i as u32) * bytes[current_pos_general] as i32) as usize
});
}
current_pos_general += 1;
let mut current_pos_groupe = 0;
while current_pos_groupe < longueur_groupe {
num_champ += 1;
let longueur_champs: usize;
let nbre_octets_longueur: usize;
if bytes[current_pos_general] < 128 {
longueur_champs = bytes[current_pos_general] as usize;
nbre_octets_longueur = 1;
} else {
nbre_octets_longueur = bytes[current_pos_general] as usize - 128;
longueur_champs = (0..nbre_octets_longueur)
.fold(0, |acc, i| {
current_pos_general += 1;
current_pos_groupe += 1;
acc + (256_i32.pow(i as u32) * bytes[current_pos_general] as i32) as usize
});
}
let mut bytes_champ = vec![0; longueur_champs];
if longueur_champs > 0 {
bytes_champ.copy_from_slice(&bytes[current_pos_general + nbre_octets_longueur..current_pos_general + nbre_octets_longueur + longueur_champs]);
match current_groupe {
1 => match num_champ {
1 => println!("Groupe1.Champ1: {}", String::from_utf8_lossy(&bytes_champ)),
2 => println!("Groupe1.Champ2: {}", String::from_utf8_lossy(&bytes_champ)),
3 => println!("Groupe1.Champ3: {}", String::from_utf8_lossy(&bytes_champ)),
4 => println!("Groupe1.Champ4: {}", String::from_utf8_lossy(&bytes_champ)),
5 => println!("Groupe1.Champ5: {}", String::from_utf8_lossy(&bytes_champ)),
6 => println!("Groupe1.Champ6: {}", String::from_utf8_lossy(&bytes_champ)),
7 => println!("Groupe1.Champ7: {}", String::from_utf8_lossy(&bytes_champ)),
8 => println!("Groupe1.Champ8: {}", String::from_utf8_lossy(&bytes_champ)),
_ => (),
},
2 => match num_champ {
1 => {
// Ajoutez votre logique pour Groupe2 ici
}
2 => {
// Ajoutez votre logique pour Groupe2 ici
}
3 => {
// Ajoutez votre logique pour Groupe2 ici
}
_ => (),
},
_ => (),
}
}
current_pos_general += longueur_champs + nbre_octets_longueur;
current_pos_groupe += longueur_champs + nbre_octets_longueur;
}
}
}

35
clego/src/INSi.rs Normal file
View File

@ -0,0 +1,35 @@
// use std::ffi::CString;
// use std::ptr::null_mut;
// use winapi::um::libloaderapi::{LoadLibraryA, GetProcAddress, FreeLibrary};
// use winapi::shared::minwindef::HMODULE;
// // use winapi::shared::winerror::ERROR_SUCCESS;
// // use winapi::um::errhandlingapi::GetLastError;
// use winapi::um::winnt::LPCSTR;
// use std::os::raw::c_void;
// pub fn test() {
// unsafe {
// let dll_path = CString::new("F:/PAPILLON/Sources/CLEGO/CLEGO/bin/Debug/CLEGO.dll").expect("Échec de la création de CString");
// let dll_handle: HMODULE = LoadLibraryA(dll_path.as_ptr());
// if dll_handle.is_null() {
// //let error_code = GetLastError();
// println!("Erreur lors du chargement de la DLL.");// Code d'erreur : {}", error_code);
// return;
// }
// let class_name = CString::new("PS_Class").expect("Échec de la création de CString");
// let class_ptr: *mut c_void = GetProcAddress(dll_handle, class_name.as_ptr()) as *mut c_void;
// if class_ptr.is_null() {
// // let error_code = GetLastError();
// println!("Classe non trouvée.");// Code d'erreur : {}", error_code);
// FreeLibrary(dll_handle);
// return;
// }
// // Convertissez class_ptr en une instance de classe Rust et appelez ses méthodes ici
// FreeLibrary(dll_handle);
// }
// }

View File

@ -36,8 +36,8 @@ result
}}
//SSV_LireCartePS
pub fn ssv_lirecarteps(dll_handle:*mut winapi::shared::minwindef::HINSTANCE__ , NomRessourcePS :String , NomRessourceLecteur :String , CodePorteurPS :String,
mut ZDonneesSortie: *mut c_void , mut TTailleDonneesSortie: usize)->i32{
pub fn ssv_lirecarteps(dll_handle:*mut winapi::shared::minwindef::HINSTANCE__ , NomRessourcePS :&str , NomRessourceLecteur :&str , CodePorteurPS :&str,
ZDonneesSortie: &mut *mut c_void , TTailleDonneesSortie: &mut usize)->i32{// mut ZDonneesSortie: *mut c_void , mut TTailleDonneesSortie: usize)->i32{
// Résolution d'une fonction exportée ("SSV_LireCartePS")
let symbol_name = CString::new("SSV_LireCartePS").expect("Nom de symbole invalide");
unsafe {
@ -51,13 +51,18 @@ pub fn ssv_lirecarteps(dll_handle:*mut winapi::shared::minwindef::HINSTANCE__ ,
let my_function: MyFunctionType = std::mem::transmute(function_ptr);
// appel de la fonction
ZDonneesSortie= std::ptr::null_mut();
TTailleDonneesSortie=0;
//*ZDonneesSortie= std::ptr::null_mut();//ZDonneesSortie= std::ptr::null_mut();
*TTailleDonneesSortie=0;
println!("ZDonneesSortie: {:?}", ZDonneesSortie);
let result = my_function(CString::new(NomRessourcePS).unwrap().as_ptr(),
CString::new(NomRessourceLecteur).unwrap().as_ptr(),
CString::new(CodePorteurPS).unwrap().as_ptr(),
&mut ZDonneesSortie,
&mut TTailleDonneesSortie);
ZDonneesSortie, TTailleDonneesSortie);
// &mut TTailleDonneesSortie);
println!("ZDonneesSortie: {:?}", ZDonneesSortie);
result
}
}

View File

@ -1,13 +1,27 @@
mod SV_DLL_Win;
mod INSi;
mod CPS;
fn main() {
// let my_handle:*mut winapi::shared::minwindef::HINSTANCE__ ;
let my_handle = SV_DLL_Win::load_library("C:/Program Files/santesocial/fsv/1.40.14/lib/ssvw64.dll");
// INSi::test;
let my_handle = SV_DLL_Win::load_library("C:/Program Files/santesocial/fsv/1.40.14/lib/ssvw64.dll");
if my_handle.is_null() {
panic!("Échec du chargement de la DLL");
}
let result_ssv_initlib2=SV_DLL_Win::ssv_initlib2(my_handle,"C:/CLEGO_Files/SanteSociale/sesam.ini");
println!("Résultat SSV_InitLIB2 : {}", result_ssv_initlib2);
let mut ZDonneesSortie: *mut std::ffi::c_void= std::ptr::null_mut();
let mut TTailleDonneesSortie: usize=55;
let result_ssv_lirecps = SV_DLL_Win::ssv_lirecarteps(my_handle, "HID Global OMNIKEY 3x21 Smart Card Reader 0","", "1234",
&mut ZDonneesSortie, &mut TTailleDonneesSortie);
println!("Résultat SSV_LireCartePS : {}", result_ssv_lirecps);
println!("Taille sortie SSV_LireCartePS : {}", TTailleDonneesSortie);
println!("ZDonneesSortie: {:?}", ZDonneesSortie);
CPS::decode_zone_memoire(ZDonneesSortie,TTailleDonneesSortie)
}