• Introducing XDA Computing: Discussion zones for Hardware, Software, and more!    Check it out!

The DllImport Project (+/also C++ Wrapper) [Mango Support]

Search This thread

fiinix

Retired Recognized Developer
Oct 9, 2010
570
224
28
Stockholm
The DllImport Project

This project is part "Real DllImport" and also not the same time. It has limited DllImport to only types "void();" (well isn't that DllImport :D)

Other CORE functions that require multiple [IN] or/and [OUT] are to complex for the code right now (there are so many possibilities).


Terms of use, using the code (free to use, under my name "fiinix00 @ XDA"~ in app)

As posted to JaxBot :)
Well thanks for asking, this project is free for everyone, the one purpose it was made for.
The only thing i needed back is my name (fiinix @ XDA) included in whose projects (external) that take use of my code base. There is no licence or something (GNU e.g.), it just make people mad and confused.

So feel free to take advantage of the code whenever you want, just remember, i want my name on it. =D



UPDATE @ (2011y-03m-26d - 23:08)

Ohyeah, i can control zune from my application (Resume, Stop, Pause, NextSong, PrevSong, ShutdownZune, StartZune, ... to come)

Turn on/off radio remote from code. (DAMN, the radio begins to play without "No antenna" but no sound, plugin again and it sounds :/)


UPDATE @ (2011-03-27 - 14:35)
- Set clipboard (lol, doesent even have NODO): DllImportCaller.lib.Clipboard_SET("Hello");
- Get clipboard: DllImportCaller.lib.Clipboard_GET(ref [string]);
- Enchanted: Phone.Clipboard.Value { get { ... } set { ... } }
- Basic calls against void without arguments: DllImportCaller.lib.VoidCall( [DLL] , [Method] );
- API for verifying method existence: DllImportCaller.NativeMethodExists( [DLL] , [Method] );
- Raw API for controlling vibrator (unlimited "on", also continues to vibrate on exit, dont forget to turn off :D): Phone.Vibrator. { Vibrate(), Stop() }


Source code + test XAP updated (2011-03-27-17:38) (Clipboard GET; is corrupt)

HELLO THERE TASKMANAGER!!
(I can now enumerate the running processes on the phone :D)
Proof: http://moitox.com/WP7tskMngr.png


Hook to keyboard, for some reason it only show interest in the "Search" button.

Documentation of proc:
[WP7Process].{ CreationTime, ExitTime, KernelTime, UserTime, <-UpdateTimes(), Kill(exitCode), { PROCESSENTRY32 RAW } }

^ for "currentProcess.Kill()" use "Phone.TaskManager.GentlyExitCurrentProcess();" the Kill(exitCode) KILLS

WP7Process[] = Phone.TaskManager.Named("taskhost");
WP7Process = Phone.TaskManager.CurrentProcess();


Documentation of network
- ConnectionType { Unk0, Unk1, Unk2, Connected, Unk3 ... }
- ConnectionType = Phone.Network.GetWirlessState;



Phone.KeyboardHook.IsKeyDown(int key)
> Search = 124 (lol)


Misc finds

DllImportCaller.NativeMethodExists("urlmon", "IsIntranetAvailable");
DllImportCaller.NativeMethodExists("urlmon", "ObtainUserAgentString");

- Code updated! (2011-03-28-22:12)


Added "Phone.DEP", dep is a wrapper against info stored in "Microsoft.Phone.Info.DeviceExtendedProperties"

Full "TaskHost.exe" support

HostInformation = Phone.TaskHost.GetCurrenHostInfo();

HostInformation {
fDehydrating = 0,
fRehydrated = 0,
hHostWnd = -25821178 /* This silverlight managed window (host window) */
szAppDataFolder = "\\Applications\\Data\\8DC5214E-88FA-4C2D-A379-2CD74FE24B72\\Data"
szAppInstallFolder = "\\Applications\\Install\\8DC5214E-88FA-4C2D-A379-2CD74FE24B72\\Install"
szAppIsolatedStorePath = "\\Applications\\Data\\8DC5214E-88FA-4C2D-A379-2CD74FE24B72\\Data\\IsolatedStore"
szProductId = "{8DC5214E-88FA-4C2D-A379-2CD74FE24B72}"
szTaskPage = "MainPage.xaml" /* Current page? */
szUri = "app://8DC5214E-88FA-4C2D-A379-2CD74FE24B72/_default"
ullLastInstanceId = 39 /* fully retarded property? */
}

Code updated! (2011-03-29-23:25)

