Aller au contenu

appels systeme sous windose


Messages recommandés

salut,

voila mon probleme, j'arrive a recuperer l'id du porcessus attaché a un port TCP (DWORD dwOwningPid) inclut dans la structure PMIB_TCPTABLE_OWNER_MODULE (sous windows). jusque la tout roule.

le probleme c'est que sa fait plusieur jour que je me casse le crane par ce que je n'arrive pas a trouver comment, a partir de cet ID je peut retrouver le nom du process correspondant.

donc si quelqu'un peut me dire comment faire.

(plus qu') accessoirement je cherche un tutoriel sur le appels systeme sous windows (et sous linux sa m'interesse aussi).

Lien vers le commentaire
Partager sur d’autres sites

Pour ce qui est du nom de process, tu devrais regarder du coté de GetModuleBaseName.

Pour ce qui est des appels système Windows tu risque fort de te heurter aux inconvénients des systèmes fermés : une grande partie ne sont pas documentés et donc assez peu connus. Des individus peu recommandables (:D) en ont dressé la liste sur cette page, mais ce n'est pas très utile en l'état.

Lien vers le commentaire
Partager sur d’autres sites

salut shtong, sa faisait longtemps dis moi, tu va bien ?

je me demandais si vous étié pas tous partis en vacances, le forum avait l'air desert !

pour GetModuleBaseName, j'avais deja jeter une oeil sur msdn (en fait pratiquement sur tous ceux qui commence par Get..).

le probleme c'est que pour obtenir le nom avec getmodulename, il faut disposé d'un handle sur le process.

alors du coup, j'ai regarder du coté de getmodulehandle , et forcement il faut lui passer le nom du module en paramètre.

alors du coup je l'ai quand meme tester ce GetModuleHandle:

	HMODULE test;
LPCTSTR name=_T("iexplore.exe");
//********.....*************
		test=GetModuleHandle(name);
		printf("\n--test du handle HMODULE : %d",test);

je m'etait dit que comme sa je pourrait au moins voir si le handle du module et sont PID etait identique.

mais forcement test prend toujour une valeur 0, et avec tout ces typedef ont sait plus qui correspond a quoi.

j'en ai tester d'autre et c'est toujour pareil, impossible de recuperer la valeur de retour.

comme getservbyport qui retourne un pointeur sur structure servent

sa aurait été pratique puisque le numero du port je l'ai un peut partout (meme si je crois qu'un service ne correspond pas exactement au process...) mais meme probleme. impossible de recuperer la valeur de retour de la fonction.

et forcement une indirection sur "test" me produit toujours un "read acces violation" (ce qui n'est pas si illogique que sa quelque part... pitetre).

ou alors sinon j'ai bien pensé a échangé ma strucutre MIB_TCPTABLE_OWNER_MODULE contre une autre, mais j'ai rien trouver qui soit plus proche de ce que je veut faire.

Pour ce qui est des appels système Windows tu risque fort de te heurter aux inconvénients des systèmes fermés : une grande partie ne sont pas documentés et donc assez peu connus. Des individus peu recommandables (:yes:) en ont dressé la liste sur cette page, mais ce n'est pas très utile en l'état.

oui je me suis deja heurter a ce probleme, du coup j'essaye ubuntu, c'est sympa, c'est vrai que la doc sous linux est quand meme plutot pratique (et conky c'est genial :p ),meme si ya encore des problemes de pilotes etc ...le systeme du "tout fichier" a aussi l'air interessant.

ce que je ne comprend pas c'est comment font les developpeur pour developper sous windose sans avoir aucune informations de ce qui se passe coté OS (enfin bon sa reste relatif)...mais si windows ne documente pas ses appels systemes, c'est quelque part qu'il ne servent a rien ! ;)

pour la liste j'ai rapidement jeter un oeil et je n'ai pas reussi a trouver mon bonheur dedant.

impressionnant de voir que depuis vista le nombre d'appel referencé a quasimement doublé.

peu recommandale.... je dirais meme que se sont des petit garnements ;)

Lien vers le commentaire
Partager sur d’autres sites

euh, si vous savez pas chercher, c'est pas la faute de MS

#include <iostream>
using namespace std;

#include <windows.h>
#include <psapi.h>
#pragma comment(lib,"psapi.lib")

void main()
{
int pid = 3448;
HANDLE hP = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,pid);
LPTSTR nom = new TCHAR[50];
if(GetModuleBaseName(hP,0,nom,50))
	cout << nom << endl;
else
	cout << "erreur:" << GetLastError() << endl;

int a;
cin >> a;
}

Lien vers le commentaire
Partager sur d’autres sites

salut spaz!

euh, si vous savez pas chercher, c'est pas la faute de MS

alors si ta une bonne methode de recherche sur msdn sa m'interresse ! (parce que faire les fonction une par une c'est pas terrible :transpi: )

et une petite explication sur ces 2 lignes là serait pas de refus

using namespace std; //spécifique au C++ ???
LPTSTR nom = new TCHAR[50]; // ont dirait une converstion de type...vers le meme type, mais a la reflexion ont dirait aussi que le new crée un "objet" de meme type que LPTSTR qui devrait contenir la string [out] par la fonction ?? est ce que c'est portable en C ? enfin est ce qu'un malloc de "nom" ne reviendrait pas (a peut près) au meme ?

