[C] Handle

Résolu
Utilisateur anonyme -  
 Utilisateur anonyme -
Bonjour, bonsoir,

Tout simplement, je me retrouve avec un code d'erreur 6 ici :

ERROR_INVALID_HANDLE
    6 (0x6)
    The handle is invalid.


Fonction :

BOOL GetLastWriteTime(HANDLE hFile, LPTSTR lpszString, DWORD dwSize)
{
    FILETIME ftCreate, ftAccess, ftWrite;
    SYSTEMTIME stUTC, stLocal;
    DWORD dwRet;

    if (!GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite))
	{
        return FALSE;
	}

    FileTimeToSystemTime(&ftWrite, &stUTC);

    SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);

    dwRet = StringCchPrintf(lpszString, dwSize, TEXT("%02d/%02d/%d  %02d:%02d"),
        stLocal.wMonth, stLocal.wDay, stLocal.wYear,
        stLocal.wHour, stLocal.wMinute);

    if( S_OK == dwRet )
	{
        return TRUE;
	}
    else 
	{
	return FALSE;
	}
}


Main :

#include <stdafx.h>   
#include <stdio.h>   
#include <Windows.h>
#include <io.h>
#include <tchar.h>
#include <strsafe.h>

#define _CRT_SECURE_NO_WARNINGS    
#define size_files 2

char * db_files [size_files] = {"C:\\force_delete.txt", 
					"C:\\ComboFix.txt"};

int main (int argc, char *argv[]) 
{   
	const char * report_path = strcat(getenv("HOMEDRIVE"),"\\rapport.txt");

	FILE * rapport;  
	int fp, i;

	HANDLE hFile;
    TCHAR szBuf[MAX_PATH];

	rapport = fopen(report_path, "w"); 	

	if (rapport == NULL)    
	{   
		return(1);   
	}
	else
	{
		fprintf(rapport, "\n\n:: Files\n\n");

		for (i = 0 ; i < size_files ; i++)
		{
			if (_access(db_files[i], 0) != -1)
			{
				hFile = (HANDLE) db_files[i]; // Ici, mon Handle est invalide...

				if(GetLastWriteTime(hFile, szBuf, MAX_PATH)) 
				{
					fprintf(rapport, "[%s] : %s\n", szBuf, hFile);
				}
				else
				{
					fprintf(rapport, "[error: %d] : %s\n", GetLastError(), hFile);
				}

				CloseHandle(hFile);   
			}
		}
		fclose(rapport);
	}
	return(0);
}


J'ai posté le plus de code que je pouvais, à vous de me dire :-)

Merci !



--
♪♪ Slowin' Cleaner development, Windows Optimizer

