Accès aux secteur d'une disquette

DCT_Jones Messages postés 39 Date d'inscription samedi 17 décembre 2005 Statut Membre Dernière intervention 1 juin 2010 - 21 juil. 2006 à 17:52
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 23 juil. 2006 à 16:41
Re-Bonjour
( j'ai posté un message ce matin mais il semble ne plus etre la donc je recommence )

Je voudrais acceder aux secteurs d'une disquette de manière à les stocker et genre en faire des manipulations.
En me renseigant j'ai appris qu'il fallais que j'utilise une commande nommé createfile.:
hDevice = CreateFile(DeviceLogicalName,
                       GENERIC_READ,
                       FILE_SHARE_READ | FILE_SHARE_WRITE,
                       NULL,
                       OPEN_EXISTING,
                       0,
                       NULL);
avec DeviceLogicalName = "\\\\.\\x" ou x est l'unité logique

Le problème c'est que je ne sais comment utiliser cette fonction pour aller rechercher un secteur. J'ai trouvé cette fonction dans d'autres programmes faisant deja ceci mais impliquant trop d'autres données ce qui m'empèche de comprendre.
Si vous saviez m'éclairez là dessus, ça serai cool....

Bonne soirée, et merci d'avance...

23 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 juil. 2006 à 19:07
il est toujours là, je l'ai déplacé vers le forum C

<hr size="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
0
DCT_Jones Messages postés 39 Date d'inscription samedi 17 décembre 2005 Statut Membre Dernière intervention 1 juin 2010
21 juil. 2006 à 19:13
Ok j'imagine que c'est parce que j'ai mis la fonction en C, mais je souhaite creer mon programme en VB donc pour corriger la premiere fonction ce serait ce code ci :
CreateFile(<var>"\\."</var> & drive, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero)

avec j'imagine aussi celle-ci :
DeviceIoControl(hwndDevice,....

Donc si y avait moyen de remettre mon post en non résolu .. :-)
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 juil. 2006 à 19:20
je ne l'ai pas mis en résolu, juste déplacé (à tord).
je vais le supprimer de C... ++

(désolé)

<hr size="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
0
DCT_Jones Messages postés 39 Date d'inscription samedi 17 décembre 2005 Statut Membre Dernière intervention 1 juin 2010
21 juil. 2006 à 19:22
Aucun problème... c'est moi qui me suit p-e mal exprimé.
0

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

Posez votre question
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 juil. 2006 à 19:27
tiens mais je ne sais pas si çà peut t'aider...

'This program needs a Dialog box, named CDBox1
'  (To add the Common Dialog Box to your tools menu, go to Project->Components (or press CTRL-T)
'   and select Microsoft Common Dialog control)
Private Type FILETIME 
    dwLowDateTime As Long 
    dwHighDateTime As Long 
End Type 
Private Type SHFILEOPSTRUCT 
    hWnd As Long 
    wFunc As Long 
    pFrom As String 
    pTo As String 
    fFlags As Integer 
    fAborted As Boolean 
    hNameMaps As Long 
    sProgress As String 
End Type 
Private Type SYSTEMTIME 
    wYear As Integer 
    wMonth As Integer 
    wDayOfWeek As Integer 
    wDay As Integer 
    wHour As Integer 
    wMinute As Integer 
    wSecond As Integer 
    wMilliseconds As Integer 
End Type 
Private Const GENERIC_WRITE =  &H40000000 
Private Const OPEN_EXISTING = 3 
Private Const FILE_SHARE_READ = &H1 
Private Const FILE_SHARE_WRITE = &H2 
Private Const FO_DELETE = &H3 

Private Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" _ 
(ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long 

Private Declare Function CreateDirectory Lib "kernel32" Alias "CreateDirectoryA" _ 
(ByVal lpPathName As String, lpSecurityAttributes As Long) As Long 

Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" _ 
(ByVal lpFileName As String) As Long 

Private Declare Function GetFileSize Lib "kernel32" _ 
(ByVal hFile As Long, lpFileSizeHigh As Long) As Long 

Private Declare Function GetFileTime Lib "kernel32" _ 
(ByVal hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long 

Private Declare Function MoveFile Lib "kernel32" Alias "MoveFileA" _ 
(ByVal lpExistingFileName As String, ByVal lpNewFileName As String) As Long 

Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" _ 
(ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long 

Private Declare Function CloseHandle Lib "kernel32" _ 
(ByVal hObject As Long) As Long 

Private Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" _ 
(lpFileOp As SHFILEOPSTRUCT) As Long 

Private Declare Function FileTimeToSystemTime Lib "kernel32" _ 
(lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long 

Private Declare Function FileTimeToLocalFileTime Lib "kernel32" _ 
(lpFileTime As FILETIME, lpLocalFileTime As FILETIME) As Long 
'
'
'
Private Sub Form_Load() 
    'KPD-Team 1998
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Dim lngHandle As Long, SHDirOp As SHFILEOPSTRUCT, lngLong As Long 
    Dim Ft1 As FILETIME, Ft2 As FILETIME, SysTime As SYSTEMTIME 
    'Set the dialog's title
    CDBox.DialogTitle = "Choose a file ..." 
    'Raise an error when the user pressed cancel
    CDBox.CancelError = True 
    'Show the 'Open File'-dialog
    CDBox.ShowOpen 
    'Create a new directory
    CreateDirectory "C:\KPD-Team", ByVal &H0 
    'Copy the selected file to our new directory
    CopyFile CDBox.FileName, "C:\KPD-Team" + CDBox.FileTitle, 0 
    'Rename the file
    MoveFile "C:\KPD-Team" + CDBox.FileTitle, "C:\KPD-Team\test.kpd" 
    'Open the file
    lngHandle = CreateFile("C:\KPD-Team\test.kpd", GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0) 
    'Get the file's size
    MsgBox "The size of the selected file is" + Str$(GetFileSize(lngHandle, lngLong)) + " bytes." 
    'Get the fil's time
    GetFileTime lngHandle, Ft1, Ft1, Ft2 
    'Convert the file time to the local file time
    FileTimeToLocalFileTime Ft2, Ft1 
    'Convert the file time to system file time
    FileTimeToSystemTime Ft1, SysTime 
    MsgBox "The selected file was created on" + Str$(SysTime.wMonth) + "/" +  LTrim (Str$(SysTime.wDay)) + "/" + LTrim(Str$(SysTime.wYear)) 
    'Close the file
    CloseHandle lngHandle 
    'Delete the file
    DeleteFile "C:\KPD-Team\test.kpd" 
    With SHDirOp 
        .wFunc  = FO_DELETE 
        .pFrom =  "C:\KPD-Team" 
    End With 
    'Delete the directory
    SHFileOperation SHDirOp 
    End 
End Sub

<small> Coloration
syntaxique automatique [AFCK] </small>
       

PCPT   [AFCK]

<hr size ="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
0
DCT_Jones Messages postés 39 Date d'inscription samedi 17 décembre 2005 Statut Membre Dernière intervention 1 juin 2010
21 juil. 2006 à 20:33
J'avais deja cette source qui si je ne me trompe vient de Api-guide 3.7 . Mais elle ne m'aide pas dans le sens ou il n'y a pas une extraction clair des secteurs... .
je veux dire par la que cette source va juste rechercher des proprieters si je ne me trompe pas .
Mais merci quand meme ..
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 juil. 2006 à 21:24
GetDiskFreeSpace() pour avoir la taille de secteur.
ReadFile() en boucle pour aspirer chaque secteur.
CloseHandle() pour fermer.

ciao...
BruNews, MVP VC++
0
DCT_Jones Messages postés 39 Date d'inscription samedi 17 décembre 2005 Statut Membre Dernière intervention 1 juin 2010
21 juil. 2006 à 21:31
Hehe ça a l'air très simple comme ca !
Mais je doute que ça le soit.. ( si ce n'est celle des API), j'essaye ça ce soir ou demain matin et reposerez sans dout des questions. 
Mais merci déja pour ces réponses... 
0
DCT_Jones Messages postés 39 Date d'inscription samedi 17 décembre 2005 Statut Membre Dernière intervention 1 juin 2010
22 juil. 2006 à 09:22
Comme l'avais dit NruNews on peu retrouver les fonctions qu'il m'a dit t'utiliser dans une partie de source de Galain:

"
Public Sub DirectRead(ByVal istartsec As Currency, _
                      ByVal nbytes As Long)


    On Error GoTo dskerror
    dskerr% = 0


    ' Le tableau Readoctet() a été préparé avant l'appel
    If hDevice& <> 0 Then CloseHandle hDevice&
    hDevice& = CreateFile(ldrive$, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, &O0, 0&)
    If hDevice& = INVALID_HANDLE_VALUE Then
        dskerr% = 1
    Else
        pointeur = CCur(istartsec) * CCur(BytesPerSector)
        Call SetFilePointerEx(hDevice&, pointeur, 0, FILE_BEGIN)
        ReDim readoctet(nbytes& - 1)
        hi32 = 0
        Do
            If pointeur < (2 ^ 32) Then Exit Do            pointeur pointeur - (2 ^ 32): hi32 hi32 + 1            If hi32 >(2 ^ 31) Then hi32 hi32 - (2 ^ 32)
        Loop        If pointeur >(2 ^ 31) Then pointeur pointeur - (2 ^ 32)    ' il est négatif        over.Offset CLng(pointeur): over.OffsetHigh CLng(hi32)
        result& = ReadFileEx(hDevice&, readoctet(0), nbytes&, over, 0&)
    End If
    CloseHandle hDevice&
    Exit Sub
dskerror:
    dskerr% = 1
    CloseHandle hDevice&


End Sub
"

Le souci c'est que ça ne me dit pas grand chose ! Est ce que vous pourriez m'expliquer les lignes principal de quoi me permettre à comprendre la logique
et ainsi la recréer??

Bonne journéee
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 juil. 2006 à 12:11
Pourquoi la version "Ex", ReadFile() conviendra, surtout en VB où l'asynchrone comme le multi thread sont ingérables correctement.
De plus, si c'est pour passer 0 en dernier param, ça n'a vraiment aucun intérêt.
Appel SetFilePointer sur 0 alors qu'on vient d'ouvrir le handle est une autre ineptie, totalement inutile.

Ce type de code est à venir prendre sur cppfrance, le bas niveau correct est rarement sur vbfrance, ce n'est pas sa place car le langage en est intrinsèquement incapable.
La suite de multiplications et soustractions stériles sur la valeur du pointeur en est une parfaite démonstration, amuser le processeur n'est pas le but d'un prog..

ciao...
BruNews, MVP VC++
0
DCT_Jones Messages postés 39 Date d'inscription samedi 17 décembre 2005 Statut Membre Dernière intervention 1 juin 2010
22 juil. 2006 à 12:32
OK, merci ,mais je t'avoue sincerement ( même si ce que tu dis à l'air clair et pointu ) que ça ne m'aide pas des masses. En fait je pense que ce qu'il faudrait, c'est de genre me donner la logique ( les étapes ) . Je ne vois pas comment rentrer dans ce programme comment utilser ces fonctions ( même si à mon avis pr celle ci une recherche sur msdn devrait m'eclairer ).

ciaoo
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 juil. 2006 à 12:37
Je verrai si j'ai le temps de te faire un exemple ce soir en rentrant (surement assez tard).

ciao...
BruNews, MVP VC++
0
DCT_Jones Messages postés 39 Date d'inscription samedi 17 décembre 2005 Statut Membre Dernière intervention 1 juin 2010
22 juil. 2006 à 12:38
Ca serait genial, mais d'avance merci...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 juil. 2006 à 02:20
http://bnmvp.free.fr/Dskt.zip

Projet complet en C sur VS 2005 avec l'exécutable (3.5 Ko).
Editer Dskt.c et regarde FloppySectors() que voici.

void __stdcall FloppySectors()
{
  HANDLE hflpy, htxt;
  char buf[20], *c;
  DWORD size, count;
  DWORD spc, nfree;
  BYTE *pmem, *p, *pout;
  GetWindowText(hdrvs, buf, 4); // handle du combo des volumes floppy
  if(!GetDiskFreeSpace(buf, &spc, &size, &nfree, &count)) return;
  count *= spc;
  // szdrv CONTIENT "A:" PAR EXEMPLE
  *((DWORD*) (buf + 4)) = *((DWORD*) buf) & 0xFFFF;
  *((DWORD*) buf) = 0x5C2E5C5C;   //    "[file://\\.\A \\.\A]:"
  hflpy = CreateFile(buf, GENERIC_READ,
                     FILE_SHARE_READ | FILE_SHARE_WRITE,
                     0, OPEN_EXISTING, 0, 0);
  if(hflpy == INVALID_HANDLE_VALUE) return;
  htxt = CreateFile("dsk.txt", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
  if(htxt == INVALID_HANDLE_VALUE) goto closeFLPY;
  pmem = (BYTE*) VirtualAlloc(0, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
  if(!pmem) goto closeTXT;
  pout = pmem + size;
  spc = 0;
  buf[0] = '\t';
  do { // count = nbr secteurs
    c = bnultoa(++spc, buf + 1);
    WriteFile(htxt, buf + 1, c - buf - 1, &nfree, 0);
    nfree = 0; ReadFile(hflpy, pmem, size, &nfree, 0);
    if(nfree != size) goto relMEM;
    p = pmem;
    do {
      c = bnultoa(*p, buf + 1);
      *c = '\r';
      *(c+1) = '\n';
      WriteFile(htxt, buf, c - buf + 2, &nfree, 0);
    } while(++p < pout);
  } while(--count); // TANT QUE NBR SECTEURS
relMEM: VirtualFree(pmem, 0, MEM_RELEASE);
closeTXT: CloseHandle(htxt);
closeFLPY: CloseHandle(hflpy);
}

J'aspire dans un buffer la taille d'un secteur tant que nbr d'octets lus = taille secteur, en terme clair tant que pas d'erreur de lecture. J'écris la valeur de chaque octet dans dsk.txt sous la forme:
1  12
     0
     4
....
2   1
etc...

Il y a un nro en début de ligne quand on change de secteur, nro est de base 1;

Gaffe que la lecture par secteur peut être très longue et comme je passe toute la disquette en revue....
Possible que ça dure plusieurs minutes, j'aurais donc du mettre la fonction dans un thread mais je laisse ainsi pour compréhension plus aisée.

Si truc qui t'échappe, tu demandes mais je ne répondrai surement pas avant le 03/08.
Si prob de transcription VB, voir avec Ebartsoft, Renfield, Darksidious ou autre capable de le faire, c'est pas mon truc.

ciao...
BruNews, MVP VC++
0
DCT_Jones Messages postés 39 Date d'inscription samedi 17 décembre 2005 Statut Membre Dernière intervention 1 juin 2010
23 juil. 2006 à 09:22
Wouwww, merci bcp, mais comme tu le supposais le C c'est vraiment pas ma tasse de thé ! Si pour quelqu'un d'entre vous c'est simple alors c'est avec plaisir que je l'accepterai ... :-)
Bonne journéee..
0
DCT_Jones Messages postés 39 Date d'inscription samedi 17 décembre 2005 Statut Membre Dernière intervention 1 juin 2010
23 juil. 2006 à 10:33
voila g essayé de convertir le codes mais sans grand succes ! G mis ## devant les lignes qui signallaient une erreur. Si vous pouviez m'eguiller la dessus ...

Sub stdcallFloppySectors()




 ## HANDLE hflpy, htxt;
  Dim buf
  Dim c
  Dim size, count
  Dim spc1 As Byte
  Dim nfree
  Dim pmem, p, pout
 
##  GetWindowText(hdrvs, buf, 4) ' handle du combo des volumes floppy
##  if( not GetDiskFreeSpace(buf, spc1, size, nfree, count)) return
  count = spc1
  ' szdrv CONTIENT "A:" PAR EXEMPLE
##  ((DWORD*) (buf + 4)) = *((DWORD*) buf) & 0xFFFF;
##  *((DWORD*) buf) = 0x5C2E5C5C;   //    "[file://\\.\A \\.\A]:"
  hflpy = CreateFile(buf, GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)
##  if(hflpy = INVALID_HANDLE_VALUE) return
  htxt = CreateFile("dsk.txt", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0)
  If (htxt = INVALID_HANDLE_VALUE) Then GoTo closeFLPY
  pmem = VirtualAlloc(0, size, MEM_COMMIT Or MEM_RESERVE, PAGE_READWRITE)
  If (Not pmem) Then GoTo closeTXT
  pout = pmem + size
  spc1 = 0
  buf [0] = "\t"
  While count > 0  ' count = nbr secteurs
    count = count - 1
    c = bnultoa(spc1 + 1, buf + 1)
 ##   WriteFile(htxt, buf + 1, c - buf - 1, nfree, 0)
    nfree = 0
 ##   ReadFile(hflpy, pmem, size, nfree, 0)
    If (nfree <> size) Then GoTo relMEM
    p = pmem
    While p + 1 < pout
      p = p + 1
      c = bnultoa(p, buf + 1)
      c = "\r"
      c 1 = "\n"
 ##     WriteFile(htxt, buf, c - buf + 2, nfree, 0)
    Wend '} while(++p < pout);
  Wend '} ; // TANT QUE NBR SECTEURS
## relMEM: VirtualFree(pmem, 0, MEM_RELEASE)
closeTXT: CloseHandle (htxt)
closeFLPY: CloseHandle (hflpy)




End Sub
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 juil. 2006 à 10:50
Profitons avant mon départ:

HANDLE => Long
count = count * spc

*((DWORD*) (buf + 4)) = *((DWORD*) buf) & 0xFFFF;
ceci (et la suite) est par contre intraductible directement, on n'accède pas à la mémoire en vb.

ciao...
BruNews, MVP VC++
0
DCT_Jones Messages postés 39 Date d'inscription samedi 17 décembre 2005 Statut Membre Dernière intervention 1 juin 2010
23 juil. 2006 à 10:55
quand tu dis à la memoire, tu veux dire celle du pc pas celle de la disquette ?

Si c'est ca, il faut que je m'arrange pour stocker et recuperer un information temporaire autrement .. non ?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 juil. 2006 à 11:13
La mémoire c'est la mémoire (adresse dans l'espace de ton processus), ce qui est sur la disquette est gravé en dur et n'a donc rien à voir.

ciao...
BruNews, MVP VC++
0
DCT_Jones Messages postés 39 Date d'inscription samedi 17 décembre 2005 Statut Membre Dernière intervention 1 juin 2010
23 juil. 2006 à 14:50
c = bnultoa(spc1 + 1, buf + 1) : bnultoa ? Il y a une corespondance en vb ? Sinon ca fait quoi ?
0
Rejoignez-nous