et dis mois si je me trompe :

HANDLE hP = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,pid);

PROCESS_QUERY_INFORMATION est le flag qui permet une requette sur les infos du process

PROCESS_VM_READ autorise mon processus a lire les informations contenue dans l'espace memoire reservé au processus cible

FALSE, indique que le processus que j'ouvre avec openprocess n'heritera pas du handle (donc ont lui en fournit un nouveau ?)

qu'est ce qui fait que OpenProcess n'ouvre pas de nouveau processus : les flags, False ou les deux ?

et pour finir j'imagine que je doit aussi faire appel a CloseHandle?

Lien vers le commentaire
Partager sur d’autres sites

Moi, j ai la MSDN installé sur mon poste, la recherche est plus pertinente à mon gout.

je cherche "process id", je vois un "process identifiers" un peu plus bas (http://msdn.microsoft.com/en-us/library/ms684868(VS.85).aspx) qui me montre le OpenProcess, et sur OpenProcess, j'ai même, en bas, dans "See also", "Process and Thread Functions" (http://msdn.microsoft.com/en-us/library/ms684847(VS.85).aspx), qui me liste toutes les fonctions en rapport avec les pid, au cas ou je voudrais pas de GetModuleBaseName, mais QueryFullProcessImageName, par exemple.

Pour tes question, oui, c'est du C++, je voulais pas imprimer à cout de printf. Ce que tu veux, c'est ça

	int pid = 3448;
HANDLE hP = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,pid);
LPTSTR nom = new TCHAR[50];
if(GetModuleBaseName(hP,0,nom,50))
	//toto
else
	//titi

CloseHandle(hP);

J'ai oublié le CloseHandle d'ailleurs, tu as raison XD

Pour le false, je drais plutôt que c'est si tu ouvres un nouveau process, il obtiendra un nouveau handle, plutôt que de partager celui que tu obtiendras.

OpenProcess ne crée pas de process, il y a CreateProcess pour ça.

Pour LPTSTR/TCHAR, ce sont des macros vers (char */char) ou (wchar_t */wchar_t) au cas ou tu actives ou non le support des caractères Unicodes. Si tu mets char */char, ça marchera aussi bien normalement.

new spécifique au C++ ? Je pense pas, mais si tu veux mallocer, vas-y, ce n'est pas important.

Tu peux même mettre une chaîne statique (char[250] nom;)

Lien vers le commentaire
Partager sur d’autres sites

Moi, j ai la MSDN installé sur mon poste, la recherche est plus pertinente à mon gout.

je cherche "process id", je vois un "process identifiers" un peu plus bas (http://msdn.microsoft.com/en-us/library/ms684868(VS.85).aspx) qui me montre le OpenProcess, et sur OpenProcess, j'ai même, en bas, dans "See also", "Process and Thread Functions" (http://msdn.microsoft.com/en-us/library/ms684847(VS.85).aspx), qui me liste toutes les fonctions en rapport avec les pid, au cas ou je voudrais pas de GetModuleBaseName, mais QueryFullProcessImageName, par exemple.

ouais mais dans ce cas faut savoir que c'est OpenProcess qui va te permettre de recuperer le handle, en lisant le nom de la fonction c'est pas forcement evident, moi je cherchais un GetProcessHandle (que j'ai d'ailleur pas trouver) ou un find dans le meme genre puisque logiquement les fonction qui permette de retrouver une infos commence par ces préfixe : mais bon c'est visiblement pas une regle absolue.

alors concernant les caractère etendue j'ai un peut du mal

LPTSTR name = new char[50];

plante

LPTSTR name = calloc(50,wchar_t);
//***...***
printf("%s",name);

ne me renvoie que le premier caractère de name

size_t k;
LPTSTR name = calloc(50,wchar_t);
//***...***
for(k=0;k<wcslen(name);k++)
printf("%c",name[k]);

fonctionne nikel (mais faut reconnaitre que c'est pas génial) (surtout que sa vas pas me facilité la tache pour l'integrer a mon sprintf qui vient ensuite)

LPTSTR name = calloc(50,wchar_t);// ou LPTSTR name=new wchar_t[50]; c'est le meme resultat
//***...***
wprintf("%s",name);

plante lamentablement en me retournant : "'wprintf' : impossible de convertir le paramètre 1 de 'const char [23]' en 'const wchar_t *' ????? :transpi:

Pour le false, je drais plutôt que c'est si tu ouvres un nouveau process, il obtiendra un nouveau handle, plutôt que de partager celui que tu obtiendras.

donc est ce que j'ai pas interet a le mettre a TRUE vue que je cherche le nom du process en cour (meme si j'imagine que sa revient strictement au meme puisque sa changera juste le nombre de handle attaché au meme process)?

Pour LPTSTR/TCHAR, ce sont des macros vers (char */char) ou (wchar_t */wchar_t) au cas ou tu actives ou non le support des caractères Unicodes. Si tu mets char */char, ça marchera aussi bien normalement.

new spécifique au C++ ? Je pense pas, mais si tu veux mallocer, vas-y, ce n'est pas important.

Tu peux même mettre une chaîne statique (char[250] nom;)

j'ai tester mais y veut pas de char[50] en entrée. (seulement du wchar_t)

faut que je jette un oeil du coté des fonction de conversion...