new Phone functionality

Phone.OS.{ Shutdown(ewxCode) } /* 1.0.2 can still call it with "DllImportCaller.lib.ShutdownOS" (failed tho on mine in 1.0.2) */

Added "GetLastError7" (C++ ::GetLastError()) for better C# side error handling.

Code updated! (2011-04-03-12:37)


Code updated! (2011-04-04-21:48)
- App launcher code!!
- Enchanted IO support
- 1.0.6!

Code updated! (2011-04-05-22:08)
- Enchanted task support
- Console7.Title { get; set; } etc.


Code updated! (2011-04-08-00:03)
- Stable%: 97 :/
- Battery support (see battery info (CORE only))
- Phone.Sound { MasterVolume!! { get; set; }, etc } (controlling phone master volume over all processes)
- Phone.OS.Kernel.ResetDevice(); (instant stops kernel, instant shutdown, not recommended!)


Code updated! (2011-04-09-22:39)
- Enchanted "Phone.Battery" class
- Phone.TaskManager.+GetCurrentProcessId
- WiFi Controll! (On/Off) (from code!)
- Bluetooth Controll! (On/Off) (from code here toe!)
- Phone.OS.+GetSystemStartupItems(),+GetDesktopWindowHandle()
- New class "Phone.Search."+SearchFor,+OpenSearch,+BindSearchButtonToPage (FAILS)
- New class "Phone.XboxLive"+GetIsXboxLiveEnable,+GetIsSignedIn
- Yep: 1.0.9!

Code updated! (2011-04-17-22:01) //damn, not update in 8 days~
- Phone.OS.OSLanguage { SubLanguageID, PrimaryLanguageID }
- Phone.WP7Process.+ CurrentProcessID (int),+GetCurrentProcess() returns guaranteed the right taskhost @class_WP7Process
- Improved Phone.OS.Memory
- + Extra i don't remember :) (8 days)

Code updated! (2011-05-22-21:25)
- 1.2.1 (because 1.2 methods was commented out to set things right (less crash))
- HUGE improvements
- Removed unneeded **** to speed things up
- Screenshot 161 ms per capture (non-save-to-gallery) =D
- =D

Mango support added(2011-10-26-19:30)
- yep, "ATL" Mango compiled. I have not yet tested to run it on a NoDo.
- Trying to implement a ASM virtual machine; example:
Code:
[ASMMethod(Dll = "coredll", EntryPoint = "GetLastError")]
public delegate int GetLastError();

var last = ASMGenerator.GenerateDelegateFor<GetLastError>();
int code = last();

Custom tile support added(2011-11-07-23:08)
- Custom core tiles ftw!
[/CODE]

Source: Attatchment
-Compile VS2008 folder with C++ compiler from WM6 SDK
-Windows Mobile SDK 6 PRO
-Visual Studio 2010 (+ WP7 Silverlight SDK)

Test-app: Attatchment
-Deploy
-No need anymore to do a initialize button call, automatic called on first use in code "DllImportcaller.lib.cctor" by JIT (Net Framework just in time).
-Do some tests from the scrolling list. (due there are more CORE back-code API's than buttons, all tests can not be tested).


OLDER VERSIONS WILL BE DEPRECATED AND WILL BE REPLACED BY NEWER, MAX ATTACHMENTS IS 8.
 
Last edited:

davux

Retired Recognized Developer
Aug 5, 2010
105
33
Searched for dllimport but did not found what i was searching for; so i need to ask about if it is possible to do a dllimport with interop in meta?
Because if not, i think i have found something quite the same without dllimport.


We can't p/invoke, but only use COM interfaces to interop with native code. What did you find?
 

fiinix

Retired Recognized Developer
Oct 9, 2010
570
224
28
Stockholm
Im trying the method, of c++ calling the calls for me.

In c++ i call "HMODULE dll = LoadLibrary("MyDLL.dll");" to get the native kerner32.dll e.g.
Then call "Dword addr = GetProcAddress(dll, "MyMethod");"

Code:
typedef HRESULT (STDAPICALLTYPE * LPFNBOX) (void);

C# -> COM (LoadLibrary e.g.) -> 
return dll addr -> return to C#
C# -> COM -> LPFNBOX * val = (LPFNBOX)GetProcAddress(addr, "method"); -> 
return val(); -> 
return to C#

May work with some privileges bypass, not tested. (^ Not programmer, skip it)
 

fiinix

Retired Recognized Developer
Oct 9, 2010
570
224
28
Stockholm
int result;
var hr = lib.MessageBox7("lpText", "lpCaption", MB.MB_OK, out result);

And: It shows a native msg box :)
 

