Toon posts:

[PHP+Win] Drivelabel achterhalen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een project (zie sig), hierin zit oa een drivelabel in verwerkt.

Ik haal een drivelabel op deze manier op:
PHP:
1
2
3
4
5
6
7
function drive_get_label($drv) {
  $bla = shell_mexec("dir ".$drv);
  $bla = explode(" ",$bla);
  return $bla[count($bla)];
}

$drivelabel = drive_get_label("C:");

shell_mexec is een functie ter vervanging van shell_exec, zelfde output, andere manier van ophalen.
Echter loop ik hier tegen een probleem aan, als een drivelabel een spatie bevat dan geeft hij enkel het laatste deel van het label aan.

Ik ben opzoek geweest met google naar een programmatje dat je drivelabel kan achterhalen maar ik kan echter niets vinden.
Is er een manier om met PHP (of via een exe, max 50kb) een drivelabel te achterhalen waar dat ik op kan strippen/replacen? Het commando label geeft het zelfde probleem als dir. Ik kan namelijk niet in 200 verschillende talen de text weg str_replace(n).

  • RSpliet
  • Registratie: Juni 2003
  • Laatst online: 27-11-2025

RSpliet

*blink*

draai de string om, neem de eerste 12 letters en draai die weer terug. Dan heb je het label en een . (heb even geen zin om al die functies op te zoeken :9) Zo'n label mag in Win9x iig maar 11 tekens lang zijn, dus dat zou met Win9x servers moeten werken

[ Voor 14% gewijzigd door RSpliet op 25-01-2004 14:33 ]

Schaadt het niet, dan baat het niet


  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

Misschien heb je hier wat aan?

Is dan wel een mIRC script, maar werkt met een dll file die wordt aangesproken, ff in de .mrc files kijken, hoe die handel wordt aangesproken.

Suc6 ermee :)

Ey!! Macarena \o/


  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 07-04 13:41
Met de win32 api GetVolumeInformation uit Kernel32 moet het lukken :)

  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 02-05 12:11

dArtagnan

Een voor allen, allen voor een

Door dat je explode doet op $bla en dan bij return alleen maar het laatste element teruggeeft krijgt je inderdaad alleen maar het laatste element van de array. Wat zit er allemaal in de array $bla. Je kunt dan natuurlijk alleen de laatste x elementen teruggeven waar het drivelabel in zit.

Verwijderd

Topicstarter
PrisonerOfPain schreef op 25 januari 2004 @ 14:40:
Met de win32 api GetVolumeInformation uit Kernel32 moet het lukken :)
Zal eens kijken of het me lukt deze aan te spreken. Ga het zo testen.
Koraalduivel schreef op 25 januari 2004 @ 14:42:
Door dat je explode doet op $bla en dan bij return alleen maar het laatste element teruggeeft krijgt je inderdaad alleen maar het laatste element van de array. Wat zit er allemaal in de array $bla. Je kunt dan natuurlijk alleen de laatste x elementen teruggeven waar het drivelabel in zit.
nee ik kan enkel de laatste teruggeven, anders krijg je mischien woorden mee terug.
code:
1
2
3
C:\>dir c:
 De volumenaam van station C is ROOT
 Het volumenummer is 3321-1AED

Ik explode hem op spatie, dan return ik de laatste (dus dat is ROOT).

Zou het kunnen via een regex?

  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 02-05 12:11

dArtagnan

Een voor allen, allen voor een

Verwijderd schreef op 25 januari 2004 @ 14:48:

[...]

nee ik kan enkel de laatste teruggeven, anders krijg je mischien woorden mee terug.
code:
1
2
3
C:\>dir c:
 De volumenaam van station C is ROOT
 Het volumenummer is 3321-1AED

Ik explode hem op spatie, dan return ik de laatste (dus dat is ROOT).

Zou het kunnen via een regex?
Als "De volumenaam van station X is" een vast aantal woorden zijn dan zijn toch alle woorden daarna in die regel van de driveletter?

Een klein idee met de functie strpos: (met dank aan de reacties bij php.net)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 function drive_get_label($drv) {
  $bla = shell_exec("dir ".$drv.":");
  $drivelabel = stripfromtext($bla, "De volumenaam van station $drv is", "Het volumenummer is");
  return $drivelabel;
}

$drivelabel = drive_get_label("C");
echo $drivelabel;

function stripfromtext($haystack, $bfstarttext, $endsection) {
  $startpostext = $bfstarttext;
  $startposlen = strlen($startpostext);
  $startpos = strpos($haystack, $startpostext);
  $endpostext = $endsection;
  $endposlen = strlen($endpostext);
  $endpos = strpos($haystack, $endpostext, $startpos);
  return substr($haystack, $startpos + $startposlen, $endpos - ($startpos + $startposlen));
}

[ Voor 4% gewijzigd door dArtagnan op 25-01-2004 15:06 ]


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Als ik jou was zou ik opzoek gaan naar een losse EXE of DLL. Wat je nu wilt / doet is eigenlijk alleen mogelijk met lelijke hardgecodeerde woorden en uitzonderingen (hoe denk je bijvoorbeeld op te gaan met: "Het volume in station C heeft geen naam."? ;) Kun je niet een C programmeur vinden die een exe voor jou maakt die dit soort zaken kan returnen? Dan beperk je je programma heel mooi tot een paar PHP files met 1 exe die de systeemcalls doet. Deze kan dan eenvoudig worden vervangen voor een Linux / FreeBSD / DOS variant :)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Verwijderd