Lien vers le commentaire
Partager sur d’autres sites

Moi, j ai la MSDN installé sur mon poste, la recherche est plus pertinente à mon gout.

je cherche "process id", je vois un "process identifiers" un peu plus bas (http://msdn.microsoft.com/en-us/library/ms684868(VS.85).aspx) qui me montre le OpenProcess, et sur OpenProcess, j'ai même, en bas, dans "See also", "Process and Thread Functions" (http://msdn.microsoft.com/en-us/library/ms684847(VS.85).aspx), qui me liste toutes les fonctions en rapport avec les pid, au cas ou je voudrais pas de GetModuleBaseName, mais QueryFullProcessImageName, par exemple.

ouais mais dans ce cas faut savoir que c'est OpenProcess qui va te permettre de recuperer le handle, en lisant le nom de la fonction c'est pas forcement evident, moi je cherchais un GetProcessHandle (que j'ai d'ailleur pas trouver) ou un find dans le meme genre puisque logiquement les fonction qui permette de retrouver une infos commence par ces préfixe : mais bon c'est visiblement pas une regle absolue.

alors concernant les caractère etendue j'ai un peut du mal

LPTSTR name = new char[50];

plante

LPTSTR name = calloc(50,wchar_t);
//***...***
printf("%s",name);

ne me renvoie que le premier caractère de name

size_t k;
LPTSTR name = calloc(50,wchar_t);
//***...***
for(k=0;k<wcslen(name);k++)
 printf("%c",name[k]);

fonctionne nikel (mais faut reconnaitre que c'est pas génial) (surtout que sa vas pas me facilité la tache pour l'integrer a mon sprintf qui vient ensuite)

LPTSTR name = calloc(50,wchar_t);// ou LPTSTR name=new wchar_t[50]; c'est le meme resultat
//***...***
wprintf("%s",name);

plante lamentablement en me retournant : "'wprintf' : impossible de convertir le paramètre 1 de 'const char [23]' en 'const wchar_t *' ????? :transpi:

Pour le false, je drais plutôt que c'est si tu ouvres un nouveau process, il obtiendra un nouveau handle, plutôt que de partager celui que tu obtiendras.

donc est ce que j'ai pas interet a le mettre a TRUE vue que je cherche le nom du process en cour (meme si j'imagine que sa revient strictement au meme puisque sa changera juste le nombre de handle attaché au meme process)?

Pour LPTSTR/TCHAR, ce sont des macros vers (char */char) ou (wchar_t */wchar_t) au cas ou tu actives ou non le support des caractères Unicodes. Si tu mets char */char, ça marchera aussi bien normalement.

new spécifique au C++ ? Je pense pas, mais si tu veux mallocer, vas-y, ce n'est pas important.

Tu peux même mettre une chaîne statique (char[250] nom;)

j'ai tester mais y veut pas de char[50] en entrée. (seulement du wchar_t)

faut que je jette un oeil du coté des fonction de conversion...

Non mais abuse pas.

"If you have a process identifier, you can get the process handle by calling the OpenProcess function."

Ca coule de source '^^

Pour tes problèmes de TCHAR, je sais pas si tu es sous Visual Studio, mais va dans tes propriétés de projet, et en "character set", tu te mets en 'not set' ou 'multi byte'.

Parce que sinon, oui, faut que tu utilises des chaînes unicode :p

Pour le TRUE/FALSE, laisse le à false. Je ne pense pas que ton process crée de nouveau process ? Si ?

Lien vers le commentaire
Partager sur d’autres sites

"If you have a process identifier, you can get the process handle by calling the OpenProcess function."

Ca coule de source '^^

ok pigé, c'est dans la section about qu'il faut aller voir, mois je passait pas par la case départ et j'allais directement en prison section "reference" (fonction, structures, etc...)

pas très logique comme facon de faire je te l'accorde.

Pour tes problèmes de TCHAR, je sais pas si tu es sous Visual Studio, mais va dans tes propriétés de projet, et en "character set", tu te mets en 'not set' ou 'multi byte'.

Parce que sinon, oui, faut que tu utilises des chaînes unicode :transpi:

not set et le multi-byte fonctionne mais je me demande quelle sont les implications sur la totalité du code ??

sinon ce code la fonctionne

			name=(LPTSTR)calloc(50,sizeof(wchar_t));
		if(GetModuleBaseName(process,0,name,50))
		{
			named=(char*)malloc(wcslen(name));// avec named en char*
			wcstombs(named,name,strlen(named));
			printf("\n le nom du pid est %s",named);
		}

ce que je comprend pas c'est comment il peut considérer que name est un wchar_t quand j'utilise wcstombs ou wcslen et que c'est un "const char" quand j'utilise wprintf (et du coup me renvoie une erreur).

Pour le TRUE/FALSE, laisse le à false. Je ne pense pas que ton process crée de nouveau process ? Si ?

