Securing SQL 2000 with IPsec and Group Policy

Friday, 19 August 2005

Here are links to resources mentioned in my presentation to the Adelaide SQL Server User Group (18th August).

Getting the name of a Windows Control Panel Applet

Wednesday, 17 August 2005

I’ve been working on a program that needs to enumerate all the Control Panel applets in Windows, and ideally get the proper display name (rather than the .cpl filename). You can do this for a specific applet by using the DllImport Attribute to access the CPlApplet function that every applet implements:

<DllImport("timedate.cpl", CharSet:=CharSet.Unicode)> \_
Private Function CPlApplet(ByVal hwnd As IntPtr, ByVal uMsg As Integer, ByVal lParam1 As Integer, ByVal lparam2 As IntPtr) As Integer
End Function

My problem is that I needed to call this function for all applets (including non-Microsoft ones). .NET allows you to do dynamic P/Invoke code, but the only post I found in Google was from someone who was unable to get it to work. After using ildasm.exe to study what IL was generated by the static version, I noticed that the once major difference was that the dynamic version lacked the “preservesig” statement. The way to add this in is to use a custom attribute - you can’t do it via a parameter for any of the methods. The final version in VB.NET is based on the sample code from

Imports System
Imports System.Runtime.InteropServices
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Runtime.CompilerServices

Module Module1
  Public Function DynamicDllFunctionInvoke(ByVal DllPath As String, ByVal EntryPoint As String, ByVal message As Int32) As Object
  Dim returnType As Type = GetType(Int32)
  Dim parameterTypes As Type() = {GetType(IntPtr), GetType(Int32), GetType(Int32), GetType(IntPtr)}
  Dim parameterValues As Object() = {IntPtr.Zero, message, 0, IntPtr.Zero}
  Dim asmName As AssemblyName = New AssemblyName asmName.Name = "tempDll"
  Dim dynamicAsm As AssemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave)

  Dim dynamicMod As ModuleBuilder = dynamicAsm.DefineDynamicModule("tempModule") ', "tempModule.dll", True)
  Dim dynamicMethod As MethodBuilder = dynamicMod.DefinePInvokeMethod(EntryPoint, DllPath, MethodAttributes.Static Or MethodAttributes.Public Or MethodAttributes.PinvokeImpl, CallingConventions.Standard, returnType, parameterTypes, CallingConvention.Winapi, CharSet.Auto)
  Dim myAttributeType As Type = GetType(MethodImplAttribute)
  Dim myConstructorInfo As ConstructorInfo = myAttributeType.GetConstructor(New Type(0) \_
  Dim myAttributeBuilder As New CustomAttributeBuilder(myConstructorInfo, \_ New Object(0) {MethodImplOptions.PreserveSig}) dynamicMethod.SetCustomAttribute(myAttributeBuilder) dynamicMod.CreateGlobalFunctions()
  Dim mi As MethodInfo = dynamicMod.GetMethod(EntryPoint)
  Dim retval As Object = mi.Invoke(Nothing, parameterValues)
  Return retval
  End Function

  Sub Main()
    DynamicDllFunctionInvoke("c:\\WINDOWS\\system32\\timedate.cpl", "CPlApplet", 1) DynamicDllFunctionInvoke("c:\\WINDOWS\\system32\\timedate.cpl", "CPlApplet", 2)
  End Sub
End Module

Rellie's raison d’être

Monday, 15 August 2005

Rellie’s raison d’être Narelle has started her own blog! Project Info - NUnitAsp Code Generator

Thursday, 11 August 2005 Project Info - NUnitAsp Code Generator: “A tool to generate source code test classes for NUnitAsp from web pages (via a URL) or by analysing .aspx pages” The source code is now in its own SF project!

NUnitAsp Code Generation

Monday, 8 August 2005

Last Thursday I was out visiting the e-business team at Mawson Lakes campus. I was showing them how to use NUnit and NUnitAsp for automated unit testing. As I was setting up a test for NUnitAsp, I noticed how repetitive it was to:

  1. Browse the web page
  2. Find the control
  3. View the source to see the control’s id.
  4. Add a variable declaration to the test class.
  5. Add a variable assignment/initialise to the SetUp method for the variable
  6. Back to step 2

I wondered if this could be automated a bit to make it quicker to set up the test classes for NUnitAsp. Not wanting to reinvent the wheel, I joined the developer list for NUnitAsp, and asked the other subscribers if anyone had done this before. No one said they had, but a couple replied saying they’d be interested in the results. So I whipped up a first-effort that you can download here. It still needs a bit of cleaning up, and I’m thinking it might be useful to make it work as a Visual Studio AddIn too, but it does work ok.