Topicstarter
Wat als het nou zo is dat iemand een engelse windows versie gebruikt? Of een Turkse? Japanse? Ik denk niet dat dit echt een oplossing is.

Betreft API Cals: Mijn apache is zo minimaal dat ik niet eens de api module heb :X
Na even zoeken op API Cals op GoT kwam ik echter dit tegen: [rml]madwizard in "[ php] Type medium opvragen (bijv. Cd-rom..."[/rml]
Dat het programmatje enumdrive geeft dit:
code:
1
2
3
4
5
6
7
8
9
10
C:\>enumdrive
A,removable
C,fixed
E,fixed
F,fixed
G,removable
H,cdrom
I,fixed
J,fixed
W,remote

nee geen scriptrequest plaatsen
Kan iemand even iets compilen voor me, heb geen c++/compiler? :+

  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 09-04 16:10
PrisonerOfPain heeft idd een makkelijke oplossing.

Als bijdrage aan PHPMyStats:

C:
1
2
3
4
5
6
7
8
9
10
11
12
#include <windows.h>
#include <stdio.h>

int main()
{
    char    lpVolumeNameBuffer[13];

    if (GetVolumeInformation("c:", lpVolumeNameBuffer, 13, 0, 0, 0, 0, 0))
        printf("label: %s\n", lpVolumeNameBuffer);

    return 0;
}

[ Voor 8% gewijzigd door Limhes op 25-01-2004 15:16 ]


  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 07-04 13:41
code:
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
/*

File System Info Program

Return information about any drive, aguments is "c:" or "e:".

*/

#include <windows.h>
#include <iostream.h>
#include <string.h>

int main(int argc, char* argv[])
{
    char VolName[100]; DWORD Serial; DWORD MaxFileLength;
    DWORD SysFlags; char FSName[100]; BOOL ret;

    if (argc == 1)
    {
        return 1;
    }

    for (int i = 1; i < argc; i++)
    {
        char * Result = strcat (argv[i], "\\");
        ret = GetVolumeInformation(
            Result,
            VolName,100, // volume Name
            &Serial, // Serial Number
            &MaxFileLength, // Max File Name Length
            &SysFlags, // File System Flags
            FSName,100 // FS Type
        );

        if(ret==FALSE)
        {
            return 1;
        }

        cout << "'" << VolName << "'\n";
    }

    return 0;

}

Voor de gecompilde versie moet je maar ff mailen of msn'en :)

edit:
Mischien wel netjes om te melden dat het gedeeltelijk gebaseerd is op http://phoenix.liunet.edu/~mdevi/index.html ;)

edit:
ik krijg 'm alleen niet kleiner als 152 KB :(, net een briljante ingeving gehad, (bij zet z'n release builds niet in de debug folder :+), en nou is ie 28 KB :-D

[ Voor 48% gewijzigd door PrisonerOfPain op 25-01-2004 15:40 ]


Verwijderd

Kijk eens naar webshow...daarmee kun je ook het label van een gewenste drive ophalen.
http://fossalta.xs4all.nl

  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 09-04 16:10
Ik ben nog ff verder gaan puzzelen, en tot het volgende gekomen:

C:
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
#include <windows.h>
#include <stdio.h>
#include <string.h>

int main()
{
    char    lpDriveNameBuffer[4] = " :\\",

            lpVolumeNameBuffer[13];
    unsigned long
            nDrives,
            nDrive;
    
    nDrives = GetLogicalDrives();
    for (nDrive = 0; nDrive < 26; nDrive++)
    {
        if (1 & (nDrives >> nDrive))
        {
            lpDriveNameBuffer[0] = nDrive + 97;
            if (GetDriveType(lpDriveNameBuffer) == DRIVE_FIXED)
            {
                if (GetVolumeInformation(lpDriveNameBuffer, lpVolumeNameBuffer, 13, 0, 0, 0, 0, 0))
                    printf("%s -> %s\n", lpDriveNameBuffer, lpVolumeNameBuffer);
            }
        }
    }

    return 0;
}


Output is bijvoorbeeld als volgt:
code:
1
2
c:\ -> HDD1
d:\ -> Local Disk

[ Voor 15% gewijzigd door Limhes op 25-01-2004 15:48 ]


Verwijderd

Topicstarter
Limhes: Het probleem was al opgelost, PrisonerOfPain heeft een programmatje gemaakt van 28kb. Mits die vanjou kleiner is bijf ik die van hem gebruiken ;)
Bedankt iig.
het programmatje is te vinden in de volgende release van PHPMyStats.

  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 09-04 16:10
Verwijderd schreef op 25 januari 2004 @ 15:58:
Limhes: Het probleem was al opgelost, PrisonerOfPain heeft een programmatje gemaakt van 28kb. Mits die vanjou kleiner is bijf ik die van hem gebruiken ;)
Bedankt iig.
het programmatje is te vinden in de volgende release van PHPMyStats.
Mijn proggie is ook 28kb, en haalt automatisch de harde schijven op die je in je pc hebt zitten. Weet niet of je dat uberhaupt wel wilt, maar 't is wel handig.
Mail me maar als je 't proggie moet hebben.

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 31-03 15:20
Valt me trouwens best tegen dat de KingOfDos niet eens het interne commando vol kent. :P

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 07-04 13:41
Dat commando gaat niet goed als er spaties in je volume name staan ;)
Pagina: 1