heu, non, mais d'un autre coté si la fonction false crée un nouveau handle sur le processus et que true recupere l'handle existant, pourquoi ne pas utilisé celui déja créé, (a moin que le true indique que mon application héritera du handle de l'application cible ??? mais je vois pas comment 2 application différente peuvent avoir le meme handle ?)

Lien vers le commentaire
Partager sur d’autres sites

Les seules implications que je vois sont que les macros sur les types en rapport avec les textes vont être de type char ou avoisinant, plutôt que wchar_t.

Les conversions multi byte, wide char, j'ai abandonné, trop prise de tête pour du C :transpi:

Quand je fais des progs en C++, je reste en Multi Byte.

true/false n'a pas "d'incidence" sur le handle que tu récupères, c'est pour après, si tu lances des process fils, que ton handle récupéré soit partagé, ou si tes fils récupéreront un nouveau handle.

Lien vers le commentaire
Partager sur d’autres sites

true/false n'a pas "d'incidence" sur le handle que tu récupères, c'est pour après, si tu lances des process fils, que ton handle récupéré soit partagé, ou si tes fils récupéreront un nouveau handle.

ok donc si j'ai bien sa ne sert que lors d'un appel a create process, soit le process nouvellement creer aura le meme handle que le premier et dans ce cas il s'agira que d'un thread secondaire (donc d'une nouvelle pile dans le meme process), soit j'obtient un nouvel handle (par FALSE donc) et dans ce cas un appel a create process lancera le process complet (thread principale + segment de code + segment de données)

all right ??

Les seules implications que je vois sont que les macros sur les types en rapport avec les textes vont être de type char ou avoisinant, plutôt que wchar_t.

Les conversions multi byte, wide char, j'ai abandonné, trop prise de tête pour du C ;)

Quand je fais des progs en C++, je reste en Multi Byte.

heu... nan la j'ai du mal a suivre

le wide char c'est pas un type multy-bite (il fait 2 octet je croit ?)

sinon pour le printf des wchar_t j'ai pigé :

il faut remplacé sa
wprintf("\n le nom du pid est %s",name); //name etant le nom "wchar" de mon process en fait c'etait mon premier argument qui posait probleme

par sa
_tprintf(_T("\n le nom du pid est %s"),name);

@ shtong

en fait je suis en train de recoder un mini-netstat (pour mon conky - l'idée c'est ensuite de porter le code sous linux), et je pensait pouvoir recuperer le nom du process par la fonction en question (celle avec service_qqch - j'ai du me planté quelque part avec celle la faut dire aussi que sa fait un moment que je lit msdn comme ont lit Guerre et Paix).

pour les services je sais pas encore...tout dépend de l'information qu'il me permettent d'obtenir et de l'utilité que je peut en avoir

je pensais peut etre aussi ajouté le nom des thread présent dans les processus selectionner et eventuellement les comparer a une liste de thread connus et autorisés...vais voir

...du coup peut etre comparer les comportement normalement attendu des process/thread avec l'utilisation qu'ils font des services ???

(mais bon la je m'emballe peut etre un peut).

Meme pendant les vacances y a quelqu'un pour repondre aux questions, c'est beau bravo Spaz

pas inpactien pour rien

merite ++ :arrow:

[EDIT] PS shtong, sauf erreur de ma part les appels systemes présent sur ton lien sont documentés sur msdn donc je vois pas où est le mal ??? (en dehors du fait que ne sont présenté que ceux qui peuvent etre corrompus ou détournés...)

[EDIT 2] je me suis emballé grave meme, sa pouvait pas etre aussi simple les threads ont pas l'air d'avoir de noms j'ai l'air malin avec mes PID et mes HANDLE de thread maintenant que j'ai trouver comment les recupérer xD

donc si vous avez des idée de ce que je peut chercher a monitorer sur mon PC histoire de comprendre un peut plus le fonctionnement des couches systeme et application et surtout d'avoir des truc utile a coder je suis preneur (à donf !!!)

PS2 : dites moi si vous trouvez mes posts trop long :arrow:

Lien vers le commentaire
Partager sur d’autres sites

true/false n'a pas "d'incidence" sur le handle que tu récupères, c'est pour après, si tu lances des process fils, que ton handle récupéré soit partagé, ou si tes fils récupéreront un nouveau handle.

ok donc si j'ai bien sa ne sert que lors d'un appel a create process, soit le process nouvellement creer aura le meme handle que le premier et dans ce cas il s'agira que d'un thread secondaire (donc d'une nouvelle pile dans le meme process), soit j'obtient un nouvel handle (par FALSE donc) et dans ce cas un appel a create process lancera le process complet (thread principale + segment de code + segment de données)

all right ??

Euh ... je sais pas trop, mais je dirais que non '^^

Quoi que tu fasses le process fils sera un vrai process complet.

C'est lorsque ton process fils "forké", lorsqu'il demandera au système le handle, il va obtenir le même que le process "père", plutôt qu'un "nouveau".

Si mon "nouveau" est entre "", c'est parce qu'en plus, là on parle d'un handle pour demander des infos sur le process, si tu fais des tests, tu verras qu'il est "héritable", quoi que tu dises '^^ (même par d'autres processus)

heu... nan la j'ai du mal a suivre

le wide char c'est pas un type multy-bite (il fait 2 octet je croit ?)

que nenni :arrow:

Un caractère multi byte peut faire 1 ou 2 octets, et théoriquement n octets

Un caractère étendu en fait 2. Pas plus, pas moins.

Après, pour comment ça marche/ça s'utilise, me demande pas, je fais pas d'internationalisation en C++ ;)

donc si vous avez des idée de ce que je peut chercher a monitorer sur mon PC histoire de comprendre un peut plus le fonctionnement des couches systeme et application et surtout d'avoir des truc utile a coder je suis preneur (à donf !!!)

Ben, tu peux essayer de "re"coder Sandboxie, ou un loggueur d'accès en base de registre (mais contente toi de logguer un proc bien précis, si tu veux faire un truc "global" au système, la doc est proche du zéro absolue '^^)

Meme pendant les vacances y a quelqu'un pour repondre aux questions, c'est beau bravo Spaz

pas inpactien pour rien

merite ++ :arrow:

merci à vous de me rappeller que je suis pas en vacances !! :arrow:

:arrow:

Lien vers le commentaire
Partager sur d’autres sites

Salut :)

not set et le multi-byte fonctionne mais je me demande quelle sont les implications sur la totalité du code ??

Aucune si tu utilise pas de tchars.

Donc le réglage change juste la définition d'un TCHAR, les appels de fonctions Win32 et leur paramètre, etc.

Je m'explique :

Pour les fonctions :

Chaque fonction Windows a une version ANSI et une fonction Unicode.

La fonction ANSI comment par A, la fonction Unicode par W (comme Wide).

Pour chaque couple de fonction (ANSI, Unicode), une macro sans préfixe est définie comme pointant sur la version ANSI ou la version Unicode, selon le réglage (not set et Multibyte utiliseront la version A, et Unicode la version W). Par exemple, CreateProcess appelle en fait ACreateProcess si Unicode n'est pas défini.

Mais alors comment ça marche pour les paramètres quand la fonction attend une chaine ?

Dans ce cas quand tu appelles la version W, tu dois envoyer une chaine Unicode, c'est-à-dire une suite de caractères wchar_t.

Et quand tu appelles la version A, tu dois envoyer une chaine Ansi, c'est-à-dire une suite de caractères char.

Comment coder en faisant abstraction du réglage "unicode ou pas unicode" ? C'est là qu'intervient le TCHAR, qui est aussi une macro et qui pointe vers wchar_t si unicode est défini, et vers char sinon, ainsi que les types du genre LPCSTR, LPCWSTR, etc

=> Donc Microsoft a défini d'autres types que TCHAR, qui correspondent à des pointeurs vers des chaines, comme LPCWSTR. Comment lire un truc aussi horrible ? En fait ça se construit comme ça :

LP : pour dire qu'il sagit d'un pointeur far

C ou rien : pour dire si la chaine est const ou pas

W/T/rien : là ça se complique: rien = chaine ANSI. W = chaine Unicode. T = fait abstraction.

STR : ouais pour dire que c'ets une string, là ça devrait aller ^^'

Donc par exemple LPCTSTR est en réalité un LPCSTR si Unicode est défini, c'est-à-dire en fait "const char*" tout simplement.

Donc reprenons CreateProcess :

CreateProcess(
 __in_opt	 LPCTSTR lpApplicationName,
 __inout_opt  LPTSTR lpCommandLine,
...

devient, si unicode est défini :

WCreateProcess(
 __in_opt	 LPCWSTR lpApplicationName, // donc "const wchar_t*"
 __inout_opt  LPWSTR lpCommandLine, // donc "wchar_t*"
...

et s'il n'est pas défini (réglage "not set") :

ACreateProcess(
 __in_opt	 LPCSTR lpApplicationName, // donc "const char*"
 __inout_opt  LPSTR lpCommandLine, // donc "char*"
...

Pour finir, il y a encore le cas des fonctions C, comme printf.

La version Unicode devient wprintf.

Mais comment faire abstraction ? En C standard, impossible, car l'abstraction Unicode/pas Unicode c'est un truc de Win32, rien à voire avec le langage lui-même. Mais Microsoft a quand meme défini des fonctions permettant cette abstraction, elle commencent par _t (underscore = "pas standard", t = "tchar").

un truc important, je l'ai dit au début mais je le répète, le réglage change juste quelle fonction est réellement appelée, ou quel type est utilisé derrière TCHAR. Mais tu peux très bien utiliser directement des fonctions du genre WOpenProcess si ça te chante, qu'unicode soit défini ou non.

Si tu as encore des question demande, j'ai pas dû être très clair ^^

PS: "unicode" est un terme mal choisi mais je l'ai repris car c'est le terme utilisé par Microsoft. En fait c'est du "unicode UTF-16LE", le codage de caractères utilisé en interne par Windows.

PS2: Multibyte est en fait utilisé le plus souvent pour coder en UTF8, mais le C et le C++ ne supportant pas cet encodage directement il faut utiliser des librairies annexes pour ça. Et le "unicode" dont on parle ici est absent de Linux puisque c'est un truc de Win32, donc wchar_t est beaucoup moins emplyoé sous Linux (on préfère utiliser des chaines UTF8 basées sur char)

Lien vers le commentaire
Partager sur d’autres sites

ok donc y faut que je trouve un truc complet sur les systeme de processus/thread complet (comment le systeme peut faire la différence entre 2 processus s'il ont le meme Handle, si 2 process ont le meme handle et que je demande a mon prog d'y acceder, comment y peut savoir lequel il doit prendre ?)

Ben, tu peux essayer de "re"coder Sandboxie, ou un loggueur d'accès en base de registre (mais contente toi de logguer un proc bien précis, si tu veux faire un truc "global" au système, la doc est proche du zéro absolue '^^)

sandboxie c'est plutot sympa dans l'idée mais peut etre un peut high-level encore, et pas trouver de code

a voir... parce-que l'interet serait (a mon sens) de l'avoir par defaut pour toutes les applications TCP/UDP et d'etablir une certain nombre de regle et de politique qui permette de quand meme passer a travers pour ecrire sur disque (quand ont veut downloader un fichier, pour les maj....peut etre en reprenant le principe d'une elevation de privilège)

mais bon la encore une fois je sais pas si c'est très claire, mais par contre je suis sur que je vais ramer (si tant est que ce soit possible d'y arriver...)

pour le loggueur d'acces en base de registre je vois meme pas ce que c'est ...

sinon je pensait a faire un petit moteur de recherche spécialisé (Msdn me voila... :iloveyou: ) mais pour sa faudrait que j'apprenne le Html (donc y'en a pour un moment)