9 réponses

  1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    Salut Saachaa,

    Ton tableau db_files est un tableau de chaînes en C, qui contiennent le chemin de fichiers dans ton système de fichiers.

    HANDLE hFile; 
    hFile = (HANDLE) db_files[i];

    est donc inexact, même en faisant le cast que tu mets.

    En Win32, tu dois, pour chaque fichier créer un Handle, qui te permet d'y accéder par l'intermédiaire de fonctions telles que GetFileSizeEx.

    Tu peux créer ton Handle sur un fichier existant avec CreateFile et le flag OPEN_EXISTING.

    Vois :

    https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea?redirectedfrom=MSDN

    Dal
    0
  2. Utilisateur anonyme
     
    Coucou Dal,

    Merci de ta réponse,

    J'ai bien essayé cela, mais malheureusement, la valeur retournée est (Null).

    hFile = CreateFileA(db_files[i], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
    
    				if (GetFileTime(hFile, ftCreate, ftAccess, ftWrite) != 0)
    				{
    					fprintf(rapport, "[%s] : %s\n", ftAccess, db_files[i]); // Ici, le résultat dans le rapport est "[(null)]", que je mette ftCreate, ftAccess, ou ftWrite.
    				}
    				else
    				{
    					fprintf(rapport, "[error: %d] : %s\n", GetLastError(), db_files[i]);
    				}
    


    0
  3. Utilisateur anonyme
     
    Je pense que c'est à cause de la conversion et à force de recherche, je crois avoir trouvé, je te dis quoi ;-)
    0
  4. Utilisateur anonyme
     
    Oui c'est bien, il faut convertir tout cela :

    FileTimeToSystemTime(&ftWrite, &stUTC2);
    						SystemTimeToTzSpecificLocalTime(NULL, &stUTC2, &stLocal2); 

    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Utilisateur anonyme
     
    Merci pour ton aide,

    A bientôt !
    0
  7. Utilisateur anonyme
     
    Oups, juste une question,

    Comment faire du GetFileTime() sur un dossier ?

    J'ai vu sur un post que l'on devant utiliser :

    FILE_FLAG_BACKUP_SEMANTICS

    Mais avec ceci :

    hFile = CreateFileA(db_folders[i], GENERIC_READ, FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);

    Je peux aller me gratter :-O
    0
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      Salut Saachaa,

      Pour un répertoire, chez moi, ceci fonctionne pour obtenir un Handle sur un répertoire existant dans le but d'en lire les propriétés :

          HANDLE hFile;  
          char * a_directory = "C:\\Temp2";  
      
          hFile = CreateFile((LPCTSTR )a_directory, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);

      En passant, à chaque fois que tu essayes de créer un Handle, tu devrais tester s'il a bien été créé, et s'il ne l'a pas été, obtenir l'erreur signalée par le système. Cela aide vraiment :-)

          if (hFile == INVALID_HANDLE_VALUE)  
          {  
              printf("Erreur : %x\n", (unsigned int)GetLastError());  
              exit(EXIT_FAILURE);  
          }

      Puis voir la liste des erreurs système : https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes?redirectedfrom=MSDN

      Bon courage pour la suite !


      Dal
      0
  8. Utilisateur anonyme
     
    Coucou Dal,

    Oui, c'est vrai que ça aide mais je n'y avais pas pensé.

    http://puu.sh/1bB6z

    Avec:

    hFile = CreateFile((LPCTSTR) db_folders[i], 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); 
    
         if (hFile == INVALID_HANDLE_VALUE)   
         {   
          printf("Erreur : %x\n", (unsigned int)GetLastError());   
          printf("%s\n", db_folders[i]); 
          system("pause"); 
          //exit(EXIT_FAILURE);   
         } 
    


    Là j'ai un peu l'air con:

    ERROR_FILE_NOT_FOUND 
    
        2 (0x2) 
    
        The system cannot find the file specified. 
    


    ça aurait été l'erreur 3 encore plus :-S

    ♪♪ Slowin' Cleaner development, Windows Optimizer
    0
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      :-)

      Si tu as mis un (double) antislash à la fin du nom du répertoire, retire les.

      Comme dans l'exemple :
      char * a_directory = "C:\\Temp2";  

      Dal
      0
  9. Utilisateur anonyme
     
    Comment cela ?

    Si je l'enlève, aucun Slash n'apparaît !

    Voilà le code, si ça peut t'aider :-)

    #define size_folders 2 
    
    char * db_folders [size_folders] = {"C:\\Windows", 
    								"C:\\ebejbfefl"};
    
    for (i = 0 ; i < size_folders ; i++)
    		{
    			if (_access(db_folders[i], 0) != -1)
    			{
    				hFile = CreateFile((LPCTSTR) db_folders[i], 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
    
    				if (hFile == INVALID_HANDLE_VALUE)  
    				{  
    					printf("Erreur : %x\n", (unsigned int)GetLastError());  // erreur 2, pourtant le fichier existe (voir _access)
    					printf("%s\n", db_folders[i]);
    					system("pause");
    					//exit(EXIT_FAILURE);  
    				}
    
    				if (GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite))
    				{
    					FileTimeToSystemTime(&ftCreate, &stUTC); // Convert the created time to local time. set +1
    					SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);
    
    					fprintf(rapport, "[%02d/%02d/%d %02d:%02d] - %s\n", stLocal.wDay, stLocal.wMonth, stLocal.wYear, stLocal.wHour, stLocal.wMinute, db_files[i]);
    				}
    			}
    

    0
  10. Utilisateur anonyme
     
    J'ai réussi à créer tout cela,

    Le code d'erreur retourné était causé car le dossier était 'utilisé".

    ;-)
    0
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      Content que cela fonctionne, Saachaa... des fois, il faut un peu de magie noire pour faire marcher les fonctions système de Windows ;-)

      Dal
      0
    2. Utilisateur anonyme
       
      Oui, c'est ce que je vois !

      A bientôt Dal :)
      0