FenrisC0de Skrevet 20. april 2005 Del Skrevet 20. april 2005 Ok, har nettopp startet med Visual Basic siden C++ ikke var helt velykket Men jeg holder på å lage et lite enkelt program som kan deaktivere og aktivere DEP i Windows XP. Men for å gjøre det må jeg angi en kommando som regierer boot.ini (tror det er filnavnet), hvordan kan jeg implementere det i koden for en "button"? Lenke til kommentar
Richard87 Skrevet 20. april 2005 Del Skrevet 20. april 2005 les på MSDN på "Open" og "Close" kommandoene, og "Input" Lenke til kommentar
FenrisC0de Skrevet 20. april 2005 Forfatter Del Skrevet 20. april 2005 Takk for svar, men ingen som vet nøyaktig hva jeg skal gjøre? Finner ikke så veldig mye relevant på MSDN Lenke til kommentar
aadnk Skrevet 20. april 2005 Del Skrevet 20. april 2005 Legg til følgende øverst i formen din: Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long Public Function ChangeDEP(sValue As String) As Boolean Dim strName As String, strValue As String, aOptions, Tell As Long, Ret As Long ' Alloker buffere strName = Space(1024) strValue = Space(1024) ' Hent gjeldende operativsystem Ret = GetPrivateProfileString("boot loader", "default", "", strName, 1024, "C:\boot.ini") ' Endre variabel til riktig størrelse strName = Left(strName, Ret) ' Fortsett kun dersom vi fikk en verdi i foregående api-kall If Ret <> 0 Then ' Finn verdien til denne Ret = GetPrivateProfileString("operating systems", strName, "", strValue, 1024, "C:\boot.ini") ' Endre variabel til riktig størrelse strValue = Left(strValue, Ret) ' Fortsett dersom operasjoen var vellykket If Ret <> 0 Then ' Del opp verdien aOptions = Split(strValue, "/") ' Gå gjennom alle innstillingene For Tell = LBound(aOptions) To UBound(aOptions) ' Endre den, såfremt vi har kommet frem til NoExecute If Mid(aOptions(Tell), 1, 9) = "NoExecute" Then ' Sett til den nye verdien aOptions(Tell) = "NoExecute=" & sValue & IIf(Tell < UBound(aOptions), " ", "") ' Vi behøver ikke gjøre noe mer Exit For End If Next ' Endre verdien i boot.ini Ret = WritePrivateProfileString("operating systems", strName, strValue, "C:\boot.ini") If Ret <> 0 Then ' Hele operasjonen var vellykket ChangeDEP = True End If End If End If End Function Når dette er gjort, kan du på en SVÆRT enkel måte endre NoExecute-verdien i boot.ini: ChangeDEP "AlwaysOff" For øvrig vil jeg anbefale deg å lese guiden min, dersom du skulle ønske å lære deg OPEN, CLOSE og INPUT. Metoden jeg benyttet nå, var ved hjelp av API-prosedyrer, men jeg kunne fint løst det hele ved å åpne og lagre filen. Lenke til kommentar
FenrisC0de Skrevet 20. april 2005 Forfatter Del Skrevet 20. april 2005 Tusen takk, skal se om jeg får det til! men jeg kunne fint løst det hele ved å åpne og lagre filen. Hvordan da? Lenke til kommentar
aadnk Skrevet 20. april 2005 Del Skrevet 20. april 2005 Hvordan da? Eksempelvis som følger: Public Function LoadFile(sFile As String) As Variant Dim Free As Long, sBuff As String ' Hent ledig filnummer Free = FreeFile ' Start åpningen av filen Open sFile For Binary As #Free ' Alloker buffer sBuff = Space(LOF(Free)) ' Last inn data fra fil Get #Free, , sBuff ' Lukk fil Close #Free ' Returner en array av liner LoadFile = Split(sBuff, vbCrLf) End Function Public Function SaveFile(sFile As String, strValue As String, Optional Append As Boolean) As Boolean Dim Free As Long ' Slett filen dersom vi ikke skal tilføye data If Not Append Then ' Fortsett kun dersom den eksisterer If Dir(sFile) <> "" Then ' Slett fil Kill sFile End If End If ' Hent ledig filnummer Free = FreeFile ' Start lagringen Open sFile For Binary As #Free ' Skriv data til fil Put #Free, , strValue ' Lukk fil Close #Free End Function Public Function FindName(aLines As Variant, sName As String) Dim Tell As Long ' Gå gjennom alle linjene i filen For Tell = LBound(aLines) To UBound(aLines) ' Sjekk hvorvidt dette er den variabelen vi er på utskikk etter If Mid(aLines(Tell), 1, Len(sName)) = sName Then ' Hent variabelinformasjon FindName = Mid(aLines(Tell), InStr(1, aLines(Tell), "=") + 1) ' Vi har ikke mer å gjøre her Exit Function End If Next End Function Public Function ChangeDEP(sValue As String) As Boolean Dim aLines As Variant, strName As String, strValue As String, aOptions As Variant, Tell As Long, Temp As Long ' Last inn alle linjer aLines = LoadFile("C:\boot.ini") ' Finn denne verdien i filen strName = FindName(aLines, "default") ' Fortsett kun dersom vi fikk en verdi i foregående operasjon If strName <> "" Then ' Gå gjennom alle linjene i filen For Tell = LBound(aLines) To UBound(aLines) ' Sjekk hvorvidt dette er den variabelen vi er på utskikk etter If Mid(aLines(Tell), 1, Len(strName)) = strName Then ' Hent variabelinformasjon strValue = Mid(aLines(Tell), InStr(1, aLines(Tell), "=") + 1) ' Fortsett dersom operasjoen var vellykket If strValue <> "" Then ' Del opp verdien aOptions = Split(strValue, "/") ' Gå gjennom alle innstillingene For Temp = LBound(aOptions) To UBound(aOptions) ' Endre den, såfremt vi har kommet frem til NoExecute If Mid(aOptions(Temp), 1, 9) = "NoExecute" Then ' Sett til den nye verdien aOptions(Temp) = "NoExecute=" & sValue & IIf(Temp < UBound(aOptions), " ", "") ' Vi behøver ikke gjøre noe mer Exit For End If Next ' Endre linjen aLines(Tell) = Join(aOptions, "/") ' Lagre alt til INI-filen SaveFile "C:\boot.ini", Join(aLines, vbCrLf), False ' Hele operasjonen var vellykket ChangeDEP = True End If ' Vi har ikke noe mer å gjøre Exit For End If Next End If End Function Funksjonen ChangeDEP benyttes på samme måte, skjønt jeg tror den forrige versjonen var langt lettere. Lenke til kommentar
FenrisC0de Skrevet 20. april 2005 Forfatter Del Skrevet 20. april 2005 hmm, godt mulig jeg er ute å kjører her, men jeg får masse feilmeldinger når jeg setter inn det der.. hehe (startet med Visual Basic i går) Lenke til kommentar
aadnk Skrevet 20. april 2005 Del Skrevet 20. april 2005 Du bruker vel ikke tilfeldigvis Visual Basic .NET? I så fall kan du dessverre ikke bruke koden ovenfor. Du må si ifra om dette alt i førsteposten. Lenke til kommentar
FenrisC0de Skrevet 20. april 2005 Forfatter Del Skrevet 20. april 2005 ah, Visual Basic .Net er det jeg bruker ja.. hehe, sorry Lenke til kommentar
aadnk Skrevet 20. april 2005 Del Skrevet 20. april 2005 (endret) Jeg har nå forsøkt å konvertere koden til VB .NET. Jeg er redd mine kunnskaper på det området er nokså begrensede, men forhåpentligvis vil følgende kode fungere (plasser alt innenfor form-klassen): Private Declare Ansi Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As System.Text.StringBuilder, ByVal nSize As Integer, ByVal lpFileName As String) As Integer Private Declare Ansi Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Integer Public Function ChangeDEP(ByVal sValue As String, ByVal sFile As String) As Boolean Dim strName As New System.Text.StringBuilder(256) Dim strValue As New System.Text.StringBuilder(256) Dim aOptions() As String, strResult As String Dim Tell As Integer, Ret As Integer ' Hent gjeldende operativsystem Ret = GetPrivateProfileString("boot loader", "default", "", strName, strName.Capacity, sFile) ' Endre variabel til riktig størrelse strName.Length = Ret ' Fortsett kun dersom vi fikk en verdi i foregående api-kall If Ret <> 0 Then ' Finn verdien til denne Ret = GetPrivateProfileString("operating systems", strName.ToString, "", strValue, 1024, sFile) ' Endre variabel til riktig størrelse strValue.Length = Ret ' Fortsett dersom operasjoen var vellykket If Ret <> 0 Then ' Del opp verdien aOptions = strValue.ToString.Split("/") ' Gå gjennom alle innstillingene For Tell = aOptions.GetLowerBound(0) To aOptions.GetUpperBound(0) ' Endre den, såfremt vi har kommet frem til NoExecute If aOptions(Tell).Substring(0, 9) = "NoExecute" Then ' Sett til den nye verdien aOptions(Tell) = "NoExecute=" & sValue & IIf(Tell < aOptions.GetUpperBound(0), " ", "") ' Vi behøver ikke gjøre noe mer Exit For End If Next ' Fusjoner array til en streng strResult = Join(aOptions, "/") ' Endre verdien i boot.ini Ret = WritePrivateProfileString("operating systems", strName.ToString, strResult, sFile) If Ret <> 0 Then ' Hele operasjonen var vellykket ChangeDEP = True End If End If End If End Function Dernest skulle følgende kode fungere: ChangeDEP("AlwaysOff", "C:\boot.ini") Edit: En ørliten skriveleif. Endret 20. april 2005 av aadnk Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå