Note: You’ll be glad to know that this issue is completely salvageable. Many forums suggest that a format & reinstall is the only solution… How wrong they are. :)
My God this has been driving me insane. I’ve had a few viruses in my time, but none as annoying as this. And yes… this is a virus. I’ve read speculations that it’s caused by Windows Update, and I believed this in the beginning. However, a virus scan, specifically TDSSKiller (details further down), resolved the issue.
Right. Yesterday, my laptop just shut down for no reason. When I came to boot it back up, it went straight to startup repair, hung there for about 20-30 minutes and finally reported Boot Critical File C:\CI.dll is Corrupt… and startup repair was unable to repair it. (You know, that thing that startup repair should be able to do).
This was driving me around the bend. I couldn’t even boot to safe mode. In the end, I loaded up my Linux partition and started doing a bit of research.
Here’s the geeky bit.If you’re just interested in fixing it, scroll past the next paragraph.
So it turns out that CI stands for Code Integrity. In layman’s terms, it’s a security layer that verifies that your programs have come from legitimate sources. The virus in question happened to target that security layer, which just so happens to load every time you try to boot… even in safe mode. You see the predicament?
Anyway, initially we just need to bypass it and get back into the system before we can fix it. To get past it, turn on your computer and bash the F8 key until you get to the Advanced Boot Menu, which should look something like this:
The one we want is the second option from bottom: Disable Driver Signature Enforcement.
This should get you booted up into your system. Note that you still can’t boot normally at this point.
After much more digging, I found that the malware belongs in a family called Rootkit.Win32.TDSS. Fortunately, Kaspersky have made a handy little free tool to remove TDSS called TDSSKiller. I know… catchy, right? And believe me, after the time I spent trying to figure this one out, I wanted nothing more than to kill it… with fire. But then I’d probably have to buy a new laptop, and that would suck.
Well, that’s pretty much the long and short of it. Once you’ve run the tool, it’ll detect the malware and remove it automatically. Afterwards, you can reboot your system normally.
Peace in the universe is once again restored.
And, because I’m an all-round top bloke, I’ve taken the liberty to mirror the download, in case the download link above is ever broken for any reason. Download TDSSKiller.
The theme itself requires a bit of effort, albeit very little. The instructions are included within the download but primarily, it comes down to taking ownership of files. I’m too lazy to explain it, but the link will tell you how to do it.
Essentially, this post is just me taking a quick time out from coding the new version of ohai! (which is actually coming along very nicely) to show off my desktop. So here it is!
So, on returning to my blog, I’ve decided to return to ohai!, too. It’s been a year since the initial release, with a total of 333 users so far, and between them sharing over 750 links and profiles!
Many of you know that it was my first web project, and as a result, the code is a total mess. I’ll admit there are bugs, which I plan to iron out in the new version, as well as introducing a whole bunch of features, including a very simple API for displaying your contact details anywhere — contact pages on blogs, and even in forum signatures.
Stay tuned folks, it’s about time I started using the internet again, for more than just looking at funny pictures. Though the occasional funny picture is what makes the internet worth browsing.
So, I started this bloody ages ago and it kinda sorta got abandoned. :( BUT NOW IT’S BACK! And better than ever, with a plugin system which I just blogged about. :)
Unfortunately, it is still windows only. I will build it for Linux some day, I promise!
You can check it out here, I’m rather pleased with it so far, even if the development is really really slow.
[Apologies if the entry is a little unclear, I just threw this together in about 10 minutes, I wanna get it out there... it's fucking hard to find any sort of information when it comes to this at the moment]
Quick entry, gonna turn this into a tutorial soon. The code is a bit of a mess, since I was just throwing stuff together while I was figuring this out. I’ll tidy it up when it’s tutorial tiems.
Basically, I recently developed a [url=http://snip.gd/plugins.php]plugin system[/url] for my [url=http://snip.gd/]snippet manager[/url]. The way it works is simple: It loads symbols from a DLL into the application, which can be called from a dynamically created menu. First off, the main code [this is the messy bit for the time being]
This code opens a subdirectory within the working directory called “plugins”, and grabs all the DLLs from them. If the DLL contains a symbol called SnippetManagerPluginMain (the only required symbol for the plugins, I kept them simple) it will add it to the menu.
Additionally, it also checks for two optional optional symbols, which are pretty cool. They simply return strings, which assign the name and the keyboard shortcut for the plugin. If neither is set, it has no keyboard shortcut, and the name defaults to the name of the DLL file.
In order to bind the events to the menu, the ::Connect method is called. This is an alternative to using EVENT_TABLE, and allows events to be allocated dynamically at runtime. wxID_PLUGIN is a custom variable, and basically, any of the menu items within the menu will call the main frame’s [il]handle_plugin[/il] method. The important part, however, is the fact that each one has a different ID, even though they use the same method.
The method itself then uses the ID of the event calling it to lookup the DLL’s symbol, which were added in this->plugins.
Of course, some of the code here doesn’t really mean jack all, since there are custom methods and stuff used in it. But the base of it is clear. I’ll try to write another (small) application and a tutorial covering the steps over the weekend.
So, I’ve spent the last three days working on a site. Three days of hard work has gone into it, and it’s ready for release.
It’s a social portal. You can add links to all your profiles on social sites such as facebook, twitter and the like, as well as adding links to your blog(s), or even just your favourite sites. Your profile is customisable, you can change all the colouring, add a profile picture, add a background picture, etc. There’s more customisation to come in the near future, but as the weekend draws to a close, I’ve gotten the core of the site up and running, ready to be released. There are a few profiles up and running smoothly already, please feel free to create your own. :)
I had to post this, it’s awesome. The video explains it much better than I can, but it’s basically a new input system, developed to not require interfaces. Instead, it uses electromyography (EMG) sensors to translate muscle signals from the skin’s surface. The project is a joint collaboration between Microsoft, the University of Washington in Seattle, and the University of Toronto in Canada.
The video shows a guy playing Guitar Hero with nothing more than an air guitar. (I’m sure there are dozens of amusing air guitar videos I could link to here, but I only ever find the idiots who take it seriously. Feel free to post a funny in the comments)
Two for one in this tutorial. We're going to create a thread using wxWidgets, and make it monitor the clipboard for text. Then, if we detect a change, we're going to add the new contents to a list.
It's a relatively simple process, but unfortunately wxWidgets isn't the most documented GUI toolkit out there.
So, let's get started. I'm gonna pile all the code into a single file instead of breaking my classes up into seperate files, just for ease of navigation in this tutorial. The code is relatively short anyway, with only 62 lines.
First off, as with any other program, we're going to want to get our includes done. We'll be needing three: The standard wx header, the clipboard header, and the thread header.
#include <wx/wx.h> // standard wx header#include <wx/clipbrd.h> // clipboard - we'll monitor the clipboard for text#include <wx/thread.h> // include threads!
The next thing we need to do is declare our ClipLogger class - this will inherit wxThread, and have two variables: One to hold the most recent text that we got from the clipboard, and one which is a pointer to a wxListBox object -- the object on the main window which we'll be updating.
class ClipLogger :public wxThread {public:
ClipLogger(wxListBox*);private:void* Entry();// the entry point to the thread
wxString LatestText;// store the last text so we can check for changes
wxListBox* list;// the list to update on a text change};
The constructor is very simple. All it does is take a wxListBox*, and assign it to a variable stored by the class - this is the list that we want to update on clipboard text changes.
Next up is the main part of this tutorial. When we create a thread, we need to override the Entry() method of the class, like so:
void* ClipLogger::Entry(){
To save time and memory, rather than creating a variable every time we loop, we'll create it before and simply overwrite it inside the loop.
wxTextDataObject temp;
wxTextDataObject is the type of object that the clipboard will store.
Next, since our thread is a constant "monitor" for the clipboard, we want it to loop.
while(true){
Then, we need to think about how we can help our application not be CPU-hungry. The simple solution is to make the thread sleep each time it loops. We can do this with wxSleep(int time), where time is the length of time to sleep in seconds.
wxSleep(1);
The rest of the loop is the clipboard. It's very simple, so rather than break it up line-by-line, I've added comments along the way. We basically need to do the following:
- Open the clipboard
- If the clipboard is text, get it into our temp variable
- Update the list and remember this is the most recent (so as not to constantly add the same data to the list)
- Close the clipboard
if(wxTheClipboard->Open()){// try to open the clipboardif(wxTheClipboard->IsSupported(wxDF_TEXT)){// if the clipboard contains text
wxTheClipboard->GetData(temp);// get the data from the clipboardif(this->LatestText != temp.GetText()){// if it's changed, we want to updateif(temp.GetText()!= wxT("")){// if it's not an empty string
this->LatestText = temp.GetText();// update the "LatestText"
this->list->Append(temp.GetText());// append to the list}}}}
wxTheClipboard->Close();// close the clipboard
The last thing left to do in the thread is simply close it off, and close off the loop.
}}
Simple, huh? :)
And that's our thread defined. Now all we need to do is create the app itself, which is a simple process. I hope that you already know how to do it, so we can blitz through the majority of it.
Create the app:
class threaded_app :public wxApp {public:bool OnInit(void);};
The beginning of the OnInit() should be nothing new at this point either.
bool threaded_app::OnInit(void){// quickly create a wxFrame to display a window
wxFrame* f =new wxFrame(NULL, wxID_ANY, wxT("Threaded App!"));// add a list to the frame we created
wxListBox* list =new wxListBox(f, wxID_ANY);// display the frame
f->Show(true);
The last part of OnInit() that we need to do is actually create an instance of our thread and run it, like so:
// pass the list to the clipboard monitor so it knows what to update
ClipLogger* cl =new ClipLogger(list);// construct our thread
cl->Create();// we have to create a thread before we can run it
cl->Run();// run our thread
And we can simply finish off the OnInit() and IMPLEMENT_APP:
returntrue;}
IMPLEMENT_APP(threaded_app)
And that's all there is to threading and using the clipboard in wxWidgets!
Here's the complete code:
#include <wx/wx.h> // standard wx header#include <wx/clipbrd.h> // clipboard - we'll monitor the clipboard for text#include <wx/thread.h> // include threads!class ClipLogger :public wxThread {public:
ClipLogger(wxListBox*);private:void* Entry();// the entry point to the thread
wxString LatestText;// store the last text so we can check for changes
wxListBox* list;// the list to update on a text change};
ClipLogger::ClipLogger(wxListBox* l){
this->list = l;}void* ClipLogger::Entry(){
wxTextDataObject temp;// create a "wxTextDataObject" to get the info from the clipboardwhile(true){// our thread will loop
wxSleep(1);// sleep for 1 second, make the thread less cpu-hungryif(wxTheClipboard->Open()){// try to open the clipboardif(wxTheClipboard->IsSupported(wxDF_TEXT)){// if the clipboard contains text
wxTheClipboard->GetData(temp);// get the data from the clipboardif(this->LatestText != temp.GetText()){// if it's changed, we want to updateif(temp.GetText()!= wxT("")){// if it's not an empty string
this->LatestText = temp.GetText();// update the "LatestText"
this->list->Append(temp.GetText());// append to the list}}}}
wxTheClipboard->Close();// close the clipboard}}class threaded_app :public wxApp {public:bool OnInit(void);};bool threaded_app::OnInit(void){// quickly create a wxFrame to display a window
wxFrame* f =new wxFrame(NULL, wxID_ANY, wxT("Threaded App!"));// add a list to the frame we created
wxListBox* list =new wxListBox(f, wxID_ANY);// display the frame
f->Show(true);// pass the list to the clipboard monitor so it knows what to update
ClipLogger* cl =new ClipLogger(list);// construct our thread
cl->Create();// we have to create a thread before we can run it
cl->Run();// run our threadreturntrue;}
IMPLEMENT_APP(threaded_app)
I certainly less than three google chrome, and today it proved just how great it is – even though it doesn’t know which plugin is unresponsive, it knows which one to kill!