Getting restricted SIM access via RIL in C++ - Windows Mobile Development and Hacking General

Hi folks!
I'm currently trying to develop an Application for displaying a so-called "HomeZone-Icon" that indicates lower telephony-rates in special geographic areas.
The centers of that spots and the radius of the area is stored into the SIM-card by our provider O2.
Now I need to get this information out of this card.
I know where to search (File ID 28512), know what command (Binary read) and have given Parameters (don't know for what they are 0,0,123)
When I use my common (non Windows Mobile) mobile from Siemens for extracting these informations via the at-command AT+CRSM everything goes right and I'm able to locate my areas by just converting the hexadez. notation into dez. notation. The result is a GK-Code.
But by using the RIL-API i can notice that it is the right file (because other file ids cause responding with less filelength - perhaps online steering signals of the file system) but the given data doesn't seem to be the same. And even after many nights I'm still unable to find any system behind this response that relates it to what it should be.
The transcript of the terminal session with my Siemens S45 above the result of the RIL API
Code:
at
OK
at&f
OK
AT+CRSM=176,28512,0,0,123
+CRSM: 144,0,
1107919471060040340C84947106000100
01 000516E7 0008B3D2 00007D29 01686F6D65FFFFFFFFFFFFFFFF
02 00000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF
03 00000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF
04 00051674 0008B497 00093040 036369747
Smartphone-API-resonse:
000000107800001033F011003F2231005F
12000050009F22800090105F2294400000
50009F2280005F12900050108F22C0100A
C800009CFFDF22A3408000000090000000
5000
The API was called with:
Code:
#include "ril.h"
HRESULT stkExec()
{
//AT+CRSM=176,28512,0,0,123
RILSIMCMDPARAMETERS sTKparams;
sTKparams.dwParams = RIL_PARAM_SCP_ALL;
sTKparams.dwFileID = 28512;
sTKparams.dwParameter1 = 0;
sTKparams.dwParameter2 = 0;
sTKparams.dwParameter3 = 123;
sTKparams.cbSize=sizeof(RILSIMCMDPARAMETERS);
return RIL_SendRestrictedSimCmd(m_hRil,RIL_SIMCMD_READBINARY, &sTKparams, NULL, 0);
}
Thank you in advance for your help!
This forum is awesome, noticed it at developing my navigation-program. (http://gknavigation.de)
Florian

Related

Detecting Sim-Status via APIs?

Hi,
I'm trying to detect the status of the sim-card, i.e. phone off/sim not inserted/sim not ready/sim waiting for pin or puk/sim ready.
i've tried using the SIM API, more detailed, I've tried to do a SimInitialize and use the returning HRESULT to determine the SIM status. But somehow, I guess because it's not totally implemented in wm5.0, it always returns S_OK or S_FAILED.
Does anybody know of a way to detect the sim-status?
thanks!!
You can do it with RIL with no problems and for all platforms.
hi rain,
thank you for your reply. care to elaborate? which functions provide me with the information i need?
For phone status you need to call RIL_GetEquipmentState. The result will be received in RILResultCallBack. Check the ril header for the possible results. Also in the RilNotifyCallback you will receive a
RIL_NOTIFY_RADIOEQUIPMENTSTATECHANGED when the phone radio status is changing. In this case you need to call RIL_GetEquipmentState again and of course you will receive the result in the result callback.
When you receive the result you can also check if the SIM is ready or if you can send an SMS in the current hardware state.
Soon teksoft will release a wrapper arround the ril library so i cannot post a detailed sample.
Cheers.
Raul
interesting.. either my ril.h is out of date or there are alot of new READYSTATEs for the wm2005/xda trion/hermes (maybe because WIFI is using ril too??)
here are my updated constants so far:
Code:
#define RIL_READYSTATE_NONE (0x00000000) // @constdefine Nothing is ready yet
#define RIL_READYSTATE_INITIALIZED (0x00000001) // @constdefine The Radio has been initialized (but may not be ready)
#define RIL_READYSTATE_SIM (0x00000002) // @constdefine The Radio is ready for SIM Access
// ++add dutty
#define RIL_READYSTATE_WAITING (0x00000003) // @constdefine Radio is waiting for SIM password
#define RIL_READYSTATE_INITIALIZING (0x0000000b) // @constdefine Radio is beeing initialized
// --add dutty
#define RIL_READYSTATE_SMS (0x00000004) // @constdefine The Radio is ready for SMS messages
#define RIL_READYSTATE_UNLOCKED (0x00000008) // @constdefine The SIM is unlocked
the hex i get returned when the phone is ready is 0x1b .. i havent added this yet because i need to get the result of an xda mini or another smartphone.
did anybody notice that too?

TrackMe's web development and user plugins. Developers welcome!!

As some people suggested I'm creating an specific thread for TrackMe's web development.
TrackMe is a free GPS/WiFi/Cell ID tracking tool. You can watch your tracks (saved or live) with Google Earth, Google Maps (or any tool that accepts KML or GPX files). It also includes many other options and features.
You can also watch your tracks from the web. This thread is focused on that part.
TrackMe is available for Android, Windows Mobile and Windows Phone 7. Check my signature for support for each version.
Visit TrackMe's main thread
If you are interested you can contribute working on one of the existing viewers or creating one of your own.
OFFICIAL RELEASE
Authors
OpitZle, pammetje, mcross, jcleek and _LEM_ (only TrackMe client<->server communication)
Database
MySQL
Language
PHP
Download
Press here to download the latest version
Screenshots
{
"lightbox_close": "Close",
"lightbox_next": "Next",
"lightbox_previous": "Previous",
"lightbox_error": "The requested content cannot be loaded. Please try again later.",
"lightbox_start_slideshow": "Start slideshow",
"lightbox_stop_slideshow": "Stop slideshow",
"lightbox_full_screen": "Full screen",
"lightbox_thumbnails": "Thumbnails",
"lightbox_download": "Download",
"lightbox_share": "Share",
"lightbox_zoom": "Zoom",
"lightbox_new_window": "New window",
"lightbox_toggle_sidebar": "Toggle sidebar"
}
Here is some description for the TrackMe-Server communication
Requests.xxx file
Code:
All requests
------------
Result:1 User correct, invalid password.
Result:2 User did not exist but after being created couldn't be found.
Result:3 User or password not specified.
Result:4 Unable to connect database.
Result:5 Incompatible database.
Action="delete"
---------------
Result:0 OK
Action="deletetrip"
-------------------
Result:0 OK
Result:6 Trip not specified.
Result:7 Trip not found
Action="addtrip"
----------------
Result:0 OK
Result:6 Trip not specified.
Action="renametrip"
------------------
Result:0 OK
Result:6 Trip not specified.
Result:7 New name not specified.
Action="findclosestbuddy"
-------------------------
Result:0|DISTANCE|DATEOCCURRED|USERID
Result:6 User has no positions.
Result:7 No positions from other users found.
Action="gettriplist"
------------------
Result:0|NAME1|DATE2\nNAME2\DATE2\n ...
Result:6 Trip not specified.
Result:7 New name not specified.
Action="geticonlist"
------------------
Result:0|ICON1|ICON2|ICON3 ...
Action="upload"
------------------
Result:0 OK
Result:6 Trip didn't exist and system was unable to create it.
Result:7|SQLERROR Insert statement failed.
Action="sendemail"
------------------
Result:0 OK
Action="updateimageurl"
------------------
Result:0 OK
Action="findclosestpositionbytime"
----------------------------------
Result:0|POSITIONID|DATEOCCURRED
Result:6 Date not specified
Result:7 No position for user found.
Action="findclosestpositionbyposition"
--------------------------------------
Result:0|POSITIONID|DATEOCCURRED|DISTANCE
Result:6 Position not specified
Result:7 No position for user found.
Action="gettripinfo"
--------------------
Result:0|totalmiles|startdate|enddate|totaltime|totalpositions|maxspeed|avgspeed|maxaltitude|avgaltitude|minaltitude
Result:6 Trip not specified
Result:7 Trip not found
Action="gettriphighlights"
--------------------------
Result:0|Latitude1|Longitude1|ImageURL1|Comments1|IconURL1\nLatitude2|Longitude2|ImageURL2|Comments2|IconURL2\n ...
Result:6 Trip not specified
Result:7 Trip not found
I will be adding the rest of the files later...
Plugins
1. TrackMe (NMEA records) to OziExplorer (.plt) converter by tahdor
Description:
Simple perl script which takes the TrackMe (NMEA records) and put them as OziExplorer (.plt) format. Then you can open the .plf record in GpsVp to view the track.
Code:
# TrackMe.To.GpsVp.pl
#
$pll_ifname = "/Program Files/TrackMe/gpspositions.txt";
$pll_ofpath = "/Storage Card/Maps gpxVPTracks/";
#$pll_ifname = "gpspositions.txt";
#$pll_ofpath = "";
$pll_ofname = "gpspositions.plt";
$pll_ofname_date = "";
$maxtrack = 12;
sub pls_open_infile {
local ($pll_ifname, *PLL_F_IN_FPTR) = @_;
if (! open (PLL_F_IN_FPTR, "$pll_ifname")) {
warn "$pll_ifname: $!\n";
return -1;
}
return 0;
}
sub pls_open_outfile_overwrite {
local ($pll_outfname, *PLL_F_OUT_FPTR) = @_;
if (!open (PLL_F_OUT_FPTR, ">$pll_outfname")) {
warn "$pll_outfname: $!\n";
# die "$pll_outfname: $!\n";
return -1;
}
return 0;
}
sub pls_open_outfile_append {
local ($pll_outfname, *PLL_F_OUT_FPTR) = @_;
if (!open (PLL_F_OUT_FPTR, ">>$pll_outfname")) {
warn "$pll_outfname: $!\n";
# die "$pll_outfname: $!\n";
return -1;
}
return 0;
}
if (&pls_open_infile($pll_ifname, PLL_F_IN_FPTR) < 0) {
die "couldn't open output file $pll_ifname\n";
}
if (&pls_open_outfile_overwrite($pll_ofname, PLL_F_OUT_FPTR) < 0) {
die "couldn't open output file $pll_ofname\n";
}
sub output {
if ("$lat_rmc" ne "0") {
print PLL_F_OUT_FPTR sprintf ("%2.7f,%2.7f,0,%3.1f,%d,%s,%s\n", $lat_rmc,
$long_rmc, $alt_gga * 3.2808399, 0, $date, $time_rmc);
}
}
sub latitude {
my ($deg, $min) = unpack "a2a*", $_[0];
my $lat = $deg + $min / 60;
$lat = - $lat if $_[1] =~ /[Ss]/;
return $lat;
}
sub longitude {
my ($deg, $min) = unpack "a3a*", $_[0];
my $long = $deg + $min / 60;
$long = - $long if $_[1] =~ /[Ww]/;
return $long;
}
while ($line = <PLL_F_IN_FPTR>) {
chomp($line);
@field = split /[,*]/, $line;
SWITCH: {
# recommended minimum specific GPS/Transit data
if ($field[0] =~ /GPRMC/) {
# $time_rmc = join ':', unpack "a2" x 3, $field[1];
$time_rmc = join '.', unpack "a2" x 3, $field[1];
$ok_rmc = $field[2];
$lat_rmc = latitude(@field[3..4]);
$long_rmc = longitude(@field[5..6]);
$speed = $field[7];
$cmg = $field[8];
#$date = join '-', unpack "a2" x 3, $field[9];
$date = substr($field[9],4,2) .'-'. substr($field[9],2,2) .'-'. substr($field[9],0,2);
$mvar = $field[10] . $field[11];
# field[12] is checksum
if ($date ne $pll_ofname_date) {
$pll_ofname = $pll_ofpath . "Tm.$date.$time_rmc.plt";
$pll_ofname_date = $date;
if (&pls_open_outfile_overwrite($pll_ofname, PLL_F_OUT_FPTR) < 0) {
die "couldn't open output file $pll_ofname\n";
}
print PLL_F_OUT_FPTR "OziExplorer Track Point File Version 2.1\n";
print PLL_F_OUT_FPTR "WGS 84\n";
print PLL_F_OUT_FPTR "Altitude is in Feet\n";
print PLL_F_OUT_FPTR "Reserved\n";
print PLL_F_OUT_FPTR "0,2,128,,0,0,2,0\n";
print PLL_F_OUT_FPTR "1\n";
}
output();
last SWITCH;
}
# GPS fix data
if ($field[0] =~ /GPGGA/) {
$time_gga = join ':', unpack "a2" x 3, $field[1];
$lat_gga = latitude(@field[2..3]);
$long_gga = longitude(@field[4..5]);
$fixqual = $field[6];
$nsat = $field[7];
$hdop_gga = $field[8];
$alt_gga = $field[9];
# $field[10] is altitude units (always M)
$gheight = $field[11];
# $field[12] is geoid height units (always M)
$DGPS_age = $field[13];
$DGPS_ID = $field[14];
# field[15] is checksum;
last SWITCH;
}
}
}
2. User limitation for web viewer access by Real_Justus
Description:
Limit access to Web viewer for servers running in public mode
I was wondering how I could limit the access to my server. I wanted a group of users to be able to track all TrackMe clients via GoogleMaps.
The attached three files will enable a simple authorization for users. The server has to be installed accessable for everyone (public).
To create the authorziation, you have to edit .htaccess and htpasswd from the ZIP attached as follows:
1: Open .htaccess with the texteditor.
2: In the line "AuthUserFile" you have to add the WHOLE path to .htpasswd.
3: .htpasswd contains the users. The username is just plain text. The password is ht-encrypted. You can encrypt passwords here.
4: When both files are modifyed for your needs, upload them to the TrackMe directory on your server. If this is done correctly, a simple authorization is required for opening the webinterface for your TrackMe-server. All valid users can Track all clients.
If you don´t know the exactly path, upload phpinfo.php from the ZIP attached to the TrackMe directory on your server and open the file in your browser. (http://www.yourserver.com/TrackMe/phpinfo.php). Search for "Document_ Root" The path might be something like: /var/www/user/html/YourTrackMe/Directory. Insert the path in .htaccess
!!!Make sure to delete the phpinfo.php after use!!!
Files: Download
3. Plugin that allows you to assign multiple pictures to a single position by ElHozo
Description:
I've made a change in tod files of the server to allow view of multiple pictures in on dialog ballon. This (at least for me) is very usefull when you want to take many pictures from one place (no position change)
You have to edit to files
in request.php make this change to allow having multiples images in one single position record
Code:
if($action=="updateimageurl")
{
$imageurl = urldecode($_GET["imageurl"]);
$id = urldecode($_GET["id"]);
$iconid='null';
$result=mysql_query("Select ID FROM icons WHERE name = 'Camera'");
if ( $row=mysql_fetch_array($result) )
$iconid=$row['ID'];
/* HOZO 20/Jun/2009 : Esta es la modficacion que permite poner mas de una
* imagen en un solo punto, pone las url una atras de otra saparadas por un
* espacio. la linea que queda comentada es la original.
* Ver en index.php el cambio que las muestra en el globo del dialogo */
// BEGIN ORIGINAL CODE - MUST BE COMMENTED
//mysql_query("update positions set imageurl='$imageurl',fk_icons_id=$iconid where id=$id");
// END ORIGINAL CODE
// BEGIN NEW CODE
mysql_query("update positions set imageurl=CONCAT_WS(' ', imageurl, TRIM('".$imageurl."')), fk_icons_id='".$iconid."' where id='".$id."'");
// END NEW CODE
echo "Result:0";
die();
}
in index.php change this to show multiple images in one dialog balloon
Code:
if($row['ImageURL'])
{
/* HOZO 20/Jul/2009 : Agregar este pedazo de codigo en reemplazo del orginal,
* la ultima linea que esta comentada es la orgiinal.*/
// BEGIN NEW CODE
// Por las dudas me aseguro de eliminar espacios duplicados
$row['ImageURL'] = eregi_replace (" ", " ", $row['ImageURL']);
$row['ImageURL'] = eregi_replace (" ", " ", $row['ImageURL']);
$stFotos = explode (" ", trim($row['ImageURL']));
// Armo la cantidad de columnas y tamaño de la imagen del globo
// de acuerdo a la cantidad de fotos que haya para mostrar
if (count ($stFotos) == 1)
{
$inFotosCols = 1;
$inImgWidth = 200;
}
else
{
$inFotosCols = count ($stFotos);
if ($inFotosCols > 16)
$inFotosCols = 5;
else if ($inFotosCols > 9)
$inFotosCols = 4;
else if ($inFotosCols > 3)
$inFotosCols = 3;
$inImgWidth = ( 400 / $inFotosCols ) - 5;
}
$html .= "<tr><td>";
$html .= "<table>";
$inFotoIndex = 0;
while (list ($inKey, $szData) = each ($stFotos))
{
if ( ($inFotoIndex % $inFotosCols) == 0)
$html .= "<tr>";
$inFotoIndex++;
$html .= "<td><a><img></a></td>";
if ( ($inFotoIndex % $inF";
}
$html .= "</tr>";
$html .= "</table>";
$html .= "</td>";
$html .= "</tr>";
// END NEW CODE
// La que sigue es la linea orignal de codigo
// BEGIN ORIGINAL CODE - MUST BE COMMENTED
//$html .= " <tr><td><a><img></a></td></tr>";
// END ORIGINAL CODE
}
Know issues : The filed imgeurl in DB is limited to 255 chars, is better if you change this value to something bigger to fit more images urls.
I have included a ZIP with the two modified files
Files: Download
Great new thread!
Let the development begin!
With the advice of timoline I'm playing (and I'm trying to understand) with open-flash-chart.
Here is my first try :
When you move the mouse on the graphic, there is a sticker with the speed.
I'm trying to add the altitude on red with the Y axis right. But It doesn't works for now.
Thanks for your advice Timoline .
Is there some sort of ocumentation about the TrackMe <-> Webserver communication? It would be nice if you can write a little about this.
I point as I browsed the source I saw that the password was transmit unencrypted maybe you can change that to md5 or somthing similar?
Btw. Trackme is a great App
Diggen said:
Is there some sort of ocumentation about the TrackMe <-> Webserver communication? It would be nice if you can write a little about this.
I point as I browsed the source I saw that the password was transmit unencrypted maybe you can change that to md5 or somthing similar?
Btw. Trackme is a great App
Click to expand...
Click to collapse
Thanks.
Unfortunately there is not doc about the server-client communication.
However, feel free to ask any questions about that here.
Regarding the encrypted pass... yes, that's in the to-do list (actually it has been there for a long time) but there is something that I want to ask.
Let's suppose that from the client I do $encrypted = encode_md5(password)
And now that's what I send to the server.
On the server side, should I do $pass = decode_md5 ($encrypted) ?
or it's not necessary because I am going to store the pass already encrypted in the database?
And one more thing, what's really the purpose of that encoding? If somebody has access to the encrypted password, wouldn't he be able to do the same things than if it is not encrypted?
I mean if I my password is role392 and the encryped one is sadj2jkfDk43j54... what's really the difference? Both are like regular passwords.
I hope it makes sense.
It makes more or less sense
Normal a webapp stores the password 'encrypted' with md5 in its Database. From the Login it gets clearly send per Post and the server will 'encrypt' it. Then it verfy it against the md5 hash in the db. You will be still able to sniff it but if the DB gets hacked you will only have the md5 values which can't be decoded. Also because of the Post-Method the Pass is not clearly visible in the URL.
Thats not much secruity but a little more. Maybe you can XOR the md5 with the actuall hour/minute at the client side and send it. At server-side you will do the same with the saved md5 an look if they are the same. This is a little more secure but not much.
I hope you understand me and my 'broken' Englisch
For the Docs I will have a look at the code when there is Time because I'am on a tenancy changeover(?).
Language Update
I've updated the dutch part in the language.php from jcleek's web viewer.
See attachment:
I've been working on my own server development, at the moment I have:
1. Weather at the persons current or last postion.
2. Address of the persons current or last position (I think US only)
3. Geofence option that texts whoever the user wants to text when the user has entered a predefined area.
4. Ability to place markers on the map for whatever purpose the user chooses, business, personal or otherwise.
5. The server stores the mileage driven in each state or country if the user chooses for fuel tax or other reasons.
6. Server is not just limited to Trackme, it can also be an alturl for Mologogo, and a custom server for GPSGate. Server still retains all Trackme functionality.
http://fleettracking.fleettrack.net/maps.php
The frontend is still a little "raw", as I am concentrating on the back end for the moment.
Diggen said:
It makes more or less sense
Normal a webapp stores the password 'encrypted' with md5 in its Database. From the Login it gets clearly send per Post and the server will 'encrypt' it. Then it verfy it against the md5 hash in the db. You will be still able to sniff it but if the DB gets hacked you will only have the md5 values which can't be decoded. Also because of the Post-Method the Pass is not clearly visible in the URL.
Thats not much secruity but a little more. Maybe you can XOR the md5 with the actuall hour/minute at the client side and send it. At server-side you will do the same with the saved md5 an look if they are the same. This is a little more secure but not much.
I hope you understand me and my 'broken' Englisch
For the Docs I will have a look at the code when there is Time because I'am on a tenancy changeover(?).
Click to expand...
Click to collapse
Thanks a lot for the detailed explanation!!
I think I will start by encoding it in MD5 only in the database. I may add the XOR later.
Regards
WatskeBart said:
I've updated the dutch part in the language.php from jcleek's web viewer.
See attachment:
Click to expand...
Click to collapse
Thanks for that but I think you forgot to include that attachment.
Go3Team said:
I've been working on my own server development, at the moment I have:
1. Weather at the persons current or last postion.
2. Address of the persons current or last position (I think US only)
3. Geofence option that texts whoever the user wants to text when the user has entered a predefined area.
4. Ability to place markers on the map for whatever purpose the user chooses, business, personal or otherwise.
5. The server stores the mileage driven in each state or country if the user chooses for fuel tax or other reasons.
6. Server is not just limited to Trackme, it can also be an alturl for Mologogo, and a custom server for GPSGate. Server still retains all Trackme functionality.
http://fleettracking.fleettrack.net/maps.php
The frontend is still a little "raw", as I am concentrating on the back end for the moment.
Click to expand...
Click to collapse
hey looks good!! Let me know when you have something to release so I can add your viewer in the first post.
Thanks a lot for your contribution.
and please keep us updated!
Not so detailed but some basics maybe you will have a look at http://en.wikipedia.org/wiki/Md5 or http://en.wikipedia.org/wiki/Sha-1
Another thing, is it possible to have the server running on an selfsigned ssl server ?
The next point is. I've made a list of functions/ requests required by TrackMe on the Serverside.
Can you have a look at it staryon? The other aswell
I hope I made no mistake and all is there also its not very well layouted but better than nothing. Some function doesn't have an errorcode is this right? or not implentet a serverside?
Diggen said:
Not so detailed but some basics maybe you will have a look at http://en.wikipedia.org/wiki/Md5 or http://en.wikipedia.org/wiki/Sha-1
Another thing, is it possible to have the server running on an selfsigned ssl server ?
The next point is. I've made a list of functions/ requests required by TrackMe on the Serverside.
Can you have a look at it staryon? The other aswell
I hope I made no mistake and all is there also its not very well layouted but better than nothing. Some function doesn't have an errorcode is this right? or not implentet a serverside?
Click to expand...
Click to collapse
Unless I missed something it looks ok to me.
I just updated the second post inside this thread with information about the server-client communication.
Please let me know if you need information about a specific parameter.
Cheers
staryon said:
Unless I missed something it looks ok to me.
I just updated the second post inside this thread with information about the server-client communication.
Please let me know if you need information about a specific parameter.
Cheers
Click to expand...
Click to collapse
The only things which are from interest as well are the Date / Long / Lat / .... dataformats, but they are all in the DB like they transmited, if I am right?
Maybe one last thing have you some testing app or something else to test the communication without Trackme and the Phone because my Dataplan is not unlimited. Else I will make manual Request iin the webbrowser.
thanks for your quick responses
EDIT:
Ok found out some Formats
Date - YYYY-MM-DD HH:MM:SS
lon/lat - xx.XXXXXX -
WGS48 ? - but then the dot is moved 2 left and there are no East,West,Nord,South data? Can you help me here with the format?
BatteryStatus in % 0-100
Singalstrengh in dB ? -xxx
CID - X-X-XXX-XXXXX
For these I've no Data because there are no Trips with GPS in the DB, waiting for my X1.
Speed
Angle
Altitude
Diggen said:
Maybe one last thing have you some testing app or something else to test the communication without Trackme and the Phone because my Dataplan is not unlimited. Else I will make manual Request iin the webbrowser.
Click to expand...
Click to collapse
No, I don't have anything. Actually when I was developing the program I used the web browser as well.
Diggen said:
lon/lat - xx.XXXXXX -
WGS48 ? - but then the dot is moved 2 left and there are no East,West,Nord,South data? Can you help me here with the format?
Click to expand...
Click to collapse
The format is in decimal degrees.
Where 32.30642° N = 32.30642
or 122.61458° W = -122.61458
(I mean W and S are negative)
Diggen said:
BatteryStatus in % 0-100
Click to expand...
Click to collapse
Yes
Diggen said:
Singalstrengh in dB ? -xxx
Click to expand...
Click to collapse
yes, dBm.
Diggen said:
CID - X-X-XXX-XXXXX
Click to expand...
Click to collapse
MobileCountryCode-MobileNetworkCode-LocationAreaCode-CellID
Hope it helps!
Diggen said:
EDIT:
Ok found out some Formats
Date - YYYY-MM-DD HH:MM:SS
lon/lat - xx.XXXXXX -
WGS48 ? - but then the dot is moved 2 left and there are no East,West,Nord,South data? Can you help me here with the format?
BatteryStatus in % 0-100
Singalstrengh in dB ? -xxx
CID - X-X-XXX-XXXXX
For these I've no Data because there are no Trips with GPS in the DB, waiting for my X1.
Speed
Angle
Altitude
Click to expand...
Click to collapse
Here is how the GET is given to the server (this is an actual one pulled from my logs). I use CDMA, so I can't use CELLID:
requests.php?a=upload&u=xxxxxxxx&p=xxxxxxx&lat=37.54446&long=-76.8039466666667&do=2009-2-2%209:18:19&tn=02-01-09&alt=-31.4&sp=&ang=77.2&bs=100&db=8
I round the lat and lon to 5 places after the decimal as anything more is just wasted db usage.
Go3Team said:
I round the lat and lon to 5 places after the decimal as anything more is just wasted db usage.
Click to expand...
Click to collapse
You're right, I would like to truncate those values before being sent to the server one day...
staryon said:
Here is some description for the TrackMe-Server communication
Action="upload"
------------------
Result:0 OK
Result:6 Trip didn't exist and system was unable to create it.
Result:7|SQLERROR Insert statement failed.
Click to expand...
Click to collapse
I was wondering why the server was returning bytes to the client, and was trying to track down to see if it was an error. I am corrent when a Result:0 is returned, that everything was done fine?

Why the basic OPENGL ES app can not run on my Touch HD?

Hi, all.
I find this perfect site through Google after I bought a Blackstone.
I want to do something on my phone, that's OpenGL ES.
When I download the sample code "7 OpenGL ES Tutorials for Win32/WinCE from TyphoonLabs" from khronos and compile them. The samples run well on the Windows Mobile 6.5 Emulator. (there is no libGLES_cm.dll file in the windows folder)
But, when I copy the exe files to my Blackstone, they failed to run. The Tutorials 1 only flash a title then over.
I can find a libGLES_cm.dll file in the windows folder of my Blackstone. It is 322KB, smaller than others I can get. (such as 491KB 10-10-2004). I can't replace it or delete it.
I think the 1st sample of TyphoonLabs is a typical and basic OpenGL ES app, it has not use any advanced ES feature.
however, VR HOLOGRAM runs well on my phone.
I installed "Ati d3d driver", and my app development environment is:
Visual Studio 2008
Windows Mobile 6 SDK
thanks
Have a look at the first post of my OpenGLES test app(check my sig) and try to run this app (take the latest one). There is also a link to a thread about a driverpack (v3 has just been released). Just to be sure that your device has some OpenGLES capable drivers.
AFAIK the hologram app uses d3d.
edit: The examples you mentioned create a rendering device using Red 8, Green 8, Blue 8 bits. Change them to 5, 6, 5 and try again. And don't copy their libgles_cm.dll to the device. Instead use the latest driverpack as described above.
Thank you, heliosdev
yes, i already tried your OpenGLES test app. it runs well also on my phone, but I don't understand C. do you have C code?
i try to modify the sample code following you instruction. but i failed. where am i wrong?
BOOL InitOGLES()
{
EGLConfig configs[10];
EGLint matchingConfigs;
const EGLint configAttribs[] =
{
EGL_RED_SIZE, 5, // i changed it from 8 to 5
EGL_GREEN_SIZE, 6, // i changed it from 8 to 6
EGL_BLUE_SIZE, 5, // i changed it from 8 to 5
EGL_ALPHA_SIZE, EGL_DONT_CARE,
EGL_DEPTH_SIZE, 16,
EGL_STENCIL_SIZE, EGL_DONT_CARE,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_NONE, EGL_NONE
};
hDC = GetWindowDC(hWnd);
glesDisplay = eglGetDisplay((NativeDisplayType)hDC);
if(!eglInitialize(glesDisplay, NULL, NULL))
return FALSE;
if(!eglChooseConfig(glesDisplay, configAttribs, &configs[0], 10, &matchingConfigs))
return FALSE;
if (matchingConfigs < 1) return FALSE;
glesSurface = eglCreateWindowSurface(glesDisplay, configs[0], hWnd, configAttribs);
if(!glesSurface) return FALSE;
glesContext=eglCreateContext(glesDisplay,configs[0],0,configAttribs);
if(!glesContext) return FALSE;
eglMakeCurrent(glesDisplay, glesSurface, glesSurface, glesContext);
glClearColorx(0, 0, 0, 0);
glShadeModel(GL_SMOOTH);
RECT r;
GetWindowRect(hWnd, &r);
glViewport(r.left, r.top, r.right - r.left, r.bottom - r.top);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthox(FixedFromInt(-50), FixedFromInt(50),
FixedFromInt(-50), FixedFromInt(50),
FixedFromInt(-50), FixedFromInt(50));
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
return TRUE;
}
//----------------------------------------------------------------------------
void Render()
{
static int rotation = 0;
GLshort vertexArray[9] = {-25,-25,0, 25,-25,0, 0,25,0 };
GLubyte colorArray[12] = {255,0,0,0, 0,255,0,0, 0,0,255,0};
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatex(0, 0, FixedFromInt(-10));
glRotatex(FixedFromInt(rotation++), 0, ONE,0);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_SHORT, 0, vertexArray);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4,GL_UNSIGNED_BYTE, 0, colorArray);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
eglSwapBuffers(glesDisplay, glesSurface);
}
On your device there is no libgles_cm.dll at the place where your exe is, right?
Otherwise remove it from the directory where your exe is.
edit:
If it still doesn't start you could try to write out some messages during initialization (at the places before returning false).
Do you have libgles_cl.dll? In the code you have thes FixedFrom* calls.
You could try to remove all these calls, i.e. instead of FixedFromInt(i) just i and you'll have to change the x to i,f or d in the calls like Rotatex.
heliosdev said:
On your device there is no libgles_cm.dll at the place where your exe is, right?
Otherwise remove it from the directory where your exe is.
Click to expand...
Click to collapse
I copied the libgles_cm.dll file before from windows folder to Storage Card, where the exe file locates.
now I delete the libgles_cm.dll file , but nothing changes.
heliosdev said:
On your device there is no libgles_cm.dll at the place where your exe is, right?
Otherwise remove it from the directory where your exe is.
edit:
If it still doesn't start you could try to write out some messages during initialization (at the places before returning false).
Do you have libgles_cl.dll? In the code you have thes FixedFrom* calls.
You could try to remove all these calls, i.e. instead of FixedFromInt(i) just i and you'll have to change the x to i,f or d in the calls like Rotatex.
Click to expand...
Click to collapse
thank you again.
I find the error occurs during initialization,
BOOL InitOGLES()
{
EGLConfig configs[10];
EGLint matchingConfigs;
const EGLint configAttribs[] =
{
EGL_RED_SIZE, 5, // i changed it from 8 to 5
EGL_GREEN_SIZE, 6, // i changed it from 8 to 6
EGL_BLUE_SIZE, 5, // i changed it from 8 to 5
EGL_ALPHA_SIZE, EGL_DONT_CARE,
EGL_DEPTH_SIZE, 16,
EGL_STENCIL_SIZE, EGL_DONT_CARE,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_NONE, EGL_NONE
};
hDC = GetWindowDC(hWnd);
glesDisplay = eglGetDisplay((NativeDisplayType)hDC);
if(!eglInitialize(glesDisplay, NULL, NULL))
return FALSE;
if(!eglChooseConfig(glesDisplay, configAttribs, &configs[0], 10, &matchingConfigs))
return FALSE;
if (matchingConfigs < 1) return FALSE;
glesSurface = eglCreateWindowSurface(glesDisplay, configs[0], hWnd, configAttribs);
if(!glesSurface) return FALSE;
Here, it returns
Hy,
maybe this can be a workaround for you!
http://cegcc.sourceforge.net/docs/faq.html#DllDoesNotWorkWithWindowsMobile6.1
------------------
Memory management changes in Windows Mobile 6.1 cause some DLLs not to load. It has been suggested (see this blog that the underlying problem is a writable code section in the DLL, other reports suggest that the DLL size may be an issue.
The workaround or solution (I'm not sure what to call it) that we have is to restrict this DLL to Slot 0 by adding the following registry key:
[HKEY_LOCAL_MACHINE\System\Loader\LoadModuleLow] "MyDll.dll"=dword:1
Obviously you need to change "MyDll" into the name of the DLL that causes the problem.
Please note that using the this approach will force your entire DLL into Slot 0 and, it may prevent other modules from loading in that slot. Therefore, the above registry setting should be used with caution.
------------------
Greatz
mccoffein
mccoffein said:
Hy,
maybe this can be a workaround for you!
http://cegcc.sourceforge.net/docs/faq.html#DllDoesNotWorkWithWindowsMobile6.1
------------------
Memory management changes in Windows Mobile 6.1 cause some DLLs not to load. It has been suggested (see this blog that the underlying problem is a writable code section in the DLL, other reports suggest that the DLL size may be an issue.
The workaround or solution (I'm not sure what to call it) that we have is to restrict this DLL to Slot 0 by adding the following registry key:
[HKEY_LOCAL_MACHINE\System\Loader\LoadModuleLow] "MyDll.dll"=dword:1
Obviously you need to change "MyDll" into the name of the DLL that causes the problem.
Please note that using the this approach will force your entire DLL into Slot 0 and, it may prevent other modules from loading in that slot. Therefore, the above registry setting should be used with caution.
------------------
Greatz
mccoffein
Click to expand...
Click to collapse
thank you, mccoffein. that is a different idea.
But i think registry table is not the issue. Because the app can run on WM6.5 emulator, and heliosdev's OPENGL ES test app can run on my phone also.
I download glBenchmark 1.0 from glbenchmark.com, it can run also.
now I have no idea.
anyone can help me?
Got it
When I put my libgles_cm.dll in the same folder of my App, the App runs.
I think the libgles_cm.dll from HTC has some unknown problems.
Thanks
ak2009 said:
thank you again.
I find the error occurs during initialization,
BOOL InitOGLES()
{
EGLConfig configs[10];
EGLint matchingConfigs;
const EGLint configAttribs[] =
{
EGL_RED_SIZE, 5, // i changed it from 8 to 5
EGL_GREEN_SIZE, 6, // i changed it from 8 to 6
EGL_BLUE_SIZE, 5, // i changed it from 8 to 5
EGL_ALPHA_SIZE, EGL_DONT_CARE,
EGL_DEPTH_SIZE, 16,
EGL_STENCIL_SIZE, EGL_DONT_CARE,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_NONE, EGL_NONE
};
hDC = GetWindowDC(hWnd);
glesDisplay = eglGetDisplay((NativeDisplayType)hDC);
if(!eglInitialize(glesDisplay, NULL, NULL))
return FALSE;
if(!eglChooseConfig(glesDisplay, configAttribs, &configs[0], 10, &matchingConfigs))
return FALSE;
if (matchingConfigs < 1) return FALSE;
glesSurface = eglCreateWindowSurface(glesDisplay, configs[0], hWnd, configAttribs);
if(!glesSurface) return FALSE;
Here, it returns
Click to expand...
Click to collapse
Yes. Because hWnd now is not valid handle. Hands of tutorial programmers is from ass .
Simple, call InitOGLES() after you created window.

Getting serious about root: FIOASYNC bug

Presently we're running a little short on kernel exploits, with the following being the only one that looks remotely plausible:
http://xorl.wordpress.com/2010/01/14/cve-2009-4141-linux-kernel-fasync-locked-file-use-after-free/
Big hold-up? For all that we have a trigger, we don't have an exploit. I believe it's up to us at this point to make that happen.
If I'm reading it right, it looks like the bug initially rears its head right here:
Code:
void __kill_fasync(struct fasync_struct *fa, int sig, int band)
{
while (fa) {
struct fown_struct * fown;
if (fa->magic != FASYNC_MAGIC) {
printk(KERN_ERR "kill_fasync: bad magic number in "
"fasync_struct!\n");
return;
}
[B]fown = &fa->fa_file->f_owner;[/B]
/* Don't send SIGURG to processes which have not set a
queued signum: SIGURG has its own default signalling
mechanism. */
if (!(sig == SIGURG && fown->signum == 0))
send_sigio(fown, fa->fa_fd, band);
fa = fa->fa_next;
}
}
... as fa_file now points to invalid memory (having been free'd earlier). The f_owner member gets shot out to send_sigio, which look like this:
Code:
void send_sigio(struct fown_struct *fown, int fd, int band)
{
struct task_struct *p;
enum pid_type type;
struct pid *pid;
int group = 1;
read_lock(&fown->lock);
type = fown->pid_type;
if (type == PIDTYPE_MAX) {
group = 0;
type = PIDTYPE_PID;
}
[B]pid = fown->pid;[/B]
if (!pid)
goto out_unlock_fown;
read_lock(&tasklist_lock);
do_each_pid_task(pid, type, p) {
send_sigio_to_task(p, fown, fd, band, group);
} while_each_pid_task(pid, type, p);
read_unlock(&tasklist_lock);
out_unlock_fown:
read_unlock(&fown->lock);
}
... in which we see the f_owner member being dereferenced. Also it gets pushed through several other functions which may be exploitable.
There are several questions to be answered before we can start attacking this:
Can we resolve the address of the fa_file data structure so we can overwrite the f_owner value?
Can we do anything with it once we've done that? (Presumably we can set it to zero to cause a null-pointer dereference, but we're mmap_min_addr = 32768 on the most recent versions, so unless we can flag the mmap region to grow down and apply memory pressure to reach page 0 this will do us no good.)
Failing the plan above: are any of the functions that f_owner gets pushed into vulnerable? I evaluated this over the weekend, but without the help of a trained kernel dev I'm not going to get very far.
While I studied a lot of this in uni, I'll admit I'm green when it comes to actually writing these exploits. I'm hoping that this will get the creative juices flowing, and perhaps provide a more comprehensive resource in case any hard-core kernel hackers want to take a look at what we're doing or give us pointers (harhar) in the right direction.
Thanks, guys. Great work up to this point.
In the original POC if you change /bin/true to /system/bin/sh you can get a new shell to open just not as root. So I'm guessing that their needs to be more added to the POC to make it a full exploit.
Right, the fork()'s in the PoC exist only to cause the file descriptor's fasync_struct to be erroneously killed, not start a root session. The root session would need to be started (presumably) by the kernel doing something to our maliciously crafted fown_struct.
The tough part is figuring out exactly where and what that fown_struct needs to be.
Well I definetly agree with you that this seems to be our best best bet I am some what of a newbie when it comes to linux allthough i am learning as i go. Do you know of any good sites to read up on kernel hacking?
Sorry Guys just got the word that this one is dead for us.....
Here is the explantion i got.
some_person said:
Nope, the bug didn't exist in 2.6.27. That's why they say >= 2.6.28 are vulnerable.
As far as how the bug works, there are 2 other issues. 1) our kernel probably wasn't compiled with AT_RANDOM 2) we don't have an elf executable.
The exploit you found does not give us root access, it crashes the system. Basically, you open the "random number generator" file, lock it, and close it... but the lock release when you close it. Then you have to call an elf executable because that generates a random number (running an elf executable) provided the kernel was compiled AT_RANDOM. you continue to call that executable (and generating random numbers) until the the lock is released on the "random number generator" file... then it's your program's turn... the kernel tries to send your program notification that the file is available, but your program has moved on. BLAM the kernel stops (or "oops").
Click to expand...
Click to collapse
Sorry to dredge up an old thread:
This exploit *will* work. According to Zanfur, the hole is in our kernel. We need to use it without AT_RANDOM (which I dont know how to do).
http://sourceware.org/ml/libc-alpha/2008-10/msg00016.html
I am pretty sure we do have elf executables, here is proof:
% file m6
m6: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
If our kernel is susceptible to this bug then it should work, as long as there is a way to do it without at random.
Though I do not in any way represent my self as a hacker or developer I was wondering if I could throw in my 2 cents. I notice that this bug/exploit won't work because it requires AT RANDOM. I was wondering if it s possible to write code that does what the function does and insert it in. Is root required to do this (i.e. insert code into the kernel that wasn't there before) or is this a matter of know-how? Just some brainstorming I thought that I would throw in.
jballz0682 said:
Though I do not in any way represent my self as a hacker or developer I was wondering if I could throw in my 2 cents. I notice that this bug/exploit won't work because it requires AT RANDOM. I was wondering if it s possible to write code that does what the function does and insert it in. Is root required to do this (i.e. insert code into the kernel that wasn't there before) or is this a matter of know-how? Just some brainstorming I thought that I would throw in.
Click to expand...
Click to collapse
This won't get us root. Even zanfur said it. Moving on....
Framework43 said:
This won't get us root. Even zanfur said it. Moving on....
Click to expand...
Click to collapse
To clarify, even if we get AT_RANDOM functionality working, we can't use this to exploit our kernel. All we can do with this is get data from a file that was recently closed. The point of this exploit is to send a signal to a process, but there are no processes we could send a signal to that would give us root.
Our kernel seems practically invulnerable, it appears that almost all exploits are patched

How to search StorageFiles

I need a way to search in StorageFiles with dynamically pattern, which comes from a TextBox. The directive "Windows.Storage.Search" doesnt exist in windows phone 8.1 runtime, as i saw. Now my question is, how can i do this in alternative way?
The only way to do it with WP 8.1 since Microsoft ALWAYS fails to implement the important things are to query using LINQ.
Ex:
Code:
var result = (await Windows.Storage.ApplicationData.Current.LocalFolder.GetFilesAsync(Windows.Storage.Search.CommonFileQuery.OrderByName)).
Where(x => x.Name.
Contains(x => txtBox.Text));
That's about all you can do pretty much. (Thanks Microsoft).
Thank you for the example. But it wont work for me, it shows me the following error(s):
Code:
A local variable named 'x' cannot be declared in this scope because it would give a different meaning to 'x', which is already used in a 'parent or current' scope to denote something else
and
Code:
Cannot convert lambda expression to type 'string' because it is not a delegate type
Thats really odd from Microsoft, that they havent implementet the search function like in WinRT (Windows Store App).
The first error is pretty simple. You already have the variable named "x" and it would be very bad if compiler didn't give you that error.
Change the name of the variable to something else that you don't use in that scope and it will work.
And for second problem, try this one:
Code:
private List<string> Result()
{
var result = ((List<Windows.Storage.Search.CommonFileQuery>)Windows.Storage.ApplicationData.Current.LocalFolder.GetFilesAsync(Windows.Storage.Search.CommonFileQuery.OrderByName)).Where(x => x.ToString().Contains(txtBox.Text));
return result as List<string>;
}
private async Task<List<string>> ResultAsync()
{
return await Task.Run(() => Result()).ConfigureAwait(continueOnCapturedContext: false);
}
You should call ResultAsync method and get the result in this way:
Code:
List<string> myList = ResultAsync().Result;
That's not going to work. You can't cast a StorageFile as a string.
To fix my code (simple lambda typo)
Code:
var result = (await Windows.Storage.ApplicationData.Current.LocalFolder.GetFilesAsync(Windows.Storage.Search.CommonFileQuery.OrderByName)).
Where(x => x.Name.
Contains(txtBox.Text));
if(result.Any())
{
// Do shtuff
}
Also, you should never access the .Result of an async task because you never know if it completed yet.
Ok, first error is done, but the second error is still here
Code:
Cannot convert lambda expression to type 'string' because it is not a delegate type
You are missing the point of the TAP (Task Async Pattern).
Both main thread and async method will be in execution in the same time. When the async method finish his work, main thread will stop and catch the result trough the Result property.
TAP is the recommended way of asynchronous programming in C#. The only thing with TAP is to use ConfigureAwait method in non-console type of apps to avoid deadlock.
Sooner or later you will get the result from TAP method. Nothing will get in the conflict with the main thread.
Oh wait, @andy123456 I updated my response. I forgot String.Contains ISNT a lambda .
@Tonchi91, I know all about the TAP. I've been using it since it was CTP. I've seen the awkward situations with threading in WP .
Now... if he did
Code:
List<string> myList;
ResultAsync().ContinueWith(t=> { myList = t.Result; });
I wouldn't be worried .
Ok the errors are gone, but the debugger show me the following exception:
Code:
Value does not fall within the expected range
Is this search method case-sensitive? I tried with an exact input in the TextBox.
Hmmm. Let's see your full code.
its actually only for testing, so i added your code to a button (asnyc) and will show the output in a textBlock.
Code:
private async void buttonTest_Click(object sender, RoutedEventArgs e)
{
//Result();
var result = (await Windows.Storage.KnownFolders.CameraRoll.GetFilesAsync(Windows.Storage.Search.CommonFileQuery.OrderByName)).
Where(x => x.Name.
Contains(textBox_test.Text));
if (result.Any())
{
// Do shtuff
textBlock_test.Text = result.ToString();
}
}
The error is coming from here
Code:
var result = (await Windows.Storage.KnownFolders.CameraRoll.GetFilesAsync(Windows.Storage.Search.CommonFileQuery.OrderByName))
andy123456 said:
its actually only for testing, so i added your code to a button (asnyc) and will show the output in a textBlock.
Code:
private async void buttonTest_Click(object sender, RoutedEventArgs e)
{
//Result();
var result = (await Windows.Storage.KnownFolders.CameraRoll.GetFilesAsync(Windows.Storage.Search.CommonFileQuery.OrderByName)).
Where(x => x.Name.
Contains(textBox_test.Text));
if (result.Any())
{
// Do shtuff
textBlock_test.Text = result.ToString();
}
}
The error is coming from here
Code:
var result = (await Windows.Storage.KnownFolders.CameraRoll.GetFilesAsync(Windows.Storage.Search.CommonFileQuery.OrderByName))
Click to expand...
Click to collapse
Oh Camera Roll.. You MIGHT need to have the capability to view the camera roll enabled. I forget what it's called, but you need a specific cap in order to view from there. Also, I would try to see if you can use a generic folder instead.
I would try Windows.Storage.ApplicationData.Current.LocalFolder.GetFilesAsync() as your method after the await just to test whether you can read correctly.
Yes but in wp8.1 runtime app, there arent caps anymore. The capability for access to the pictures is simply calles pictures library and is enabled. I have tested it as you said, but it gives me the same exception.
A quick tip: another way to do this is to use the Win32 C runtime API. You can, for example, use the FindFirst/NextFile functions (http://msdn.microsoft.com/en-us/library/windows/desktop/aa364418(v=vs.85).aspx) which support searches using wildcards (* and ? characters in the first parameter). These functions are wrapped in my NativeLibraries classes, but are also just publicly available for third0party developers to call from their own C++ DLLs.
Alternatively, you can use the .NET System.IO.Directory class, which has functions like EnumerateFiles(String path, String searchPattern). This is probably the better way to do it, actually.
Of course, if you want these operations to not block the current thread, you'll need to explicitly put them in their own thread or async function.
EDIT: This also assumes you have read access to the relevant directories. You application data directory works fine, for example (you can get its path from the relevant StorageFolder object). Other directories that can be accessed via WinRT functions may go through a broker function instead of being directly readable.
The point is, that i have an array with filenames. Now i need the StorageFile files which contains these filenames. My idea was to search for these files and return the files as StorageFile, so i can work with these. Or is there a simpler / another way?
http://msicc.net/?p=4182 <-- try this
Thank you, i have already done this and its working. But how can i compare the Files to read, with already read files and take only the not yet read files?

Categories

Resources