fiinix

Retired Recognized Developer
Oct 9, 2010
570
224
28
Stockholm
It ** worked!

var t = DllImportCaller.Call<string, string>("coredll.dll", "CeRunAppAtEvent", "emptyArgs");

LoadLibrary7( .. "coredll.dll" .. ) @ -1304248592
GetProcAddress7( .. CeRunAppAtEvent" .. ) @ 1105512120

Now just "box" and call it :)
 

fiinix

Retired Recognized Developer
Oct 9, 2010
570
224
28
Stockholm
So you wrapped LoadLibrary/GetProcAddress via C++/COM, how is this any different than what we have now? It's easier to simply write C++ code and provide a calling mechanism. (Which is what we're doing.)
The use of dllimports (gdiplus.dll located in "\Windows\" for example) in C# code. And you dont need to know c++/programmer to call c++ methods anymore.
 

fiinix

Retired Recognized Developer
Oct 9, 2010
570
224
28
Stockholm
The last annoying, to get that IntPtr (native) to become a managed method... (it is possible). Anyways its going great, i'll continue tomorrow :)
 

Flow WP7

Member
Mar 23, 2011
29
3
Yeah, would be really cool if thats possible, then it would be possible todo everything over mscoree.dll, i guess?!

I found something intresting myself yesterday, the mscorlib.dll and System.dll on the phone are different from the ones in the sdk. (They contain a lot more stuff) Also the the mscorlib contains DllImports for almost everything.

If there is some way to get an internal class that would be also a great alternative...
 

fiinix

Retired Recognized Developer
Oct 9, 2010
570
224
28
Stockholm
Yeah, would be really cool if thats possible, then it would be possible todo everything over mscoree.dll, i guess?!

I found something intresting myself yesterday, the mscorlib.dll and System.dll on the phone are different from the ones in the sdk. (They contain a lot more stuff) Also the the mscorlib contains DllImports for almost everything.

If there is some way to get an internal class that would be also a great alternative...
Internal's -> typeof(CLASS).GetMethod( ... ).Invoke( ... ). Works perfect with </Interop> in manifest. Else "MethodAccessException".

And all those dllimports in mscore, plenty of them, most doing calls to mscoree :)
Goad is to do "DllImportCaller.Call( DLL, METHOD, ARGS )"~
 
  • Like
Reactions: Marvin_S

Flow WP7

Member
Mar 23, 2011
29
3
I just tried this:

Type type = Type.GetType("System.PInvoke.PAL");
Type type1 = Type.GetType("System.Host.HostNative+FIND_DATA");

object createInstance = Activator.CreateInstance(type1);

And this results into MethodAccessException

I have a WPInteropManifest.xml, so what do you mean by:

Works perfect with </Interop> in manifest. Else "MethodAccessException".

regards,
Flow
 

fiinix

Retired Recognized Developer
Oct 9, 2010
570
224
28
Stockholm
I just tried this:

Type type = Type.GetType("System.PInvoke.PAL");
Type type1 = Type.GetType("System.Host.HostNative+FIND_DATA");

object createInstance = Activator.CreateInstance(type1);

And this results into MethodAccessException

I have a WPInteropManifest.xml, so what do you mean by:



regards,
Flow
This is going kind of off topic. Stay to topic.
Anyways, Activaror.CreateInstance cannot create internal constructots, you need TYPE.GetConstructor( ... ).Invoke. Check visibility of ctor.
 