la je vais deja porter mon netstat sous linux (quand je pense qu'au départ je voulais juste recuperer un truc qui donne l'heure... [ha oui sa s'appel une horloge :oops: ])

Meme pendant les vacances y a quelqu'un pour repondre aux questions, c'est beau bravo Spaz

pas inpactien pour rien

merite ++ :yes:

merci à vous de me rappeller que je suis pas en vacances !! :pleure:

:D

si j'etait sous KDE je pourrait peut etre te Konsoler

Avec Gnome, a la limite, je peut te Terminer

:D :D

(faut que j'arrete sinon je vais me faire cataloguer.... :youhou: )

[EDIT]

A Samolax :nos post se sont croisés

Si tu as encore des question demande, j'ai pas dû être très clair ^^

au contraire : limpide :yes:

donc pour verifier... si je veut faire un code pas portable (tout seul dans mon coin), je reste en unicode et j'utilise les TCHAR

si je veut faire un code portable :

- UTF-8... et donc j'installe des librairies annexes

- ou je me paramètre en multibytes/not-set, et je n'utilise que des char*/const char* les conversion des fonctions se faisant de manière transparente

et la de toutes façon je suis coincé par les appels systemes windows vs unix donc je recode quasiment tout.

Lien vers le commentaire
Partager sur d’autres sites

Je te parlais d'un équivalent à Regmon en fait.

En fait, mes exemples c'était plus pour voir comment fonctionne les DLL et les tables d'adressage, moi j'ai trouvé ça intéressant, à l'époque ^^. Je sais pas si il y a un équivalent Linux par contre :/

Bonne chance pour la suite :iloveyou:

Lien vers le commentaire
Partager sur d’autres sites

Je te parlais d'un équivalent à Regmon en fait.

En fait, mes exemples c'était plus pour voir comment fonctionne les DLL et les tables d'adressage, moi j'ai trouvé ça intéressant, à l'époque ^^. Je sais pas si il y a un équivalent Linux par contre :/

Bonne chance pour la suite :iloveyou:

???

[EDIT]=> voir plus bas

Lien vers le commentaire
Partager sur d’autres sites

rapidement car depuis mon tel spa l'idéal :

pour les appels système, certains sont documentés en effet (dans le ddk donc pour les développeurs bas niveau) mais pas tous.

ma question sur les services est due au fait que depuis Vista/2008 de nouveaux systèmes de sécurité peuvent t'empecher d'acceder directement aux process de services et que tu etais peut-être tombé dans ce piège

un logger de base de registre permet de voir tous les acces faits par les programmes au registre (lecture, ecriture, valeurs...). Ca peut être en effet assez formateur notament sur les hooks système. Par contre bien sur y a pas de registre dans Linux, alors pour un exemple d'appli portable... spa idéal :iloveyou: mais tu peux faire la même chose avec les acces fichiers :youhou:

Lien vers le commentaire
Partager sur d’autres sites

ma question sur les services est due au fait que depuis Vista/2008 de nouveaux systèmes de sécurité peuvent t'empecher d'acceder directement aux process de services et que tu etais peut-être tombé dans ce piège

va falloir que je vois sa de plus près en effet...

fonctionnement de chacun des services, communication entre kernell et process/services, par ce que la j'ai bien rejeter un coup d'oeil au appel correspondant mais meme si je recupere l'info je pourrais rien en faire.

un logger de base de registre permet de voir tous les acces faits par les programmes au registre (lecture, ecriture, valeurs...). Ca peut être en effet assez formateur notament sur les hooks système.
Je te parlais d'un équivalent à Regmon en fait.

En fait, mes exemples c'était plus pour voir comment fonctionne les DLL et les tables d'adressage, moi j'ai trouvé ça intéressant, à l'époque ^^. Je sais pas si il y a un équivalent Linux par contre :/

a sa y est je vient de pigé, je crois, j'ai vu regmon, effectivement sa a l'air interessant, meme si l'idée au départ c'etait pas forcement de faire quelque chose d'aussi complet (et surtout de rester en ligne de commande...!)

mais pourquoi pas un genre de lien vers un utilitaire dans ce genre qui m'affiche l'information dans mon conky quand il detecte un service/process avec un comportement anormal (il écrit pas au bonne endroit sur le disque, il touche au kernell ou des modifications sont faite sur des parties plus ou moins critique, tel ou tel applications présente un risque de sécurité (comme regmon qui affiche les BOF), etc...)

peut etre limité aux application en reseaux

faut que je vois si je peut trouver les fonction permettant de faire des appels a regmon.

maintenant comme me dit Shtong : ce sera peut etre pas aussi formateur que de le faire sois meme.

pour prendre l'exemple d'un appli connecté par TCP, pour l'instant j'ai a peut près sa :

------------------------------------------------------------------
[ProcessID : ProcessName] - :[localPORT] [remoteAddr]:[remotePort]

deja je pense que je vais viré l'ID, j'ai pas besoins qu'il s'affiche puisque j'ai le nom et accessoirrement sa me fera de la place.

mais pour le reste je pense qu'il va falloir que je m'interesse de beaucoup plus pret au fonctionnement global des windows et linux.

et pour windows c'est pas gagner a mon avis.

Par contre bien sur y a pas de registre dans Linux, alors pour un exemple d'appli portable... spa idéal :chinois: mais tu peux faire la même chose avec les acces fichiers :transpi:

ouais j'ai bien prevu de tout reecrire.... d'ailleur a ce propos faut que je m'installe un IDE sur mon Jaunty.

[EDIT] a la reflexion je vais peut etre faire un truc du genre Regmon en version ligne de commande.

rien ne m'empechera ensuite de me pencher sur la question du "comment recuperer ces infos dans mon algo" si le besoin s'en fait sentir

Lien vers le commentaire
Partager sur d’autres sites

bon finalement, si c'est toujours d'actualité, je veut bien un petit coup de main sur les services sous winwin.

concretement sur la fonction getservbyport :

1/ d'après ce que j'ai compris elle permet d'obtenir le nom OFFICIEL du service auquel le port TCP/UDP est attaché (donc si j'ai bien compris ceux qui ont été normalement affecté par l'IANA (pour ceux qui ont été affecter).

En fait je vient de me rendre compte que j'ai un sacré paquet de port TCP en statut Listen : donc pour les port comme le 135 d'après ce que je j'ai compris il sagit d'un port systeme réservé a certaine routine (et encore je suis pas sûr...)

ce que j'ai plus de mal a comprendre c'est tous ceux qui sont ouvert et n'ont soit pas été affecter a l'IANA, soit ne sont meme pas réferencé a cette adresse :http://www.frameip.com/liste-des-ports-tcp-udp/

2/ donc si j'ai bien compris la logique de la fonction getservbyport() (et a moins que sa corresponde aux services listés dans outils d'administration->services mais sa me parait moins logique...) ma question est la suivante :

Sur msdn ont peut lire sa :

"The servent structure is allocated by Windows Sockets. The application must never attempt to modify this structure or to free any of its components. Furthermore, only one copy of this structure is allocated per thread, so the application should copy any information it needs before issuing any other Windows Sockets function calls."

si la strucutre Servent doit etre alloué par windowsSocks est ce que sa veut dire que je doit faire un WSAStartup (sur ma variable WSAData) pour initialisé ma lib qui fera elle meme le malloc???

ou est ce que je doit quand meme faire l'allocation moi meme ( et comment si c'est le cas par ce que je n'est pas trouver de fonction d'allocation dans winsock...)

l'idée c'est de s'en servir pour determiné si je peut fermer les port ou pas...(si cette fonction fait bien ce que je crois, je ferme le port s'il n'est pas attribué a un organisme officiel ou si il n'a aucune raison d'etre ouverte)

Lien vers le commentaire
Partager sur d’autres sites

2/ donc si j'ai bien compris la logique de la fonction getservbyport() (et a moins que sa corresponde aux services listés dans outils d'administration->services mais sa me parait moins logique...) ma question est la suivante :

