Apres recherche je pense avoir trouve les sources de phymem et pmdll, je tente de m'y retrouver dans le code pour essayer de sortir quelque chose
Version imprimable
Apres recherche je pense avoir trouve les sources de phymem et pmdll, je tente de m'y retrouver dans le code pour essayer de sortir quelque chose
Les codes sont en VC++ et je n'arrive pas a recompiler pour phymem, j'ai pourtant relu le Tuto c++ sur le site.
Lors du dernier post j'ai oublie de donner le lien sur les codes
Salut Blondelle
nul besoin de recompiler
le fichier zip contient sous PhyMem\release
les fichiers
- Phymem.sys
- pmdll.dll
La génération du fichier lib statique se fait à partir de Implib
pour l'utilisation suivre la procédure indiquée
1.Copy pmdll.h, pmdll.lib to your source code directory, include and link with.
2.Copy pmdll.dll, phymem.sys to your application directory to run with.
3.Function Reference:
BOOL LoadPhyMemDriver()
Dynamically load phymem.sys into memory; Return TRUE if succeeded, otherwise FALSE.
VOID UnloadPhyMemDriver()
Unload phymem.sys from memory.
PVOID MapPhyMem(DWORD phyAddr, DWORD memSize)
Map physical memory to user virtual space
◦phyAddr = physical memory address
◦memSize = memory size in bytes
VOID UnmapPhyMem(PVOID pVirAddr, DWORD memSize)
Unmap mapped user virtual address
◦pVirAddr = mapped user virtual address (return value of MapPhyMem)
◦memSize = memory size in bytes
BYTE ReadPortByte(WORD portAddr)
WORD ReadPortWord(WORD portAddr)
DWORD ReadPortLong(WORD portAddr)
Read one byte, two bytes and four bytes from Port address portAddr.
VOID WritePortByte(WORD portAddr, BYTE portValue)
VOID WritePortWord(WORD portAddr, WORD portValue)
VOID WritePortLong(WORD portAddr, DWORD portValue)
Write one byte, two bytes and four bytes to Port address portAddr.
BOOL ReadPCI(DWORD busNum, DWORD devNum, DWORD funcNum,
DWORD regOff, DWORD bytes, PVOID pValue)
Read PCI configuration space
◦busNum: Bus number (0-255)
◦devNum: Device number (0-31)
◦funcNum: Function number (0-7)
◦regOff: Register offset (0-255)
◦bytes: Bytes to read
◦pValue: Buffer to receive returned value (must be allocated by the function caller)
BOOL WritePCI(DWORD busNum, DWORD devNum, DWORD funcNum,
DWORD regOff, DWORD bytes, PVOID pValue)
Write PCI configuration space
◦busNum: Bus number (0-255)
◦devNum: Device number (0-31)
◦funcNum: Function number (0-7)
◦regOff: Register offset (0-255)
◦bytes: Bytes to read
◦pValue: New values to write
tu peux également si tu le désire installer le driver system PCIFlt.sys
suivre la procédure d'installation suivante
If you want to access PCI configuration space, the PCI filter driver “PCIFlt.sys” must be installed. In “Device Manager”, find “PCI Bus” and choose “Update Driver”, select the PCIFilter.inf. Don't automatically search the INF file, choose selecting driver by yourself.
The PCI filter driver may totally crash your computer, use it at your own risk.
cdlt
Merci DjmSoftware
J'ai essaye de tester la compilation passe bien mais a l'execution phymem.sys est introuvable, j'ai essaye de l'enregistrer avec regsrv32 la une boite de dialogue me dit que phymem.sys peut etre incompatible avec x86 system32 ou system64, j'ai aussi essaye de placer phymem.sys dans le projet, apparement le chemin de phymem.sys n'est pas trouve, je tourne en rond
Salut Blondelle
a tu essayé dans le répertoire de ton application comme proposé
pmdll.dll, phymem.sys to your application directory
d'autre part il est inutile d'enregistrer un fichier .sys avec Regsvr32 qui est prévu pour les application de type OLE
cdlt
Salut DjmSoftware
Lors du premier essais j'avais copie tous ces fichiers dans le dossier du projet, comme cela ne fonctionnait pas j'ai ensuite copie phymem.sys dans "system32" puis "driver" et "system64" sans succes, dans le code si dessous le Boolean b est toujours a 0
Comme mon projet etait dans un sous repertoire "C:\Users\home\Documents\SMBIOS\phymem\Test", j'ai ouvert un dossier moins imbrique dans mes document "C:\Users\home\Documents\Test_Dump_Memory", sans succes, voici le contenu de ce dernier dossierCode:
1
2
3
4
5
6
7
8 BOOL b=LoadPhyMemDriver(); if (b==FALSE) { ListBox1->Items->Add("load phymem.sys failed"); // exit(-1); return; }
le code utiliseCitation:
phymem.sys
pmdll.dll
pmdll.h
pmdll.lib
project1.bpr
project1.cpp
project1.application
project1.obj
project1.res
project1.tds
unit1.cpp
unit1.ddp
unit1.form
unit1.h
unit.obj
Je ne sais pas ou j'ai fais une erreur, si j'ai oublie quelque choseCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include <windows.h> #include <stdio.h> #include <malloc.h> #include "pmdll.h" #pragma comment(lib, "pmdll.lib") //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { BOOL b=LoadPhyMemDriver(); if (b==FALSE) { ListBox1->Items->Add("load phymem.sys failed"); // exit(-1); return; } char *va=(char*)MapPhyMem(0xF7020, 20); ListBox1->Items->Add("mapped virtual address = " + (String)va); UnmapPhyMem(va, 20); /* DWORD d=ReadPortByte(0x379); WritePortLong(0x378, 10); d=ReadPortLong(0x378); */ //enumerate PCI bus for (int bus=0; bus<=255; bus++) { for (int dev=0; dev<=31; dev++) { for (int func=0; func<=7; func++) { DWORD dev_ven; if (ReadPCI(bus, dev, func, 0, 4, &dev_ven)) { if (LOWORD(dev_ven)!=0xFFFF) //printf("Bus %d, Device %d, Function %d, Vendor ID 0x%x, Device ID 0x%x\n", //bus, dev, func, LOWORD(dev_ven), HIWORD(dev_ven)); ListBox1->Items->Add("Bus : " + bus); ListBox1->Items->Add("Device : " + dev); ListBox1->Items->Add("Function : " + func); ListBox1->Items->Add("Vendor ID : " + LOWORD(dev_ven)); ListBox1->Items->Add("Device ID : " + HIWORD(dev_ven)); } } } } ListBox1->Items->Add("end"); // getchar(); UnloadPhyMemDriver(); // return 0; } //---------------------------------------------------------------------------
Hello
j'ai effectué les actions suivantes:
- compilation de la DLL avec C++ Builder
- Impossible avec c++ Builder de générer un .sys
- Test avec seven 64
- 1.le problème se situe lors du démarrage du service (Erreur 1275)
- Test sous une machine virtuelle XP
- . Chargement du driver ok
- . demarrage du service OK
- .il semblerait que ma machine virtuelle n'autorise pas l'accès a des ports PCI (non installées)
l'erreur 1275 correspond a un blocage du driver lors du chargement
(il s'agit soit d'un problème de sécurité, sois d'un problème avec 64 bits)
il faudrait pouvoir tester sous une machine virtuelle équipée de seven 32 bits
je joins les exe,dll,lib,sys
cdlt
Merci DjmSoftware
Je vais voir pour tester sur un version window7 32bits, je pense que le probleme vient des fonctions ntdll qui sont utilisees dans phymem.sys, j'ai lu sur le Net que Ntdll augmentait sa taille a chaque version de Window, peut etre que certaines fonctions on ete bridees, et d'autre crees mais non documentees.
Je posterais le resultat des que j'aurais reussi a trouver une version 32 bits
Salut Blondelle
cela n'a stictment rien à voir avec ntdll mais uniquement avec l'impossibilité d'utiliser un driver non signé sous windows 7 64 bits
tu dois d'abord désactiver le contrôle de signature
explications en anglais ci-dessous
use WinDDK(7600.16385.1) to build three different OS driver(phymem.sys) like win xp x86, win xp x64 and win 7 x64.
win xp x64 is ok.
win xp x86 works fine on win xp x86 and win 7 x86.
But win 7 x64 will show "load phymem.sys failed".
I found the driver had already recorded in registry key but the program can't use it.
The problem is the driver I build doesn't have any signature so win 7 x64 can't use this driver.
After I disable driver signature enforcement on win 7 x64, the program execute normally.
I only test the Access Physical Memory function so the other function I can't sure work fine.
How to disable driver signature enforcement?
Reboot windows and press F8, choose "disable driver signature enforcement" to start windows.
Conclusion:If you want to use this for win 7 x64, you should use signature to sign your driver first.
cdlt
Salut DjmSoftware
La desactivation du contrôle de signature ne fonctionne pas avec Window7 64bits, elle devrait fonctionner avec la 32bits (je n'ai pas encore essaye).
Il est peut etre possible de signer le code mais je ne pense pas que cela soit gratuit.
En recherchant sur le Net j'ai trouve un site qui en parle et dit que la version 32 bits accepte la desactivation du controle de signature, mais que la version 64bits meme le controle de signature desactive demande quand meme une signature.
Ce site dit aussi que l'on peut recuperer le code erreur et le remplacer puis dire qu'il y a une signature afin de duper le controle tout cela en utilisant les APIS Windows, bien sur la c'est un cran au dessus de mes competances, mais je cherche encore
J'ai vu sur le site MSND malheureusement en anglais qu'il y avait un programme " Windows Hardware Certification Kit " est ce que l'on peut l'utiliser pour certifier le code afin de le debloquer, est il gratuit ici http://msdn.microsoft.com/en-us/libr.../gg463010.aspx