DCT_Jones
Messages postés39Date d'inscriptionsamedi 17 décembre 2005StatutMembreDernière intervention 1 juin 2010
-
21 juil. 2006 à 17:52
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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....
DCT_Jones
Messages postés39Date d'inscriptionsamedi 17 décembre 2005StatutMembreDerniè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 .. :-)
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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
DCT_Jones
Messages postés39Date d'inscriptionsamedi 17 décembre 2005StatutMembreDerniè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 ..
DCT_Jones
Messages postés39Date d'inscriptionsamedi 17 décembre 2005StatutMembreDerniè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...
DCT_Jones
Messages postés39Date d'inscriptionsamedi 17 décembre 2005StatutMembreDerniè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??
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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..
DCT_Jones
Messages postés39Date d'inscriptionsamedi 17 décembre 2005StatutMembreDerniè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 ).
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.
DCT_Jones
Messages postés39Date d'inscriptionsamedi 17 décembre 2005StatutMembreDerniè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..
DCT_Jones
Messages postés39Date d'inscriptionsamedi 17 décembre 2005StatutMembreDerniè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)