Sur msdn ont peut lire sa :

"The servent structure is allocated by Windows Sockets. The application must never attempt to modify this structure or to free any of its components. Furthermore, only one copy of this structure is allocated per thread, so the application should copy any information it needs before issuing any other Windows Sockets function calls."

si la strucutre Servent doit etre alloué par windowsSocks est ce que sa veut dire que je doit faire un WSAStartup (sur ma variable WSAData) pour initialisé ma lib qui fera elle meme le malloc???

ou est ce que je doit quand meme faire l'allocation moi meme ( et comment si c'est le cas par ce que je n'est pas trouver de fonction d'allocation dans winsock...)

lol :transpi:

Si tu lis le premier code d'erreur de la fonction, que tu peux trouver dans le lien que TU donnes, tu auras la réponse à la première question :mad2:

WSANOTINITIALISED A successful WSAStartup call must occur before using this function.

C'est getservbyport qui alloue la structure. Toi par contre, il est préférable que tu la copies (correctement, c'est des char * dedans '^^), ou t'en serve de suite, car une seule structure est utilisée par tous les appels du même thread (la fonction te renverra la même adresse si tu l'appelles plusieurs fois de suite je pense, ou alors la struct précédente sera désalloc)

Et pour ta première question, oui, c'est ça (pour windows, le fichier est dans windows/system32/drivers/etc)

Après, tu sais, un programme, il ouvre le port qu'il veux (enfin, peux), l'IANA est une recommandation.

Lien vers le commentaire
Partager sur d’autres sites

lol :transpi:

Si tu lis le premier code d'erreur de la fonction, que tu peux trouver dans le lien que TU donnes, tu auras la réponse à la première question :mad2:

WSANOTINITIALISED A successful WSAStartup call must occur before using this function.

lol :fou:

effectivement !!

Et pour ta première question, oui, c'est ça (pour windows, le fichier est dans windows/system32/drivers/etc)

Après, tu sais, un programme, il ouvre le port qu'il veux (enfin, peux), l'IANA est une recommandation.

d'accord mais je vois pas se que ces port "foute" en Listen, c'est le boulot du server, pas du client.

[EDIT]

bon j'ai ce code la qui fonctionne :

process=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,tcpModule->table[i].dwOwningPid);
if(!process)// si je peut pas recupérer le handle (et donc le nom du process) je cherche le service
{
printf("\nNULL process Handle");
proto_service=getservbyport(tcpModule->table[i].dwLocalPort,"TCP");
if(proto_service)
	strcpy(service_name,proto_service->s_name);
else
	sprintf(service_name,"%d",WSAGetLastError());
printf("\n proto_serice_name = %s",service_name);
}

