AppStream from Amazon is service that allows to have Remote Desktop Session in your browser. Our company is using it to do evaluation of our software for potential customers. Customers can play with, explore it features etc, before buy. On other side, we can see what people are struggling it and adjust our software.

We were using it for some time, but recent Chrome update broke it. Safari stopped working some time before that. Now instead of opening remote session, we got 404 from Amazon. I believe it happens because Chrome stopped providing cooking for embedded iframe. And following post will show, how to fix it.

Normally service works like this. Web page calls some service on backend to get

Some time ago, Internet Explorer (IE for short) won over Netscape Navigator. As result there was quite interesting situation: there were quite few areas were IE did not respect standards at all or did not respect them completely. And when new browsers (Firefox and Opera) tried to gain some popularity, they immediately did hit hard concrete wall with their head: web sites do not work properly in new browsers. This happened mainly because other browsers actually did try to follow standards, but most web sites were designed for Internet Explorer that does not respect standards.

During that phase, most web site designers said pretty much that: “everybody uses IE, why should I care about browser that has 1%-2% of marker

  •   Posted in:
  • .NET

I was investigating some dead lock that happens in our application. Here is call stack of main thread:

ntdll!NtWaitForSingleObject+0x14
KERNELBASE!WaitForSingleObjectEx+0x93
clr!CLREventWaitHelper2+0x3c
clr!CLREventWaitHelper+0x1f
clr!CLREventBase::WaitEx+0x71
clr!WKS::GCHeap::WaitUntilGCComplete+0x2e
clr!Thread::RareDisablePreemptiveGC+0x18f
clr!StubRareDisableHRWorker+0x38
clr!COMToCLRWorker+0x19d612
clr!GenericComCallStub+0x57
SomeDll!SomeFunction+0x62
ntdll!LdrpCallInitRoutine+0x6f
ntdll!LdrpInitializeNode+0x1c1
ntdll!LdrpInitializeGraphRecurse+0x80
ntdll!LdrpPrepareModuleForExecution+0xc5
ntdll!LdrpLoadDllInternal+0x199
ntdll!LdrpLoadDll+0xa8
ntdll!LdrLoadDll+0xe4
hmpalert!CVCCP+0x67eb
KERNELBASE!LoadLibraryExW+0x161
KERNELBASE!LoadLibraryExA+0x31
KERNELBASE!LoadLibraryA+0x3f
0x00007ffa`0fec9ece
...
clr!ExecuteEXE+0x3f
clr!_CorExeMainInternal+0xb2
clr!CorExeMain+0x14
mscoreei!CorExeMain+0x112
mscoree!CorExeMain_Exported+0x6c
kernel32!BaseThreadInitThunk+0x14
ntdll!RtlUserThreadStart+0x21

Ok, it looks like main thread is waiting for GC to finish. But what is GC doing? And it looks GC related code is here:

ntdll!NtWaitForSingleObject+0x14
KERNELBASE!WaitForSingleObjectEx+0x93
clr!CLREventWaitHelper2+0x3c
clr!CLREventWaitHelper+0x1f
clr!CLREventBase::WaitEx+0x71
clr!`anonymous namespace'::CreateSuspendableThread+0x10c
clr!GCToEEInterface::CreateThread+0x170
clr!WKS::gc_heap::prepare_bgc_thread+0x4c
clr!WKS::gc_heap::garbage_collect+0x1836b7
clr!WKS::GCHeap::GarbageCollectGeneration+0xef
clr!WKS::GCHeap::Alloc+0x29c
clr!JIT_New+0x339
...
mscorlib_ni!System.Threading.Tasks.Task.Execute()$##6003FAD+0x47
mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)$##6003AEF+0x172
mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)$##6003AEE+0x15
mscorlib_ni!System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef)$##6003FBA+0x231
mscorlib_ni!System.Threading.Tasks.Task.ExecuteEntry(Boolean)$##6003FB9+0xa1
mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)$##6003AEF+0x172
mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)$##6003AEE+0x15
mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)$##6003AED+0x55
mscorlib_ni!System.Threading.ThreadHelper.ThreadStart(System.Object)$##6003BFF+0x60
clr!Thread::intermediateThreadProc+0x8b
kernel32!BaseThreadInitThunk+0x14
ntdll!RtlUserThreadStart+0x21

All other

I am working in software company and many sometimes we have some enterprise level companies as our clients. And sometimes we have problems with our software with some of these clients. Sometimes it is legitimate bug on our side. But very often there is conflict security software. And sometimes it is so painful to deal with, that I decided to write about.

Let say I bought and installed some software on my home computer. And then I found that it does not work. I contacted support and they asked me to temporary remove my security software to check that there is no interference with their software. I can do it and we quickly can confirm whether this was a problem.

When I am working with WinDbg and .NET I usually using following command to load .NET support Dll into WinDbg:
.cordll -ve -u -l

But in case of .NET Core it does not work. It took me quite some time to figure out what to do. Firstly, install dotnet-sos tool into dotnet:
dotnet tool install -g dotnet-sos

Then activate dotnet-sos tool by execution this command:
dotnet-sos install

And this will copy support dll to C:\Users\<username>\.dotnet\sos\sos.dll, where <username> is your username on this computer. These two commands you need to execute only once per .NET Core version or after tool is updated.

And lastly to load this dll into WinDbg, execute this

How to get to Exception object in .NET when native code calls it

Few day ago, I did investigate crash dump where .NET code raised some exception. Some .NET code called from native host using COM interface. .NET wraps such calls in try catch and return proper HRESULT to caller in native code in case of exception. In my case that .NET method failed and return failed HRESULT. Then due to unforeseen design issues, native code crashed and as result Windows created crash dump and terminated process.

Normally in most native languages when exception is raised, exception object of some kind is created and when exception handled somewhere, this object is destroyed and after that there is no way to

As I mentioned before here, my relative asked me to help him with upgrading his PC. After some thinking I decided to go with Gigabyte B550 Aorus Pro AC. My relative already had good Wi-Fi USB dongle from Amazon: https://www.amazon.com/gp/product/B07S8Q18JP and it works really well. As result, I was planning to buy Gigabyte B550 Aorus Pro, but unfortunately everything was out of stock except version with Wi-Fi.

I will repeat short reasons why I decided to go with this motherboard:

From Hardware Unboxed I found this memory: https://www.amazon.com/gp/product/B07WNQQ7DM. After

Many people who are following hardware news know that AMD released B550 chipset and it is finally possible to buy B550 motherboard. And it happens to be a time when one of my relative asked me to update his system. It is quite old system based on Intel 2500K. It is 4 threads CPU and about 9 years old. It also has 8GB of RAM.

Most of the use for that computer is games and to my surprise most games work quite well on that system. But recently one game constantly uses 100% CPU and it also allocates more than 9 Gb of RAM and it makes playing experience quite uncomfortable. And as result he asked me to help

Sometime ago, my relative asked me what it is possible to do with her notebook to make it faster. This notebook was relatively old as it is about 5 years old and my first reaction was to say: “buy new one” but I am trying to be professional, so I decided to check it first. Even notebook was old, it was not bad. It has 4K monitor, secondary graphics card and relatively fast CPU. So, I asked what exactly a problem is. And after short discussion I realized that there are small operations that takes time, like opening new tab in the browser, opening some project file etc. Also, starting it will take quite some time and in general feels