Top Liked Posts

  • There are no posts matching your filters.
  • 27
    The DllImport Project

    This project is part "Real DllImport" and also not the same time. It has limited DllImport to only types "void();" (well isn't that DllImport :D)

    Other CORE functions that require multiple [IN] or/and [OUT] are to complex for the code right now (there are so many possibilities).


    Terms of use, using the code (free to use, under my name "fiinix00 @ XDA"~ in app)

    As posted to JaxBot :)
    Well thanks for asking, this project is free for everyone, the one purpose it was made for.
    The only thing i needed back is my name (fiinix @ XDA) included in whose projects (external) that take use of my code base. There is no licence or something (GNU e.g.), it just make people mad and confused.

    So feel free to take advantage of the code whenever you want, just remember, i want my name on it. =D



    UPDATE @ (2011y-03m-26d - 23:08)

    Ohyeah, i can control zune from my application (Resume, Stop, Pause, NextSong, PrevSong, ShutdownZune, StartZune, ... to come)

    Turn on/off radio remote from code. (DAMN, the radio begins to play without "No antenna" but no sound, plugin again and it sounds :/)


    UPDATE @ (2011-03-27 - 14:35)
    - Set clipboard (lol, doesent even have NODO): DllImportCaller.lib.Clipboard_SET("Hello");
    - Get clipboard: DllImportCaller.lib.Clipboard_GET(ref [string]);
    - Enchanted: Phone.Clipboard.Value { get { ... } set { ... } }
    - Basic calls against void without arguments: DllImportCaller.lib.VoidCall( [DLL] , [Method] );
    - API for verifying method existence: DllImportCaller.NativeMethodExists( [DLL] , [Method] );
    - Raw API for controlling vibrator (unlimited "on", also continues to vibrate on exit, dont forget to turn off :D): Phone.Vibrator. { Vibrate(), Stop() }


    Source code + test XAP updated (2011-03-27-17:38) (Clipboard GET; is corrupt)

    HELLO THERE TASKMANAGER!!
    (I can now enumerate the running processes on the phone :D)
    Proof: http://moitox.com/WP7tskMngr.png


    Hook to keyboard, for some reason it only show interest in the "Search" button.

    Documentation of proc:
    [WP7Process].{ CreationTime, ExitTime, KernelTime, UserTime, <-UpdateTimes(), Kill(exitCode), { PROCESSENTRY32 RAW } }

    ^ for "currentProcess.Kill()" use "Phone.TaskManager.GentlyExitCurrentProcess();" the Kill(exitCode) KILLS

    WP7Process[] = Phone.TaskManager.Named("taskhost");
    WP7Process = Phone.TaskManager.CurrentProcess();


    Documentation of network
    - ConnectionType { Unk0, Unk1, Unk2, Connected, Unk3 ... }
    - ConnectionType = Phone.Network.GetWirlessState;



    Phone.KeyboardHook.IsKeyDown(int key)
    > Search = 124 (lol)


    Misc finds

    DllImportCaller.NativeMethodExists("urlmon", "IsIntranetAvailable");
    DllImportCaller.NativeMethodExists("urlmon", "ObtainUserAgentString");

    - Code updated! (2011-03-28-22:12)


    Added "Phone.DEP", dep is a wrapper against info stored in "Microsoft.Phone.Info.DeviceExtendedProperties"

    Full "TaskHost.exe" support

    HostInformation = Phone.TaskHost.GetCurrenHostInfo();

    HostInformation {
    fDehydrating = 0,
    fRehydrated = 0,
    hHostWnd = -25821178 /* This silverlight managed window (host window) */
    szAppDataFolder = "\\Applications\\Data\\8DC5214E-88FA-4C2D-A379-2CD74FE24B72\\Data"
    szAppInstallFolder = "\\Applications\\Install\\8DC5214E-88FA-4C2D-A379-2CD74FE24B72\\Install"
    szAppIsolatedStorePath = "\\Applications\\Data\\8DC5214E-88FA-4C2D-A379-2CD74FE24B72\\Data\\IsolatedStore"
    szProductId = "{8DC5214E-88FA-4C2D-A379-2CD74FE24B72}"
    szTaskPage = "MainPage.xaml" /* Current page? */
    szUri = "app://8DC5214E-88FA-4C2D-A379-2CD74FE24B72/_default"
    ullLastInstanceId = 39 /* fully retarded property? */
    }

    Code updated! (2011-03-29-23:25)

    new Phone functionality

    Phone.OS.{ Shutdown(ewxCode) } /* 1.0.2 can still call it with "DllImportCaller.lib.ShutdownOS" (failed tho on mine in 1.0.2) */

    Added "GetLastError7" (C++ ::GetLastError()) for better C# side error handling.

    Code updated! (2011-04-03-12:37)


    Code updated! (2011-04-04-21:48)
    - App launcher code!!
    - Enchanted IO support
    - 1.0.6!

    Code updated! (2011-04-05-22:08)
    - Enchanted task support
    - Console7.Title { get; set; } etc.


    Code updated! (2011-04-08-00:03)
    - Stable%: 97 :/
    - Battery support (see battery info (CORE only))
    - Phone.Sound { MasterVolume!! { get; set; }, etc } (controlling phone master volume over all processes)
    - Phone.OS.Kernel.ResetDevice(); (instant stops kernel, instant shutdown, not recommended!)


    Code updated! (2011-04-09-22:39)
    - Enchanted "Phone.Battery" class
    - Phone.TaskManager.+GetCurrentProcessId
    - WiFi Controll! (On/Off) (from code!)
    - Bluetooth Controll! (On/Off) (from code here toe!)
    - Phone.OS.+GetSystemStartupItems(),+GetDesktopWindowHandle()
    - New class "Phone.Search."+SearchFor,+OpenSearch,+BindSearchButtonToPage (FAILS)
    - New class "Phone.XboxLive"+GetIsXboxLiveEnable,+GetIsSignedIn
    - Yep: 1.0.9!

    Code updated! (2011-04-17-22:01) //damn, not update in 8 days~
    - Phone.OS.OSLanguage { SubLanguageID, PrimaryLanguageID }
    - Phone.WP7Process.+ CurrentProcessID (int),+GetCurrentProcess() returns guaranteed the right taskhost @class_WP7Process
    - Improved Phone.OS.Memory
    - + Extra i don't remember :) (8 days)

    Code updated! (2011-05-22-21:25)
    - 1.2.1 (because 1.2 methods was commented out to set things right (less crash))
    - HUGE improvements
    - Removed unneeded **** to speed things up
    - Screenshot 161 ms per capture (non-save-to-gallery) =D
    - =D

    Mango support added(2011-10-26-19:30)
    - yep, "ATL" Mango compiled. I have not yet tested to run it on a NoDo.
    - Trying to implement a ASM virtual machine; example:
    Code:
    [ASMMethod(Dll = "coredll", EntryPoint = "GetLastError")]
    public delegate int GetLastError();
    
    var last = ASMGenerator.GenerateDelegateFor<GetLastError>();
    int code = last();

    Custom tile support added(2011-11-07-23:08)
    - Custom core tiles ftw!
    [/CODE]

    Source: Attatchment
    -Compile VS2008 folder with C++ compiler from WM6 SDK
    -Windows Mobile SDK 6 PRO
    -Visual Studio 2010 (+ WP7 Silverlight SDK)

    Test-app: Attatchment
    -Deploy
    -No need anymore to do a initialize button call, automatic called on first use in code "DllImportcaller.lib.cctor" by JIT (Net Framework just in time).
    -Do some tests from the scrolling list. (due there are more CORE back-code API's than buttons, all tests can not be tested).


    OLDER VERSIONS WILL BE DEPRECATED AND WILL BE REPLACED BY NEWER, MAX ATTACHMENTS IS 8.
    2
    Dumping this picture because it soooo wrong haha
    Corrupt code system ftw :p

    Also, i can create any type of tile (Wide tile shown in attachment)
    - TemplateType14

    Default is TemplateType5 = 5
    2
    Well, there we go. I did just shut down the phone with code (phone sided code)! :D

    DllImportCaller.lib.ShutdownOS();
    2
    Some new info for you guys.
    I think i have cracked the tile system, creating custom tiles, executing what ever you want.

    I extracted COM+ dll's from the system _itself_ that controls the managed shell-tile system, and instead of being controlled by MS restrictions (sandbox tile creation), i can create my own tiles (with what ever i want)

    Thats about it :)
    - Dont be to excited now, im not 100% it will work; if there are internal C++ checks too.

    edit: **** yar! 500'th post. Go XDA :p

    edit 2:
    CONFIRMED It works woah!
    Code:
    var tiles = HackedShellTile.ActiveTiles.ToArray();

    All tiles on the front screen has a token; DllImport Projects token is "CSharp___DllImportToken" with "/" as uri (normal launch; no "/?ebayProduct=1337")
    - CSharp___DllImportToken comes originality from WMAppManifest.xml (WP7 project) under xml:
    Code:
    <PrimaryToken TokenID="CSharp___DllImportToken" TaskName="_default">
    2
    Hi, first off thanks for your great work!

    I am referencing the CSharp___DllImport project in another project and when I run it I get a TargetInvocationException in Interop.cs for the following line:

    Code:
    return last = (uint)dynMethod.Invoke(null, new object[] { assemblyDLL, new Guid(guid) });

    Someone else in this thread had this problem before but there was no solution. Do you have an idea what I could do to fix that?

    Thanks!
    Have you copied all needed dll's and files localy to the specified project (Build Action: Content) ?

    Some of them (You can find them in the xap/rar):
    - WPInteropManifest.xml
    - DllImportMango.dll
    - Microsoft.Phone.InteropServices.dll

    And added "<Capability Name="ID_CAP_INTEROPSERVICES" />"?