il m'affiche le nom du service s'il le trouve sinon le numero de l'erreur correspondante a la place du nom.

le probleme c'est que sur les 13 port en listen qu'il m'affiche, 10 correspondent a des objets non référence (erreur 11004) (effectivement sur le site web c'est pareil).

mais le pire en plus c'est que le service netbios-ssn est actif alors qu'il n'est plus sensés etre disponible depuis vista comme prévu a cette adresse : http://msdn.microsoft.com/en-us/library/bb870904(VS.85).aspx

(en tout cas s'il est "not available to use" il devrait l'etre pour tout le monde, y compris vista lui meme)...

je sens que je vais tous te les fermés vite fait bien fait.

[EDIT 2] question fermeture des ports je sens que sa va pas etre aussi simple j'ai bien trouver un truc a l'adresse suivante :

http://www.tplpc.com/modules/wfsection/dossier-124.html (ou faut tout faire en base de registre) et encore sa me permettra de fermer que les port 135 139 et 445 (les autre ne sont pas listés)

reste a savoir si c'est une bonne idée...

et concernant les ID des process je trouve sa bizarre qu'il arrive pas a trouver le nom (echec de l'open process) avec (je me demande si c'est pas du a l'histoire des Ring0 etc...?)

Lien vers le commentaire
Partager sur d’autres sites

Pour les noms de processus (et peut-être aussi d'autres infos) qui correspondent à des services, si tu as la foi tu peux lire le whitepaper qui parle justement des nouveautés au niveau de l'isolation des services du systèmes. En gros sous Vista/2008 les services ne sont pas ouverts dans la même session que les applications, et par conséquent ne peuvent pas communiquer directement.

Pour contourner ces restrictions tu devras utiliser le service manager : récupérer un handle, lister les services, et trouver celui qui a l'identifiant que tu cherches...

Lien vers le commentaire
Partager sur d’autres sites

Pour les noms de processus (et peut-être aussi d'autres infos) qui correspondent à des services, si tu as la foi tu peux lire le whitepaper qui parle justement des nouveautés au niveau de l'isolation des services du systèmes. En gros sous Vista/2008 les services ne sont pas ouverts dans la même session que les applications, et par conséquent ne peuvent pas communiquer directement.

donc en gros, (j'ai carrement ouvert ma propre "church TV") si j'ai bien pigé le truc :

comme les services s'executent en session 0 (equivalent ring 0/ mode noyau ...?) et qu'ils doivent utilisés le RPC pour etablir des communication avec l'utilisateur (affichage de dialogbox, etc... puisqu'ils n'ont pas acces au pilote de carte graphique... ;) ?), et ce, en mode client/server, mes port se retrouvent en listen pour pouvoir recevoir les demande de connexion de la part de ces services...

sinon apparament ils peuvent egalement utilisés les "named pipes" a la place du RPC mais sa j'ai aucune idée de ce que c'est...

grosso modo voila ce que j'ai pu en tiré. (pour le reste j'avoue que j'ai pas tout compris...)

donc partant de là, je me demande si c'est toujours une bonne idée de fermer les port actuellement ouvert... (et de toute facon j'ai pas trouver comment) ou de chercher a stopper les services correspondant...

Pour contourner ces restrictions tu devras utiliser le service manager : récupérer un handle, lister les services, et trouver celui qui a l'identifiant que tu cherches...

donc la par contre ces fonctions vont me permettre de comparer le PID de process a ceux recuperer par la fonction d'enumeration des services (qui ne sont que des process s'executant en mode noyau... )

donc pour en venir aux fonctions, après avoir lue (en partie) les fonction en lien, comme son nom l'indique, j'utilise OpenSCManager pour recuperer le handle du gestionnaire de service de ma machine en lui fournissant les droit d'accès adequate.

ensuite je fait echouer une premiere fois la fonction "EnumServicesStatusEx" (comme pour le TCP_TABLE) de facon a recuperer la taille en octet (dans le parametre "pcbBytesNeeded") a alloué a mon tableau de structure recevant les informations.

par contre la ou j'ai plus de mal c'est sur le 2e parametre de la fonction "infoLevel" de type SC_ENUM_TYPE...

[EDIT]

je continue tout a l'heure il est trop tard j'arrive plus a réflechir :dd: .... :cartonrouge:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...