Windows Mobile

Türchen Nummer 9

Nicht nur Weihnachtsgeschenke sollten einzigartig sein, sondern auch Geräte um diese beispielsweise für Kopierschutzfunktionen unterscheiden zu können.
Daher hat jedes Windows Mobile Gerät eine eindeutige und einmalige ID.
Diese über die KernelIOControl Funktion abzufragen ist allerdings nur für privilegiert signierte Applikationen zulässig.
Als Ausgleich dafür gibt es jedoch die GetDeviceUniqueID Funktion.
Allerdings liefert diese nicht dieselbe ID zurück wie der KernelIoControl Aufruf, sondern anhand von der Applikation übergeben Zusatzdaten einen eindeutigen Hash der ID.
Ruft man mit seiner Anwendung also die GetDeviceUniqueID Funktion immer mit den gleichen Parametern auf erhält man auch immer den gleichen einzigartigen Hash auf dem Gerät, selbst wenn es resettet oder sogar geflasht wird.
Hier nun der Codeschnipsel dazu:
C++
#include "getdeviceuniqueid.h"
//GetDeviceUniqueID gibt nicht die eigentlich ID zurück sondern eine
//eigene ID die aus der Device ID sowie von der Anwendung zusätzlich
//übergebenen Daten besteht. Solange die Zusatzdaten gleich sind erhält
//Die Anwendung auch immer die selbe ID zurück, selbst nach einem Firmwareupdate
#define APPDATA "MEINAPPDATAUID"
#define APPDATALEN 14
//Device ID Variable anlegen
BYTE bDeviceID[GETDEVICEUNIQUEID_V1_OUTPUT];
DWORD cbSize = sizeof(bDeviceID);
//DeviceID Hash abfragen
HRESULT hr = GetDeviceUniqueID(reinterpret_cast<PBYTE>(APPDATA), APPDATALEN, GETDEVICEUNIQUEID_V1, bDeviceID, &cbSize);
—————————————————
 
C#
Eigentlich könnte man sich bereits denken, dass man an dieser Stelle auch P/Invoke benötigen wird, um diese Funktionalität aus verwaltetem Code heraus zu lesen.😉
Hier somit das Snippet:
class Program
{
    [DllImport("coredll.dll")]
    private extern static int GetDeviceUniqueID([In, Out] byte[] appdata,
                           int cbApplictionData,
                            int dwDeviceIDVersion,
                            [In, Out] byte[] deviceIDOuput,
                            out uint pcbDeviceIDOutput);
    private static byte[] GetDeviceID(string AppString)
    {
        // Call the GetDeviceUniqueID
        byte[] AppData = Encoding.Unicode.GetBytes(AppString);
        int appDataSize = AppData.Length;
        byte[] DeviceOutput = new byte[20];
        uint SizeOut = 20;
        GetDeviceUniqueID(AppData, appDataSize, 1, DeviceOutput, out SizeOut);
        return DeviceOutput;
    }
    static void Main(string[] args)
    {
        byte[] id = GetDeviceID("MEINAPPDATAUID");
    }
}
Patrick & Peter

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s